Find a file
Alex Crichton a46df8fe7d Update the progress bar for parallel downloads
This is actually a super tricky problem. We don't really have the capacity for
more than one line of update-able information in Cargo right now, so we need to
squeeze a lot of information into one line of output for Cargo. The main
constraints this tries to satisfy are:

* At all times it should be clear what's happening. Cargo shouldn't just hang
  with no output when downloading a crate for a long time, a counter ideally
  needs to be decreasing while the download progresses.

* If a progress bar is shown, it shouldn't jump around. This ends up just being
  a surprising user experience for most. Progress bars should only ever
  increase, but they may increase at different speeds.

* Cargo has, currently, at most one line of output (as mentioned above) to pack
  information into. We haven't delved into fancier terminal features that
  involve multiple lines of update-able output.

* When downloading crates as part of `cargo build` (the norm) we don't actually
  know ahead of time how many crates are being downloaded. We rely on the
  calculation of unit dependencies to naturally feed into downloading more
  crates.

* Furthermore, once we decide to download a crate, we don't actually know how
  big it is! We have to wait for the server to tell us how big it is.

There doesn't really seem to be a great solution that satisfies all of these
constraints unfortunately. As a result this commit implements a relatively
conservative solution which should hopefully get us most of the way there. There
isn't actually a progress bar but rather Cargo prints that it's got N crates
left to download, and if it takes awhile it prints out that there are M bytes
remaining.

Unfortunately the progress is pretty choppy and jerky, not providing a smooth
UI. This appears to largely be because Cargo will synchronously extract
tarballs, which for large crates can cause a noticeable pause. Cargo's not
really prepared internally to perform this work on helper threads, but ideally
if it could do so it would improve the output quite a bit! (making it much
smoother and also able to account for the time tarball extraction takes).
2018-09-18 11:33:18 -07:00
.github typo 2018-09-16 21:04:15 +01:00
src Update the progress bar for parallel downloads 2018-09-18 11:33:18 -07:00
tests/testsuite Move downloading crates higher up in Cargo 2018-09-18 11:33:04 -07:00
.gitignore Delete Cargo.lock from this repo 2017-10-18 07:43:15 -07:00
.travis.yml Disable master in CI. 2018-09-18 07:18:41 -07:00
appveyor.yml Disable master in CI. 2018-09-18 07:18:41 -07:00
ARCHITECTURE.md Migrate some architecture notes from the wiki 2018-09-04 10:13:17 +01:00
Cargo.toml Update the progress bar for parallel downloads 2018-09-18 11:33:18 -07:00
CONTRIBUTING.md Fix rustfmt instructions in CONTRIBUTING.md 2018-08-09 21:21:13 +01:00
LICENSE-APACHE Add the standard Rust Apache/MIT license 2014-06-24 12:26:13 -07:00
LICENSE-MIT Remove inaccurate (misattributed) copyright notices 2017-07-26 17:19:24 -07:00
LICENSE-THIRD-PARTY Clean whitespace 2015-10-06 13:15:40 -04:00
README.md Auto merge of #5381 - dwijnand:github-casing, r=alexcrichton 2018-04-18 01:47:40 +00:00

Cargo

Cargo downloads your Rust projects dependencies and compiles your project.

Learn more at https://doc.rust-lang.org/cargo/

Code Status

Build Status Build Status

Code documentation: https://docs.rs/cargo/

Installing Cargo

Cargo is distributed by default with Rust, so if you've got rustc installed locally you probably also have cargo installed locally.

Compiling from Source

Cargo requires the following tools and packages to build:

  • python
  • curl (on Unix)
  • cmake
  • OpenSSL headers (only for Unix, this is the libssl-dev package on ubuntu)
  • cargo and rustc

First, you'll want to check out this repository

git clone https://github.com/rust-lang/cargo
cd cargo

With cargo already installed, you can simply run:

cargo build --release

Adding new subcommands to Cargo

Cargo is designed to be extensible with new subcommands without having to modify Cargo itself. See the Wiki page for more details and a list of known community-developed subcommands.

Releases

High level release notes are available as part of Rust's release notes. Cargo releases coincide with Rust releases.

Reporting issues

Found a bug? We'd love to know about it!

Please report all issues on the GitHub issue tracker.

Contributing

See CONTRIBUTING.md. You may also find the architecture documentation useful (ARCHITECTURE.md).

License

Cargo is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.

Third party software

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).

In binary form, this product includes software that is licensed under the terms of the GNU General Public License, version 2, with a linking exception, which can be obtained from the upstream repository.

See LICENSE-THIRD-PARTY for details.