Skip to content

Commit

Permalink
Auto merge of #3092 - jhbabon:fix/dont-panic-on-workspaces, r=alexcri…
Browse files Browse the repository at this point in the history
…chton

FIX: Don't try to generate Gargo.lock on empty workspaces.

There was a `panic!` when the command `cargo update` was executed in a workspace like this:

    mkdir ws
    cd ws
    echo '[workspace]' > Cargo.toml
    cargo new p1
    cargo new p2
    cargo update

The problem is that cargo tries to generate the `Cargo.lock` file even if there aren't any members on the workspace.

This fix checks the existence of members in the workspace before trying to do anything so at least we report an error instead of throwing a `panic!`.

Issue related #3080
  • Loading branch information
bors authored Sep 14, 2016
2 parents 7f642f5 + 015e797 commit 9399229
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/cargo/core/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ impl<'cfg> Workspace<'cfg> {
Ok(ws)
}

/// Creates a "tempoarary workspace" from one package which only contains
/// Creates a "temporary workspace" from one package which only contains
/// that package.
///
/// This constructor will not touch the filesystem and only creates an
Expand Down Expand Up @@ -464,6 +464,12 @@ impl<'cfg> Packages<'cfg> {
}
}

impl<'a, 'cfg> Members<'a, 'cfg> {
pub fn is_empty(self) -> bool {
self.count() == 0
}
}

impl<'a, 'cfg> Iterator for Members<'a, 'cfg> {
type Item = &'a Package;

Expand Down
4 changes: 4 additions & 0 deletions src/cargo/ops/cargo_generate_lockfile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions)
bail!("cannot specify both aggressive and precise simultaneously")
}

if ws.members().is_empty() {
bail!("you can't generate a lockfile for an empty workspace.")
}

let previous_resolve = match try!(ops::load_pkg_lockfile(ws)) {
Some(resolve) => resolve,
None => return generate_lockfile(ws),
Expand Down
22 changes: 22 additions & 0 deletions tests/workspaces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -940,3 +940,25 @@ fn lockfile_can_specify_nonexistant_members() {

assert_that(p.cargo("build").cwd(p.root().join("a")), execs().with_status(0));
}

#[test]
fn you_cannot_generate_lockfile_for_empty_workspaces() {
let p = project("foo")
.file("Cargo.toml", r#"
[workspace]
"#)
.file("bar/Cargo.toml", r#"
[project]
name = "foo"
version = "0.1.0"
authors = []
"#)
.file("bar/src/main.rs", "fn main() {}");
p.build();

assert_that(p.cargo("update"),
execs().with_status(101)
.with_stderr("\
error: you can't generate a lockfile for an empty workspace.
"));
}

0 comments on commit 9399229

Please sign in to comment.