diff --git a/src/bin/publish.rs b/src/bin/publish.rs index 3f0af0baaf7..507496b46c2 100644 --- a/src/bin/publish.rs +++ b/src/bin/publish.rs @@ -5,7 +5,8 @@ use cargo::util::important_paths::find_root_manifest_for_wd; #[derive(Deserialize)] pub struct Options { - flag_host: Option, + flag_index: Option, + flag_host: Option, // TODO: Deprecated, remove flag_token: Option, flag_manifest_path: Option, flag_verbose: u32, @@ -27,7 +28,8 @@ Usage: Options: -h, --help Print this message - --host HOST Host to upload the package to + --index INDEX Registry index to upload the package to + --host HOST DEPRECATED, renamed to '--index' --token TOKEN Token to use when uploading --no-verify Don't verify package tarball before publish --allow-dirty Allow publishing with a dirty source directory @@ -48,9 +50,13 @@ pub fn execute(options: Options, config: &Config) -> CliResult { &options.flag_color, options.flag_frozen, options.flag_locked)?; + + + let Options { flag_token: token, - flag_host: host, + flag_index: index, + flag_host: host, // TODO: Deprecated, remove flag_manifest_path, flag_no_verify: no_verify, flag_allow_dirty: allow_dirty, @@ -59,12 +65,31 @@ pub fn execute(options: Options, config: &Config) -> CliResult { .. } = options; + + // TODO: Deprecated + // remove once it has been decided --host can be removed + // We may instead want to repurpose the host flag, as + // mentioned in this issue + // https://github.com/rust-lang/cargo/issues/4208 + let msg = "The flag '--host' is no longer valid. + +Previous versions of Cargo accepted this flag, but it is being +deprecated. The flag is being renamed to 'index', as the flag +wants the location of the index to which to publish. Please +use '--index' instead. + +This will soon become a hard error, so it's either recommended +to update to a fixed version or contact the upstream maintainer +about this warning."; + let root = find_root_manifest_for_wd(flag_manifest_path.clone(), config.cwd())?; let ws = Workspace::new(&root, config)?; ops::publish(&ws, &ops::PublishOpts { config: config, token: token, - index: host, + index: + if host.clone().is_none() || host.clone().unwrap().is_empty() { index } + else { config.shell().warn(&msg)?; host }, // TODO: Deprecated, remove verify: !no_verify, allow_dirty: allow_dirty, jobs: jobs, diff --git a/tests/publish.rs b/tests/publish.rs index 968281f6219..166b021c7be 100644 --- a/tests/publish.rs +++ b/tests/publish.rs @@ -44,6 +44,62 @@ fn setup() { fn simple() { setup(); + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#) + .file("src/main.rs", "fn main() {}"); + + assert_that(p.cargo_process("publish").arg("--no-verify") + .arg("--index").arg(registry().to_string()), + execs().with_status(0).with_stderr(&format!("\ +[UPDATING] registry `{reg}` +[WARNING] manifest has no documentation, [..] +See [..] +[PACKAGING] foo v0.0.1 ({dir}) +[UPLOADING] foo v0.0.1 ({dir}) +", + dir = p.url(), + reg = registry()))); + + let mut f = File::open(&upload_path().join("api/v1/crates/new")).unwrap(); + // Skip the metadata payload and the size of the tarball + let mut sz = [0; 4]; + assert_eq!(f.read(&mut sz).unwrap(), 4); + let sz = ((sz[0] as u32) << 0) | + ((sz[1] as u32) << 8) | + ((sz[2] as u32) << 16) | + ((sz[3] as u32) << 24); + f.seek(SeekFrom::Current(sz as i64 + 4)).unwrap(); + + // Verify the tarball + let mut rdr = GzDecoder::new(f).unwrap(); + assert_eq!(rdr.header().filename().unwrap(), "foo-0.0.1.crate".as_bytes()); + let mut contents = Vec::new(); + rdr.read_to_end(&mut contents).unwrap(); + let mut ar = Archive::new(&contents[..]); + for file in ar.entries().unwrap() { + let file = file.unwrap(); + let fname = file.header().path_bytes(); + let fname = &*fname; + assert!(fname == b"foo-0.0.1/Cargo.toml" || + fname == b"foo-0.0.1/Cargo.toml.orig" || + fname == b"foo-0.0.1/src/main.rs", + "unexpected filename: {:?}", file.header().path()); + } +} + +// TODO: Deprecated +// remove once it has been decided --host can be removed +#[test] +fn simple_with_host() { + setup(); + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -58,6 +114,83 @@ fn simple() { assert_that(p.cargo_process("publish").arg("--no-verify") .arg("--host").arg(registry().to_string()), execs().with_status(0).with_stderr(&format!("\ +[WARNING] The flag '--host' is no longer valid. + +Previous versions of Cargo accepted this flag, but it is being +deprecated. The flag is being renamed to 'index', as the flag +wants the location of the index to which to publish. Please +use '--index' instead. + +This will soon become a hard error, so it's either recommended +to update to a fixed version or contact the upstream maintainer +about this warning. +[UPDATING] registry `{reg}` +[WARNING] manifest has no documentation, [..] +See [..] +[PACKAGING] foo v0.0.1 ({dir}) +[UPLOADING] foo v0.0.1 ({dir}) +", + dir = p.url(), + reg = registry()))); + + let mut f = File::open(&upload_path().join("api/v1/crates/new")).unwrap(); + // Skip the metadata payload and the size of the tarball + let mut sz = [0; 4]; + assert_eq!(f.read(&mut sz).unwrap(), 4); + let sz = ((sz[0] as u32) << 0) | + ((sz[1] as u32) << 8) | + ((sz[2] as u32) << 16) | + ((sz[3] as u32) << 24); + f.seek(SeekFrom::Current(sz as i64 + 4)).unwrap(); + + // Verify the tarball + let mut rdr = GzDecoder::new(f).unwrap(); + assert_eq!(rdr.header().filename().unwrap(), "foo-0.0.1.crate".as_bytes()); + let mut contents = Vec::new(); + rdr.read_to_end(&mut contents).unwrap(); + let mut ar = Archive::new(&contents[..]); + for file in ar.entries().unwrap() { + let file = file.unwrap(); + let fname = file.header().path_bytes(); + let fname = &*fname; + assert!(fname == b"foo-0.0.1/Cargo.toml" || + fname == b"foo-0.0.1/Cargo.toml.orig" || + fname == b"foo-0.0.1/src/main.rs", + "unexpected filename: {:?}", file.header().path()); + } +} + +// TODO: Deprecated +// remove once it has been decided --host can be removed +#[test] +fn simple_with_index_and_host() { + setup(); + + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#) + .file("src/main.rs", "fn main() {}"); + + assert_that(p.cargo_process("publish").arg("--no-verify") + .arg("--index").arg(registry().to_string()) + .arg("--host").arg(registry().to_string()), + execs().with_status(0).with_stderr(&format!("\ +[WARNING] The flag '--host' is no longer valid. + +Previous versions of Cargo accepted this flag, but it is being +deprecated. The flag is being renamed to 'index', as the flag +wants the location of the index to which to publish. Please +use '--index' instead. + +This will soon become a hard error, so it's either recommended +to update to a fixed version or contact the upstream maintainer +about this warning. [UPDATING] registry `{reg}` [WARNING] manifest has no documentation, [..] See [..] @@ -113,7 +246,7 @@ fn git_deps() { .file("src/main.rs", "fn main() {}"); assert_that(p.cargo_process("publish").arg("-v").arg("--no-verify") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101).with_stderr("\ [UPDATING] registry [..] [ERROR] crates cannot be published to crates.io with dependencies sourced from \ @@ -150,7 +283,7 @@ fn path_dependency_no_version() { .file("bar/src/lib.rs", ""); assert_that(p.cargo_process("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101).with_stderr("\ [UPDATING] registry [..] [ERROR] all path dependencies must have a version specified when publishing. @@ -175,7 +308,7 @@ fn unpublishable_crate() { .file("src/main.rs", "fn main() {}"); assert_that(p.cargo_process("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101).with_stderr("\ [ERROR] some crates cannot be published. `foo` is marked as unpublishable @@ -205,7 +338,7 @@ fn dont_publish_dirty() { .build(); assert_that(p.cargo("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101).with_stderr("\ [UPDATING] registry `[..]` error: 1 files in the working directory contain changes that were not yet \ @@ -240,7 +373,7 @@ fn publish_clean() { .build(); assert_that(p.cargo("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(0)); } @@ -268,7 +401,7 @@ fn publish_in_sub_repo() { .build(); assert_that(p.cargo("publish").cwd(p.root().join("bar")) - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(0)); } @@ -297,7 +430,7 @@ fn publish_when_ignored() { .build(); assert_that(p.cargo("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(0)); } @@ -324,7 +457,7 @@ fn ignore_when_crate_ignored() { "#) .nocommit_file("bar/src/main.rs", "fn main() {}"); assert_that(p.cargo("publish").cwd(p.root().join("bar")) - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(0)); } @@ -350,7 +483,7 @@ fn new_crate_rejected() { "#) .nocommit_file("src/main.rs", "fn main() {}"); assert_that(p.cargo("publish") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101)); } @@ -370,7 +503,7 @@ fn dry_run() { .file("src/main.rs", "fn main() {}"); assert_that(p.cargo_process("publish").arg("--dry-run") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(0).with_stderr(&format!("\ [UPDATING] registry `[..]` [WARNING] manifest has no documentation, [..] diff --git a/tests/registry.rs b/tests/registry.rs index b336827abbc..e7bc06e4e4d 100644 --- a/tests/registry.rs +++ b/tests/registry.rs @@ -616,7 +616,7 @@ fn bad_license_file() { "#); assert_that(p.cargo_process("publish") .arg("-v") - .arg("--host").arg(registry().to_string()), + .arg("--index").arg(registry().to_string()), execs().with_status(101) .with_stderr_contains("\ [ERROR] the license file `foo` does not exist"));