Skip to content

Commit

Permalink
vendor: Add --include-path-deps to include path dependencies
Browse files Browse the repository at this point in the history
This changes the erroneous behavior to skip path dependencies and adds a
command option to keep the current behavior.
  • Loading branch information
stevenroose committed Oct 19, 2023
1 parent a918b59 commit edb2e13
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 3 deletions.
5 changes: 5 additions & 0 deletions src/bin/cargo/commands/vendor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ pub fn cli() -> Command {
"versioned-dirs",
"Always include version in subdir name",
))
.arg(flag(
"include-path-deps",
"Include path dependencies",
))
.arg(unsupported("no-merge-sources"))
.arg(unsupported("relative-path"))
.arg(unsupported("only-git-deps"))
Expand Down Expand Up @@ -75,6 +79,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult {
no_delete: args.flag("no-delete"),
destination: &path,
versioned_dirs: args.flag("versioned-dirs"),
include_path_deps: args.flag("include-path-deps"),
extra: args
.get_many::<PathBuf>("tomls")
.unwrap_or_default()
Expand Down
24 changes: 21 additions & 3 deletions src/cargo/ops/vendor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use std::path::{Path, PathBuf};
pub struct VendorOptions<'a> {
pub no_delete: bool,
pub versioned_dirs: bool,
pub include_path_deps: bool,
pub destination: &'a Path,
pub extra: Vec<PathBuf>,
}
Expand Down Expand Up @@ -62,6 +63,8 @@ struct VendorConfig {
enum VendorSource {
Directory {
directory: String,
#[serde(rename = "replace-with", skip_serializing_if = "Option::is_none")]
replace_with: Option<String>,
},
Registry {
registry: Option<String>,
Expand Down Expand Up @@ -153,12 +156,21 @@ fn sync(
.get_many(resolve.iter())
.with_context(|| "failed to download packages")?;

let current = ws
.current()
.with_context(|| "using virtual manifest in workspace")?
.package_id();
for pkg in resolve.iter() {
// No need to vendor path crates since they're already in the
// repository
if pkg.source_id().is_path() {
// Since the target crate itself is also part of the packages,
// make sure we skip it.
if pkg == current {
continue;
}

if pkg.source_id().is_path() && !opts.include_path_deps {
continue;
}

ids.insert(
pkg,
packages
Expand Down Expand Up @@ -291,6 +303,11 @@ fn sync(
rev,
replace_with: merged_source_name.to_string(),
}
} else if source_id.is_path() && opts.include_path_deps {
VendorSource::Directory {
directory: source_id.url().to_string(),
replace_with: Some(merged_source_name.to_string()),
}
} else {
panic!("Invalid source ID: {}", source_id)
};
Expand All @@ -305,6 +322,7 @@ fn sync(
// This backslash normalization is for making output paths more
// cross-platform compatible.
directory: opts.destination.to_string_lossy().replace("\\", "/"),
replace_with: None,
},
);
} else if !dest_dir_already_exists {
Expand Down
33 changes: 33 additions & 0 deletions tests/testsuite/vendor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1024,6 +1024,39 @@ fn git_crlf_preservation() {
assert_eq!(input, output);
}

#[cargo_test]
fn path_deps() {
let p = project()
.file(
"bar/Cargo.toml",
r#"
[package]
name = "bar"
version = "0.1.0"
"#,
)
.file("bar/src/lib.rs", "")
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
[dependencies]
bar = { path = "bar" }
"#,
)
.file("src/lib.rs", "")
.build();

p.cargo("vendor --respect-source-config").run();
assert!(!p.root().join("vendor/bar").is_dir());

p.cargo("vendor --respect-source-config --include-path-deps").run();
assert!(p.root().join("vendor/bar").is_dir());
}

#[cargo_test]
#[cfg(unix)]
fn vendor_preserves_permissions() {
Expand Down

0 comments on commit edb2e13

Please sign in to comment.