deb: retrieve only the artifacts produced by the build, not globbed files
build_binary_package_impl copied the whole parent directory into the build root (ensure_available) and then retrieved every *.deb / *.changes / *.buildinfo it found there. That surfaced stale files already sitting next to the package tree in the "Built in Ns:" summary. Now local::build returns the exact set of artifacts produced by this build — the binary packages registered in debian/files plus the generated .buildinfo/.changes from generate_binary_metadata — and build_binary_package_impl retrieves that list instead of globbing the build root. Only files genuinely produced by the current build are printed.
This commit is contained in:
+19
-23
@@ -17,10 +17,13 @@ pub enum BuildMode {
|
||||
|
||||
/// Build package in 'cwd' to a .deb
|
||||
///
|
||||
/// Returns the list of produced .deb files retrieved locally. When `ui` is
|
||||
/// Returns the list of produced artifacts (.deb files plus the upload
|
||||
/// metadata `.buildinfo`/`.changes`) retrieved locally, identified from
|
||||
/// `debian/files` and the native metadata generation rather than by
|
||||
/// globbing the build root (which would surface stale files). When `ui` is
|
||||
/// set, a live view (status bar + rolling log pane) is displayed and all
|
||||
/// subprocess output is captured through it; on failure the widget is cleared
|
||||
/// and a summary of captured errors is printed.
|
||||
/// subprocess output is captured through it; on failure the widget is
|
||||
/// cleared and a summary of captured errors is printed.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub async fn build_binary_package(
|
||||
arch: Option<&str>,
|
||||
@@ -148,8 +151,11 @@ async fn build_binary_package_impl(
|
||||
.ok_or("Cannot find parent directory name")?;
|
||||
let build_root = format!("{}/{}", build_root, parent_dir_name.to_str().unwrap());
|
||||
|
||||
// Run the build using target build mode
|
||||
match mode {
|
||||
// Run the build using target build mode. It returns the exact set of
|
||||
// artifacts produced by this build (binary packages registered in
|
||||
// debian/files plus the generated .buildinfo/.changes), as paths
|
||||
// inside the build context.
|
||||
let remote_files: Vec<PathBuf> = match mode {
|
||||
BuildMode::Local => {
|
||||
local::build(
|
||||
&package,
|
||||
@@ -167,30 +173,20 @@ async fn build_binary_package_impl(
|
||||
)
|
||||
.await?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Retrieve produced artifacts (.deb files plus the upload metadata
|
||||
// (.buildinfo/.changes) generated natively after the build)
|
||||
// Retrieve the produced artifacts (binary packages plus the upload
|
||||
// metadata) to the parent directory.
|
||||
if let Some(u) = ui {
|
||||
u.phase(Phase::RetrievingArtifacts);
|
||||
}
|
||||
let remote_files = build_ctx.list_files(Path::new(&build_root))?;
|
||||
let deb_files: Vec<PathBuf> = remote_files
|
||||
.into_iter()
|
||||
.filter(|f| {
|
||||
f.extension().is_some_and(|ext| {
|
||||
matches!(
|
||||
ext.to_str(),
|
||||
Some("deb") | Some("buildinfo") | Some("changes")
|
||||
)
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
let total_debs = deb_files.len();
|
||||
let total_debs = remote_files.len();
|
||||
|
||||
let mut artifacts = Vec::with_capacity(total_debs);
|
||||
for (idx, remote_file) in deb_files.iter().enumerate() {
|
||||
let file_name = remote_file.file_name().ok_or("Invalid remote filename")?;
|
||||
for (idx, remote_file) in remote_files.iter().enumerate() {
|
||||
let file_name = remote_file
|
||||
.file_name()
|
||||
.ok_or("Invalid remote filename")?;
|
||||
let local_dest = parent_dir.join(file_name);
|
||||
build_ctx.retrieve_path(remote_file, &local_dest)?;
|
||||
artifacts.push(local_dest);
|
||||
|
||||
Reference in New Issue
Block a user