Skip to content

Commit b8dc393

Browse files
committed
fix(package): exclude target dir from backups with CACHEDIR.TAG
Create CACHEDIR.TAG files in build directories during `cargo package` to exclude them from system backups. This ensures that temporary packaging artifacts in target/package are not unnecessarily included by backup tools like Time Machine on macOS. The fix calls `create_dir_all_excluded_from_backups_atomic` when creating the build directory and target directory for packaging, which automatically creates the CACHEDIR.TAG file. Update existing tests to verify that CACHEDIR.TAG files are now created in the expected locations. Fixes #16238
1 parent 22bb62d commit b8dc393

File tree

4 files changed

+11
-4
lines changed

4 files changed

+11
-4
lines changed

src/cargo/ops/cargo_package/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ fn create_package(
161161
}
162162

163163
let filename = pkg.package_id().tarball_name();
164-
let dir = ws.build_dir().join("package");
164+
let build_dir = ws.build_dir();
165+
paths::create_dir_all_excluded_from_backups_atomic(build_dir.as_path_unlocked())?;
166+
let dir = build_dir.join("package");
165167
let mut dst = {
166168
let tmp = format!(".{}", filename);
167169
dir.open_rw_exclusive_create(&tmp, gctx, "package scratch space")?
@@ -225,6 +227,7 @@ pub fn package(ws: &Workspace<'_>, opts: &PackageOpts<'_>) -> CargoResult<Vec<Fi
225227
result.extend(packaged.into_iter().map(|(_, _, src)| src));
226228
} else {
227229
// Uplifting artifacts
230+
paths::create_dir_all_excluded_from_backups_atomic(target_dir.as_path_unlocked())?;
228231
let artifact_dir = target_dir.join("package");
229232
for (pkg, _, src) in packaged {
230233
let filename = pkg.package_id().tarball_name();

tests/testsuite/build_dir.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,13 +525,15 @@ fn cargo_package_should_build_in_build_dir_and_output_to_target_dir() {
525525
[ROOT]/foo/build-dir/package/foo-0.0.1/Cargo.toml.orig
526526
[ROOT]/foo/build-dir/package/foo-0.0.1/src/main.rs
527527
[ROOT]/foo/build-dir/package/foo-0.0.1.crate
528+
[ROOT]/foo/build-dir/CACHEDIR.TAG
528529
529530
"#]]);
530531

531532
p.root()
532533
.join("target-dir")
533534
.assert_build_dir_layout(str![[r#"
534535
[ROOT]/foo/target-dir/package/foo-0.0.1.crate
536+
[ROOT]/foo/target-dir/CACHEDIR.TAG
535537
536538
"#]]);
537539
}

tests/testsuite/build_dir_legacy.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,15 @@ fn cargo_package_should_build_in_build_dir_and_output_to_target_dir() {
494494
[ROOT]/foo/build-dir/package/foo-0.0.1/Cargo.toml.orig
495495
[ROOT]/foo/build-dir/package/foo-0.0.1/src/main.rs
496496
[ROOT]/foo/build-dir/package/foo-0.0.1.crate
497+
[ROOT]/foo/build-dir/CACHEDIR.TAG
497498
498499
"#]]);
499500

500501
p.root()
501502
.join("target-dir")
502503
.assert_build_dir_layout(str![[r#"
503504
[ROOT]/foo/target-dir/package/foo-0.0.1.crate
505+
[ROOT]/foo/target-dir/CACHEDIR.TAG
504506
505507
"#]]);
506508
}

tests/testsuite/package.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7825,10 +7825,10 @@ fn package_dir_not_excluded_from_backups() {
78257825
"#]])
78267826
.run();
78277827

7828-
// Verify CACHEDIR.TAG does NOT exist in target (documenting the buggy behavior)
7828+
// Verify CACHEDIR.TAG exists in target (which excludes target/ and all subdirectories)
78297829
let cachedir_tag = p.root().join("target/CACHEDIR.TAG");
78307830
assert!(
7831-
!cachedir_tag.exists(),
7832-
"CACHEDIR.TAG should not exist yet (this is the bug)"
7831+
cachedir_tag.exists(),
7832+
"CACHEDIR.TAG should exist in target directory to exclude it from backups"
78337833
);
78347834
}

0 commit comments

Comments
 (0)