Skip to content
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

cargo install multiple crates #4216

Merged
merged 11 commits into from
Jul 28, 2017
Merged

cargo install multiple crates #4216

merged 11 commits into from
Jul 28, 2017

Conversation

durka
Copy link
Contributor

@durka durka commented Jun 23, 2017

rust-lang/rustup#986 for cargo install

Revives #2601 @pwoolcoc, replaces #3075 @esclear, closes #2585 @kindlychung @cyplo

Avoids the sticking point of the previous two PRs (multiple registry updates) by threading through a first-run boolean flag to decide whether select_pkg needs to call source.update().

There is still the issue that flags such as --git and --vers are "global" to the multiple packages you may be installing. The workaround is just to run cargo install separately. In the future we could add syntax like cargo install foo=1.0 bar=2.5 quux=git://github.com/durka/quux#dev-branch or something.

@durka
Copy link
Contributor Author

durka commented Jun 24, 2017

Fixed tests.

@durka
Copy link
Contributor Author

durka commented Jun 24, 2017

Reverting the bail! changes because I thought bail! == panic!... oops.

@cyplo
Copy link

cyplo commented Jun 24, 2017

Cool ! LGTM ! :)

Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you be sure to also add tests for installing multiple crates where one is an error for whatever reason?

tests/install.rs Outdated
[COMPILING] foo v0.0.1
[FINISHED] release [optimized] target(s) in [..]
[INSTALLING] {home}[..]bin[..]foo[..]
warning: be sure to add `[..]` to your PATH to be able to run the installed binaries
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this warning be printed out only once?

}

