Skip to content

Replace cargo publish --host with cargo publish --index #4209

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions src/bin/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use cargo::util::important_paths::find_root_manifest_for_wd;

#[derive(Deserialize)]
pub struct Options {
flag_host: Option<String>,
flag_index: Option<String>,
flag_host: Option<String>, // TODO: Deprecated, remove
flag_token: Option<String>,
flag_manifest_path: Option<String>,
flag_verbose: u32,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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,
Expand Down
153 changes: 143 additions & 10 deletions tests/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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 [..]
Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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));
}

Expand Down Expand Up @@ -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));
}

Expand Down Expand Up @@ -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));
}

Expand All @@ -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));
}

Expand All @@ -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));
}

Expand All @@ -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, [..]
Expand Down
2 changes: 1 addition & 1 deletion tests/registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand Down