From dda851a9798aad152f2d763f1336dceace81d968 Mon Sep 17 00:00:00 2001 From: l00556901 Date: Thu, 26 Aug 2021 20:42:56 +0800 Subject: [PATCH 1/8] fix cargo clean -p package --- src/cargo/core/compiler/layout.rs | 7 +++++++ src/cargo/ops/cargo_clean.rs | 18 ++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/cargo/core/compiler/layout.rs b/src/cargo/core/compiler/layout.rs index b5d7dea6e64..a43618197aa 100644 --- a/src/cargo/core/compiler/layout.rs +++ b/src/cargo/core/compiler/layout.rs @@ -125,6 +125,8 @@ pub struct Layout { examples: PathBuf, /// The directory for rustdoc output: `$root/doc` doc: PathBuf, + /// The directory for rustdoc output: `$root/doc/src` + src: PathBuf, /// The directory for temporary data of integration tests and benches: `$dest/tmp` tmp: PathBuf, /// The lockfile for a build (`.cargo-lock`). Will be unlocked when this @@ -172,6 +174,7 @@ impl Layout { fingerprint: dest.join(".fingerprint"), examples: dest.join("examples"), doc: root.join("doc"), + src: root.join("doc/src"), tmp: dest.join("tmp"), root, dest, @@ -206,6 +209,10 @@ impl Layout { pub fn doc(&self) -> &Path { &self.doc } + /// Fetch the doc/src path. + pub fn src(&self) -> &Path { + &self.src + } /// Fetch the root path (`/…/target`). pub fn root(&self) -> &Path { &self.root diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 76b6927519a..33e0880473c 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -88,12 +88,7 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { std::iter::once((CompileKind::Host, &host_layout)) .chain(layouts.iter().map(|(k, l)| (*k, *l))) .collect(); - - // Cleaning individual rustdoc crates is currently not supported. - // For example, the search index would need to be rebuilt to fully - // remove it (otherwise you're left with lots of broken links). - // Doc tests produce no output. - + // Get Packages for the specified specs. let mut pkg_ids = Vec::new(); for spec_str in opts.spec.iter() { @@ -135,6 +130,17 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for pkg in packages { let pkg_dir = format!("{}-*", pkg.name()); + let pkg_name = pkg.name(); + + // clean individual rustdoc crates + for (_, layout) in &layouts_with_host { + let doc_path = layout.doc(); + let doc_src_path = layout.src(); + // clean target/doc/package + rm_rf(&doc_path.join(&pkg_name), config)?; + // clean target/doc/src/package + rm_rf(&doc_src_path.join(&pkg_name), config)?; + } // Clean fingerprints. for (_, layout) in &layouts_with_host { From 766d38a7a6dcb50bf7682644d9db550aab4220d8 Mon Sep 17 00:00:00 2001 From: l00556901 Date: Sat, 28 Aug 2021 10:26:48 +0800 Subject: [PATCH 2/8] clean target/doc/package and target/doc/src/package --- src/cargo/ops/cargo_clean.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 33e0880473c..845c2b6833d 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -88,7 +88,12 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { std::iter::once((CompileKind::Host, &host_layout)) .chain(layouts.iter().map(|(k, l)| (*k, *l))) .collect(); - + + // Cleaning individual rustdoc crates is currently not supported. + // For example, the search index would need to be rebuilt to fully + // remove it (otherwise you're left with lots of broken links). + // Doc tests produce no output. + // Get Packages for the specified specs. let mut pkg_ids = Vec::new(); for spec_str in opts.spec.iter() { @@ -130,21 +135,14 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for pkg in packages { let pkg_dir = format!("{}-*", pkg.name()); - let pkg_name = pkg.name(); - - // clean individual rustdoc crates - for (_, layout) in &layouts_with_host { - let doc_path = layout.doc(); - let doc_src_path = layout.src(); - // clean target/doc/package - rm_rf(&doc_path.join(&pkg_name), config)?; - // clean target/doc/src/package - rm_rf(&doc_src_path.join(&pkg_name), config)?; - } - // Clean fingerprints. for (_, layout) in &layouts_with_host { + // Clean fingerprints. rm_rf_glob(&layout.fingerprint().join(&pkg_dir), config)?; + // Clean target/doc. + rm_rf(&layout.doc(), config)?; + // Clean target/doc/src. + rm_rf(&layout.src(), config)?; } for target in pkg.targets() { From d17424d56dddf3822cc512db05d96abe80e53720 Mon Sep 17 00:00:00 2001 From: l00556901 Date: Sat, 28 Aug 2021 15:14:21 +0800 Subject: [PATCH 3/8] add test --- tests/testsuite/clean.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/testsuite/clean.rs b/tests/testsuite/clean.rs index cabfd641047..4267a1b3083 100644 --- a/tests/testsuite/clean.rs +++ b/tests/testsuite/clean.rs @@ -549,3 +549,32 @@ fn clean_spec_reserved() { ) .run(); } + +#[cargo_test] +fn clean_spec_doc() { + // `clean -p package` make target/doc/package clear + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("doc").run(); + + let doc_path = &p.build_dir().join("doc"); + assert!(doc_path.is_dir()); + + p.cargo("clean -p foo").run(); + + assert!(!doc_path.join("foo").is_dir()); + assert!(!doc_path.join("src").join("foo").is_dir()); + + assert!(p.build_dir().is_dir()); +} From e7a005da47a7581644453f9b640229c8c486407d Mon Sep 17 00:00:00 2001 From: l00556901 Date: Fri, 3 Sep 2021 15:17:36 +0800 Subject: [PATCH 4/8] fix clean and add test --- src/cargo/core/compiler/layout.rs | 8 ++++---- src/cargo/ops/cargo_clean.rs | 8 ++++---- tests/testsuite/clean.rs | 16 ++++++++++++++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/cargo/core/compiler/layout.rs b/src/cargo/core/compiler/layout.rs index c1700c96669..253b77d7710 100644 --- a/src/cargo/core/compiler/layout.rs +++ b/src/cargo/core/compiler/layout.rs @@ -126,7 +126,7 @@ pub struct Layout { /// The directory for rustdoc output: `$root/doc` doc: PathBuf, /// The directory for rustdoc output: `$root/doc/src` - src: PathBuf, + doc_src: PathBuf, /// The directory for temporary data of integration tests and benches: `$dest/tmp` tmp: PathBuf, /// The lockfile for a build (`.cargo-lock`). Will be unlocked when this @@ -174,7 +174,7 @@ impl Layout { fingerprint: dest.join(".fingerprint"), examples: dest.join("examples"), doc: root.join("doc"), - src: root.join("doc/src"), + doc_src: root.join("doc/src"), tmp: root.join("tmp"), root, dest, @@ -210,8 +210,8 @@ impl Layout { &self.doc } /// Fetch the doc/src path. - pub fn src(&self) -> &Path { - &self.src + pub fn doc_src(&self) -> &Path { + &self.doc_src } /// Fetch the root path (`/…/target`). pub fn root(&self) -> &Path { diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 845c2b6833d..034655732b7 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -139,10 +139,10 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for (_, layout) in &layouts_with_host { // Clean fingerprints. rm_rf_glob(&layout.fingerprint().join(&pkg_dir), config)?; - // Clean target/doc. - rm_rf(&layout.doc(), config)?; - // Clean target/doc/src. - rm_rf(&layout.src(), config)?; + // Clean target/doc/pkg. + rm_rf(&layout.doc().join(pkg.name()), config)?; + // Clean target/doc/src/pkg. + rm_rf(&layout.doc_src().join(pkg.name()), config)?; } for target in pkg.targets() { diff --git a/tests/testsuite/clean.rs b/tests/testsuite/clean.rs index 4267a1b3083..1d543066bad 100644 --- a/tests/testsuite/clean.rs +++ b/tests/testsuite/clean.rs @@ -561,20 +561,32 @@ fn clean_spec_doc() { name = "foo" version = "0.0.1" authors = [] + + [dependencies.bar] + path = "bar" "#, ) - .file("src/main.rs", "fn main() {}") + .file("src/lib.rs", "extern crate bar; pub fn foo() {}") + .file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1")) + .file("bar/src/lib.rs", "pub fn bar() {}") .build(); p.cargo("doc").run(); let doc_path = &p.build_dir().join("doc"); + let foo_doc_path = &doc_path.join("foo"); + let bar_doc_path = &doc_path.join("bar"); assert!(doc_path.is_dir()); + assert!(foo_doc_path.is_dir()); + assert!(bar_doc_path.is_dir()); p.cargo("clean -p foo").run(); - assert!(!doc_path.join("foo").is_dir()); + assert!(!foo_doc_path.is_dir()); + assert!(bar_doc_path.is_dir()); + assert!(!doc_path.join("src").join("foo").is_dir()); + assert!(doc_path.join("src").join("bar").is_dir()); assert!(p.build_dir().is_dir()); } From 0aff2516f411d1592f5b0cf95e6e0bdb4df8888d Mon Sep 17 00:00:00 2001 From: l00556901 Date: Sat, 27 Nov 2021 12:49:34 +0800 Subject: [PATCH 5/8] Narrow the deletion scope --- src/cargo/ops/cargo_clean.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 034655732b7..9bcd3fe25d2 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -139,10 +139,22 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for (_, layout) in &layouts_with_host { // Clean fingerprints. rm_rf_glob(&layout.fingerprint().join(&pkg_dir), config)?; - // Clean target/doc/pkg. - rm_rf(&layout.doc().join(pkg.name()), config)?; - // Clean target/doc/src/pkg. - rm_rf(&layout.doc_src().join(pkg.name()), config)?; + + // Clean entries of workspace members under target/doc. + for doc_bin in pkg.targets().iter().filter(|t| t.documented()) { + if doc_bin.name() == pkg.name().as_str() { + rm_rf(&layout.doc().join(pkg.name()), config)?; + rm_rf(&layout.doc_src().join(pkg.name()), config)?; + } + } + + // Clean lib of non-members under target/doc. + for doc_lib in pkg.targets().iter().find(|t| t.is_lib()) { + if doc_lib.name() == pkg.name().as_str() { + rm_rf(&layout.doc().join(pkg.name()), config)?; + rm_rf(&layout.doc_src().join(pkg.name()), config)?; + } + } } for target in pkg.targets() { From bb78c7a7826d0f8d196fa95e06ca85c787aed4e1 Mon Sep 17 00:00:00 2001 From: l00556901 Date: Sat, 27 Nov 2021 14:05:12 +0800 Subject: [PATCH 6/8] fmt --- src/cargo/ops/cargo_clean.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index f82f6f5be49..4c33fe5fed3 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -137,7 +137,6 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { let pkg_dir = format!("{}-*", pkg.name()); for (_, layout) in &layouts_with_host { - // Clean entries of workspace members under target/doc. for doc_bin in pkg.targets().iter().filter(|t| t.documented()) { if doc_bin.name() == pkg.name().as_str() { @@ -153,7 +152,7 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { rm_rf(&layout.doc_src().join(pkg.name()), config)?; } } - + // Clean fingerprints. let dir = escape_glob_path(layout.fingerprint())?; rm_rf_glob(&Path::new(&dir).join(&pkg_dir), config)?; From 950aa4f8b350d79767ca39e27c2c8990fd7f6a4f Mon Sep 17 00:00:00 2001 From: l00556901 Date: Sat, 27 Nov 2021 14:11:22 +0800 Subject: [PATCH 7/8] fmt --- src/cargo/ops/cargo_clean.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 4c33fe5fed3..c68a4c36940 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -138,16 +138,16 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for (_, layout) in &layouts_with_host { // Clean entries of workspace members under target/doc. - for doc_bin in pkg.targets().iter().filter(|t| t.documented()) { - if doc_bin.name() == pkg.name().as_str() { + for doc_member_entry in pkg.targets().iter().filter(|t| t.documented()) { + if doc_member_entry.name() == pkg.name().as_str() { rm_rf(&layout.doc().join(pkg.name()), config)?; rm_rf(&layout.doc_src().join(pkg.name()), config)?; } } // Clean lib of non-members under target/doc. - for doc_lib in pkg.targets().iter().find(|t| t.is_lib()) { - if doc_lib.name() == pkg.name().as_str() { + for doc_non_member_lib in pkg.targets().iter().find(|t| t.is_lib()) { + if doc_non_member_lib.name() == pkg.name().as_str() { rm_rf(&layout.doc().join(pkg.name()), config)?; rm_rf(&layout.doc_src().join(pkg.name()), config)?; } From a2ded661b8c96cff23a1dfbbee7bca5d5393babd Mon Sep 17 00:00:00 2001 From: l00556901 Date: Tue, 21 Dec 2021 16:04:11 +0800 Subject: [PATCH 8/8] use ws.is_member(pkg) --- src/cargo/ops/cargo_clean.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index c68a4c36940..2cc514e7299 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -138,16 +138,16 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> { for (_, layout) in &layouts_with_host { // Clean entries of workspace members under target/doc. - for doc_member_entry in pkg.targets().iter().filter(|t| t.documented()) { - if doc_member_entry.name() == pkg.name().as_str() { + for _ in pkg.targets().iter().filter(|t| t.documented()) { + if ws.is_member(pkg) { rm_rf(&layout.doc().join(pkg.name()), config)?; rm_rf(&layout.doc_src().join(pkg.name()), config)?; } } // Clean lib of non-members under target/doc. - for doc_non_member_lib in pkg.targets().iter().find(|t| t.is_lib()) { - if doc_non_member_lib.name() == pkg.name().as_str() { + for _ in pkg.targets().iter().find(|t| t.is_lib()) { + if ws.is_member(pkg) { rm_rf(&layout.doc().join(pkg.name()), config)?; rm_rf(&layout.doc_src().join(pkg.name()), config)?; }