-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Closed
Labels
Description
Problem
cargo clean -p
fails to delete a number of files from target/
if the path to target
contains glob characters. This is due to the use of rm_rf_glob
used for cleaning, which does not escape glob characters in the path before adding the pattern:
cargo/src/cargo/ops/cargo_clean.rs
Lines 210 to 216 in e11cd81
fn rm_rf_glob(pattern: &Path, config: &Config) -> CargoResult<()> { | |
// TODO: Display utf8 warning to user? Or switch to globset? | |
let pattern = pattern | |
.to_str() | |
.ok_or_else(|| anyhow::anyhow!("expected utf-8 path"))?; | |
for path in glob::glob(pattern)? { | |
rm_rf(&path?, config)?; |
Here for example:
cargo/src/cargo/ops/cargo_clean.rs
Lines 137 to 142 in e11cd81
let pkg_dir = format!("{}-*", pkg.name()); | |
// Clean fingerprints. | |
for (_, layout) in &layouts_with_host { | |
rm_rf_glob(&layout.fingerprint().join(&pkg_dir), config)?; | |
} |
Steps
#!/bin/bash
rm -rf glob-in-rm
mkdir glob-in-rm
cd glob-in-rm
for d in '[hello]' 'hello'; do
mkdir "$d"
pushd "$d"
cargo new foo
cd foo
cargo check
cargo clean -p foo
popd
done
diff -qr '[hello]/foo/target' 'hello/foo/target'
Only in [hello]/foo/target/debug/.fingerprint: foo-8ca57bdc9f429d2a
Only in [hello]/foo/target/debug/deps: foo-8ca57bdc9f429d2a.d
Only in [hello]/foo/target/debug/deps: libfoo-8ca57bdc9f429d2a.rmeta
Only in [hello]/foo/target/debug/incremental: foo-1qp1vfygk93x
Possible Solution(s)
Escape any non-pattern part of the string passed to glob
with glob::Pattern::escape
.
Notes
No response
Version
cargo 1.56.0 (4ed5d137b 2021-10-04)
release: 1.56.0
commit-hash: 4ed5d137baff5eccf1bae5a7b2ae4b57efad4a7d
commit-date: 2021-10-04