writeln!(io::stderr(),
"\n\nSUMMARY\n\nSuccessfully installed: {}\n\nErrors:\n\t{}",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this use the standard shell methods for reporting what happened here? Also can the whitespace be trimmed down as it seems like it's quite a bit?

let map = map.clone();
match install_one(root, map, Some(krate), source_id, vers, opts, force) {
Ok(()) => success.push(krate),
Err(e) => errors.push(format!("{}: {}", krate, e))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've got standard error handling mechanisms which print contextual information, and this loses the error backtrace. Can this just be propagated outwards?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically I didn't want errors to be lost in a sea of command-line output, so I thought it'd be better to collect them at the end.

@durka
Copy link
Contributor Author

durka commented Jul 12, 2017

Addressed comments.

@durka
Copy link
Contributor Author

durka commented Jul 24, 2017

I... have absolutely no idea why that test is failing. With my changes, cargo install seems to die after "Blocking waiting for lock on crate metadata", but it looks to me like it's trying the same actions in the same order.

@durka
Copy link
Contributor Author

durka commented Jul 24, 2017

Should be fixed now.

match install_one(root, map, Some(krate), source_id, vers, opts, force, first) {
Ok(()) => succeeded.push(krate),
Err(e) => {
opts.config.shell().error(e)?;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this'll want to use the top-level error handling functions in Cargo in the root src/cargo/lib.rs, there's a lot of contextual information in this error that the raw Display impl doesn't print out.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to use ::handle_error, I assume that's what you meant?

summary.push(format!("Successfully installed {}!", succeeded.join(", ")));
}
if !failed.is_empty() {
summary.push(format!("Failed to install {} (see error(s) above).", failed.join(", ")));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this schedule an error to be returned at the top level, to ensure that cargo returns a nonzero exit status?

Copy link
Contributor Author

@durka durka Jul 25, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now if there are failures it looks like this:

$ target/debug/cargo install asdfasdf fdasfdsa
    Updating registry `https://github.com/rust-lang/crates.io-index`
error: could not find `asdfasdf` in `registry https://github.com/rust-lang/crates.io-index`
error: could not find `fdasfdsa` in `registry https://github.com/rust-lang/crates.io-index`

Summary: Failed to install asdfasdf, fdasfdsa (see error(s) above).
error: some crates failed to install

and exits with 101.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@durka
Copy link
Contributor Author

durka commented Jul 25, 2017 via email

opts.config.shell().status("\nSummary:", summary.join(" "))?;
}

(!succeeded.is_empty(), !failed.is_empty())
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Starting to accumulate a slightly worrying number of boolean flags here. :/

@alexcrichton
Copy link
Member

@bors: r+

Looks good to me, thanks!

@bors
Copy link
Contributor

bors commented Jul 28, 2017

📌 Commit ce2d69d has been approved by alexcrichton

@bors
Copy link
Contributor

bors commented Jul 28, 2017

⌛ Testing commit ce2d69d with merge 043099730925ff28d6923f6a5cfc9ee155a80582...

@bors
Copy link
Contributor

bors commented Jul 28, 2017

☀️ Test successful - status-appveyor, status-travis
Approved by: alexcrichton
Pushing 043099730925ff28d6923f6a5cfc9ee155a80582 to master...

@bors
Copy link
Contributor

bors commented Jul 28, 2017

👀 Test was successful, but fast-forwarding failed: 422 Required status check "continuous-integration/appveyor/pr" is expected.

@alexcrichton
Copy link
Member

@bors: retry

bors added a commit that referenced this pull request Jul 28, 2017
cargo install multiple crates

rust-lang/rustup#986 for `cargo install`

Revives #2601 @pwoolcoc, replaces #3075 @esclear, closes #2585 @kindlychung @cyplo

Avoids the sticking point of the previous two PRs (multiple registry updates) by threading through a first-run boolean flag to decide whether `select_pkg` needs to call `source.update()`.

There is still the issue that flags such as `--git` and `--vers` are "global" to the multiple packages you may be installing. The workaround is just to run `cargo install` separately. In the future we could add syntax like `cargo install foo=1.0 bar=2.5 quux=git://github.com/durka/quux#dev-branch` or something.
@bors
Copy link
Contributor

bors commented Jul 28, 2017

⌛ Testing commit ce2d69d with merge 3751e68...

@bors
Copy link
Contributor

bors commented Jul 28, 2017

☀️ Test successful - status-appveyor, status-travis
Approved by: alexcrichton
Pushing 3751e68 to master...

@bors bors merged commit ce2d69d into rust-lang:master Jul 28, 2017
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Nov 3, 2017
Changelog:
Version 1.21.0 (2017-10-12)
==========================

Language
--------
- [You can now use static references for literals.][43838]
  Example:
  ```rust
  fn main() {
      let x: &'static u32 = &0;
  }
  ```
- [Relaxed path syntax. Optional `::` before `<` is now allowed in all contexts.][43540]
  Example:
  ```rust
  my_macro!(Vec<i32>::new); // Always worked
  my_macro!(Vec::<i32>::new); // Now works
  ```

Compiler
--------
- [Upgraded jemalloc to 4.5.0][43911]
- [Enabled unwinding panics on Redox][43917]
- [Now runs LLVM in parallel during translation phase.][43506]
  This should reduce peak memory usage.

Libraries
---------
- [Generate builtin impls for `Clone` for all arrays and tuples that
  are `T: Clone`][43690]
- [`Stdin`, `Stdout`, and `Stderr` now implement `AsRawFd`.][43459]
- [`Rc` and `Arc` now implement `From<&[T]> where T: Clone`, `From<str>`,
  `From<String>`, `From<Box<T>> where T: ?Sized`, and `From<Vec<T>>`.][42565]

Stabilized APIs
---------------

[`std::mem::discriminant`]

Cargo
-----
- [You can now call `cargo install` with multiple package names][cargo/4216]
- [Cargo commands inside a virtual workspace will now implicitly
  pass `--all`][cargo/4335]
- [Added a `[patch]` section to `Cargo.toml` to handle
  prepublication dependencies][cargo/4123] [RFC 1969]
- [`include` & `exclude` fields in `Cargo.toml` now accept gitignore
  like patterns][cargo/4270]
- [Added the `--all-targets` option][cargo/4400]
- [Using required dependencies as a feature is now deprecated and emits
  a warning][cargo/4364]


Misc
----
- [Cargo docs are moving][43916]
  to [doc.rust-lang.org/cargo](https://doc.rust-lang.org/cargo)
- [The rustdoc book is now available][43863]
  at [doc.rust-lang.org/rustdoc](https://doc.rust-lang.org/rustdoc)
- [Added a preview of RLS has been made available through rustup][44204]
  Install with `rustup component add rls-preview`
- [`std::os` documentation for Unix, Linux, and Windows now appears on doc.rust-lang.org][43348]
  Previously only showed `std::os::unix`.

Compatibility Notes
-------------------
- [Changes in method matching against higher-ranked types][43880] This may cause
  breakage in subtyping corner cases. [A more in-depth explanation is available.][info/43880]
- [rustc's JSON error output's byte position start at top of file.][42973]
  Was previously relative to the rustc's internal `CodeMap` struct which
  required the unstable library `libsyntax` to correctly use.
- [`unused_results` lint no longer ignores booleans][43728]

[42565]: rust-lang/rust#42565
[42973]: rust-lang/rust#42973
[43348]: rust-lang/rust#43348
[43459]: rust-lang/rust#43459
[43506]: rust-lang/rust#43506
[43540]: rust-lang/rust#43540
[43690]: rust-lang/rust#43690
[43728]: rust-lang/rust#43728
[43838]: rust-lang/rust#43838
[43863]: rust-lang/rust#43863
[43880]: rust-lang/rust#43880
[43911]: rust-lang/rust#43911
[43916]: rust-lang/rust#43916
[43917]: rust-lang/rust#43917
[44204]: rust-lang/rust#44204
[cargo/4123]: rust-lang/cargo#4123
[cargo/4216]: rust-lang/cargo#4216
[cargo/4270]: rust-lang/cargo#4270
[cargo/4335]: rust-lang/cargo#4335
[cargo/4364]: rust-lang/cargo#4364
[cargo/4400]: rust-lang/cargo#4400
[RFC 1969]: rust-lang/rfcs#1969
[info/43880]: rust-lang/rust#44224 (comment)
[`std::mem::discriminant`]: https://doc.rust-lang.org/std/mem/fn.discriminant.html
@ehuss ehuss added this to the 1.21.0 milestone Feb 6, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

allow installation of multiple packages in one line
5 participants