Skip to content

Commit

Permalink
Auto merge of #8725 - chaaz:master, r=ehuss
Browse files Browse the repository at this point in the history
Add "--workspace" to update command

My `--bin` project has CI which updates the version number in `Cargo.toml`, which it then commits. However, this means that any further cargo command (`build`, `test`, etc) will update the existing `Cargo.lock` file (updating the root version), causing some frustration for users. Furthermore, it breaks the `publish` command, which requires the repo to be current.

I've added a `sync-lockfile` command to simply update the root version in the `Cargo.lock` file to match the `Cargo.toml` in the same way that simple commands like `fetch` do. If no `Cargo.lock` file is present, and new one is generated based on the index.

This is a demo PR for Pre-RFC conversation at https://internals.rust-lang.org/t/pre-rfc-cargo-command-to-just-sync-lockfile/13119, but may become a real PR if it gets approval.
  • Loading branch information
bors committed Dec 2, 2020
2 parents cee17c2 + 42f3469 commit 63d0fe4
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/bin/cargo/commands/update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ pub fn cli() -> App {
subcommand("update")
.about("Update dependencies as recorded in the local lock file")
.arg(opt("quiet", "No output printed to stdout").short("q"))
.arg(opt("workspace", "Only update the workspace packages").short("w"))
.arg_package_spec_simple("Package to update")
.arg(opt(
"aggressive",
Expand All @@ -30,6 +31,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
precise: args.value_of("precise"),
to_update: values(args, "package"),
dry_run: args.is_present("dry-run"),
workspace: args.is_present("workspace"),
config,
};
ops::update_lockfile(&ws, &update_opts)?;
Expand Down
7 changes: 5 additions & 2 deletions src/cargo/ops/cargo_generate_lockfile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub struct UpdateOptions<'a> {
pub precise: Option<&'a str>,
pub aggressive: bool,
pub dry_run: bool,
pub workspace: bool,
}

pub fn generate_lockfile(ws: &Workspace<'_>) -> CargoResult<()> {
Expand Down Expand Up @@ -78,8 +79,10 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
let mut to_avoid = HashSet::new();

if opts.to_update.is_empty() {
to_avoid.extend(previous_resolve.iter());
to_avoid.extend(previous_resolve.unused_patches());
if !opts.workspace {
to_avoid.extend(previous_resolve.iter());
to_avoid.extend(previous_resolve.unused_patches());
}
} else {
let mut sources = Vec::new();
for name in opts.to_update.iter() {
Expand Down
7 changes: 7 additions & 0 deletions src/doc/man/cargo-update.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ the package to. If the package comes from a git repository, this can be a git
revision (such as a SHA hash or tag).
{{/option}}

{{#option "`-w`" "`--workspace`" }}
Attempt to update only packages defined in the workspace. Other packages
are updated only if they don't already exist in the lockfile. This
option is useful for updating `Cargo.lock` after you've changed version
numbers in `Cargo.toml`.
{{/option}}

{{#option "`--dry-run`" }}
Displays what would be updated, but doesn't actually write the lockfile.
{{/option}}
Expand Down
6 changes: 6 additions & 0 deletions src/doc/man/generated_txt/cargo-update.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ OPTIONS
to set the package to. If the package comes from a git repository,
this can be a git revision (such as a SHA hash or tag).

-w, --workspace
Attempt to update only packages defined in the workspace. Other
packages are updated only if they don't already exist in the
lockfile. This option is useful for updating Cargo.lock after you've
changed version numbers in Cargo.toml.

--dry-run
Displays what would be updated, but doesn't actually write the
lockfile.
Expand Down
8 changes: 8 additions & 0 deletions src/doc/src/commands/cargo-update.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ the package to. If the package comes from a git repository, this can be a git
revision (such as a SHA hash or tag).</dd>


<dt class="option-term" id="option-cargo-update--w"><a class="option-anchor" href="#option-cargo-update--w"></a><code>-w</code></dt>
<dt class="option-term" id="option-cargo-update---workspace"><a class="option-anchor" href="#option-cargo-update---workspace"></a><code>--workspace</code></dt>
<dd class="option-desc">Attempt to update only packages defined in the workspace. Other packages
are updated only if they don't already exist in the lockfile. This
option is useful for updating <code>Cargo.lock</code> after you've changed version
numbers in <code>Cargo.toml</code>.</dd>


<dt class="option-term" id="option-cargo-update---dry-run"><a class="option-anchor" href="#option-cargo-update---dry-run"></a><code>--dry-run</code></dt>
<dd class="option-desc">Displays what would be updated, but doesn't actually write the lockfile.</dd>

Expand Down
9 changes: 9 additions & 0 deletions src/etc/man/cargo-update.1
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,15 @@ the package to. If the package comes from a git repository, this can be a git
revision (such as a SHA hash or tag).
.RE
.sp
\fB\-w\fR,
\fB\-\-workspace\fR
.RS 4
Attempt to update only packages defined in the workspace. Other packages
are updated only if they don't already exist in the lockfile. This
option is useful for updating \fBCargo.lock\fR after you've changed version
numbers in \fBCargo.toml\fR\&.
.RE
.sp
\fB\-\-dry\-run\fR
.RS 4
Displays what would be updated, but doesn't actually write the lockfile.
Expand Down
25 changes: 25 additions & 0 deletions tests/testsuite/update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -651,3 +651,28 @@ fn dry_run_update() {
let new_lockfile = p.read_lockfile();
assert_eq!(old_lockfile, new_lockfile)
}

#[cargo_test]
fn workspace_only() {
let p = project().file("src/main.rs", "fn main() {}").build();
p.cargo("generate-lockfile").run();
let lock1 = p.read_lockfile();

p.change_file(
"Cargo.toml",
r#"
[package]
name = "foo"
authors = []
version = "0.0.2"
"#,
);
p.cargo("update --workspace").run();
let lock2 = p.read_lockfile();

assert_ne!(lock1, lock2);
assert!(lock1.contains("0.0.1"));
assert!(lock2.contains("0.0.2"));
assert!(!lock1.contains("0.0.2"));
assert!(!lock2.contains("0.0.1"));
}

0 comments on commit 63d0fe4

Please sign in to comment.