From d709c10d352c2ebc36dde74a8676a015370953c9 Mon Sep 17 00:00:00 2001
From: Eric Huss
Date: Thu, 5 Sep 2019 14:56:21 -0700
Subject: [PATCH 1/2] Allow publishing with dev-dependencies without a version.
---
src/cargo/ops/cargo_package.rs | 2 +-
src/cargo/ops/registry.rs | 8 +++
src/cargo/util/toml/mod.rs | 24 ++++++---
src/doc/man/cargo-package.adoc | 1 +
src/doc/man/generated/cargo-package.html | 3 +-
src/etc/man/cargo-package.1 | 7 +--
tests/testsuite/publish.rs | 65 ++++++++++++++++++++++++
7 files changed, 98 insertions(+), 12 deletions(-)
diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs
index 16667fcdf0b..58a1eb49dc6 100644
--- a/src/cargo/ops/cargo_package.rs
+++ b/src/cargo/ops/cargo_package.rs
@@ -206,7 +206,7 @@ fn check_metadata(pkg: &Package, config: &Config) -> CargoResult<()> {
// Checks that the package dependencies are safe to deploy.
fn verify_dependencies(pkg: &Package) -> CargoResult<()> {
for dep in pkg.dependencies() {
- if dep.source_id().is_path() && !dep.specified_req() {
+ if dep.source_id().is_path() && !dep.specified_req() && dep.is_transitive() {
failure::bail!(
"all path dependencies must have a version specified \
when packaging.\ndependency `{}` does not specify \
diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs
index 2b33abd70a8..d6e6178dd8b 100644
--- a/src/cargo/ops/registry.rs
+++ b/src/cargo/ops/registry.rs
@@ -116,6 +116,10 @@ fn verify_dependencies(
for dep in pkg.dependencies().iter() {
if dep.source_id().is_path() || dep.source_id().is_git() {
if !dep.specified_req() {
+ if !dep.is_transitive() {
+ // dev-dependencies will be stripped in TomlManifest::prepare_for_publish
+ continue;
+ }
let which = if dep.source_id().is_path() {
"path"
} else {
@@ -172,6 +176,10 @@ fn transmit(
let deps = pkg
.dependencies()
.iter()
+ .filter(|dep| {
+ // Skip dev-dependency without version.
+ dep.is_transitive() || dep.specified_req()
+ })
.map(|dep| {
// If the dependency is from a different registry, then include the
// registry in the dependency.
diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs
index d66ea182c1c..b3919d82d0c 100644
--- a/src/cargo/util/toml/mod.rs
+++ b/src/cargo/util/toml/mod.rs
@@ -722,6 +722,7 @@ impl TomlManifest {
.unwrap()
.clone();
package.workspace = None;
+ let all = |_d: &TomlDependency| true;
return Ok(TomlManifest {
package: Some(package),
project: None,
@@ -731,12 +732,13 @@ impl TomlManifest {
example: self.example.clone(),
test: self.test.clone(),
bench: self.bench.clone(),
- dependencies: map_deps(config, self.dependencies.as_ref())?,
+ dependencies: map_deps(config, self.dependencies.as_ref(), all)?,
dev_dependencies: map_deps(
config,
self.dev_dependencies
.as_ref()
.or_else(|| self.dev_dependencies2.as_ref()),
+ TomlDependency::is_version_specified,
)?,
dev_dependencies2: None,
build_dependencies: map_deps(
@@ -744,6 +746,7 @@ impl TomlManifest {
self.build_dependencies
.as_ref()
.or_else(|| self.build_dependencies2.as_ref()),
+ all,
)?,
build_dependencies2: None,
features: self.features.clone(),
@@ -754,12 +757,13 @@ impl TomlManifest {
Ok((
k.clone(),
TomlPlatform {
- dependencies: map_deps(config, v.dependencies.as_ref())?,
+ dependencies: map_deps(config, v.dependencies.as_ref(), all)?,
dev_dependencies: map_deps(
config,
v.dev_dependencies
.as_ref()
.or_else(|| v.dev_dependencies2.as_ref()),
+ TomlDependency::is_version_specified,
)?,
dev_dependencies2: None,
build_dependencies: map_deps(
@@ -767,6 +771,7 @@ impl TomlManifest {
v.build_dependencies
.as_ref()
.or_else(|| v.build_dependencies2.as_ref()),
+ all,
)?,
build_dependencies2: None,
},
@@ -788,6 +793,7 @@ impl TomlManifest {
fn map_deps(
config: &Config,
deps: Option<&BTreeMap>,
+ filter: impl Fn(&TomlDependency) -> bool,
) -> CargoResult
diff --git a/src/etc/man/cargo-package.1 b/src/etc/man/cargo-package.1
index b27d7bc83dd..e3b95d5204d 100644
--- a/src/etc/man/cargo-package.1
+++ b/src/etc/man/cargo-package.1
@@ -1,13 +1,13 @@
'\" t
.\" Title: cargo-package
.\" Author: [see the "AUTHOR(S)" section]
-.\" Generator: Asciidoctor 2.0.8
-.\" Date: 2019-07-15
+.\" Generator: Asciidoctor 2.0.10
+.\" Date: 2019-09-05
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
-.TH "CARGO\-PACKAGE" "1" "2019-07-15" "\ \&" "\ \&"
+.TH "CARGO\-PACKAGE" "1" "2019-09-05" "\ \&" "\ \&"
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.ss \n[.ss] 0
@@ -59,6 +59,7 @@ Load and check the current workspace, performing some basic checks.
.\}
Path dependencies are not allowed unless they have a version key. Cargo
will ignore the path key for dependencies in published packages.
+\fBdev\-dependencies\fP do not have this restriction.
.RE
.RE
.sp
diff --git a/tests/testsuite/publish.rs b/tests/testsuite/publish.rs
index bb9c1edb752..9c26330e29d 100644
--- a/tests/testsuite/publish.rs
+++ b/tests/testsuite/publish.rs
@@ -1178,3 +1178,68 @@ fn publish_git_with_version() {
],
);
}
+
+#[cargo_test]
+fn publish_dev_dep_no_version() {
+ registry::init();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+ authors = []
+ license = "MIT"
+ description = "foo"
+ documentation = "foo"
+ homepage = "foo"
+ repository = "foo"
+
+ [dev-dependencies]
+ bar = { path = "bar" }
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
+ .file("bar/src/lib.rs", "")
+ .build();
+
+ p.cargo("publish --no-verify --index")
+ .arg(registry_url().to_string())
+ .with_stderr(
+ "\
+[UPDATING] [..]
+[PACKAGING] foo v0.1.0 [..]
+[UPLOADING] foo v0.1.0 [..]
+",
+ )
+ .run();
+
+ publish::validate_upload(
+ r#"
+ {
+ "authors": [],
+ "badges": {},
+ "categories": [],
+ "deps": [],
+ "description": "foo",
+ "documentation": "foo",
+ "features": {},
+ "homepage": "foo",
+ "keywords": [],
+ "license": "MIT",
+ "license_file": null,
+ "links": null,
+ "name": "foo",
+ "readme": null,
+ "readme_file": null,
+ "repository": "foo",
+ "vers": "0.1.0"
+ }
+ "#,
+ "foo-0.1.0.crate",
+ &["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"],
+ );
+}
From e4345b2e8ed43328dc227a0fcf9447139927babc Mon Sep 17 00:00:00 2001
From: Eric Huss
Date: Tue, 10 Sep 2019 17:06:32 -0700
Subject: [PATCH 2/2] Validate uploaded Cargo.toml contents.
---
tests/testsuite/publish.rs | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/tests/testsuite/publish.rs b/tests/testsuite/publish.rs
index 9c26330e29d..f5c339b43fb 100644
--- a/tests/testsuite/publish.rs
+++ b/tests/testsuite/publish.rs
@@ -1217,7 +1217,7 @@ fn publish_dev_dep_no_version() {
)
.run();
- publish::validate_upload(
+ publish::validate_upload_with_contents(
r#"
{
"authors": [],
@@ -1241,5 +1241,21 @@ fn publish_dev_dep_no_version() {
"#,
"foo-0.1.0.crate",
&["Cargo.toml", "Cargo.toml.orig", "src/lib.rs"],
+ &[(
+ "Cargo.toml",
+ r#"[..]
+[package]
+name = "foo"
+version = "0.1.0"
+authors = []
+description = "foo"
+homepage = "foo"
+documentation = "foo"
+license = "MIT"
+repository = "foo"
+
+[dev-dependencies]
+"#,
+ )],
);
}