diff --git a/src/cargo/sources/git/utils.rs b/src/cargo/sources/git/utils.rs index 4caab78801d..8e4cdadd449 100644 --- a/src/cargo/sources/git/utils.rs +++ b/src/cargo/sources/git/utils.rs @@ -195,11 +195,10 @@ impl GitDatabase { rev.clone())); match self.remote.rev_for(dest, "HEAD") { - Ok(ref head) if rev == *head => return Ok(checkout), + Ok(ref head) if rev == *head => {} _ => try!(checkout.fetch()), } - try!(checkout.reset()); try!(checkout.update_submodules()); Ok(checkout) @@ -284,6 +283,7 @@ impl GitCheckout { // In this case we just use `origin` here instead of the database path. git!(self.location, "fetch", "--force", "--quiet", "origin"); git!(self.location, "fetch", "--force", "--quiet", "--tags", "origin"); + try!(self.reset()); Ok(()) } diff --git a/tests/test_cargo_compile_git_deps.rs b/tests/test_cargo_compile_git_deps.rs index 0aea6702cc5..26c419bbe3a 100644 --- a/tests/test_cargo_compile_git_deps.rs +++ b/tests/test_cargo_compile_git_deps.rs @@ -674,3 +674,56 @@ test!(update_with_shared_deps { git = git_project.root().display(), compiling = COMPILING, dir = p.root().display()))); }) + +test!(dep_with_submodule { + let project = project("foo"); + let git_project = git_repo("dep1", |project| { + project + .file("Cargo.toml", r#" + [package] + name = "dep1" + version = "0.5.0" + authors = ["carlhuda@example.com"] + "#) + }).assert(); + let git_project2 = git_repo("dep2", |project| { + project + .file("lib.rs", "pub fn dep() {}") + }).assert(); + + git_project.process("git").args(["submodule", "add"]) + .arg(git_project2.root()).arg("src").exec_with_output().assert(); + git_project.process("git").args(["add", "."]).exec_with_output().assert(); + git_project.process("git").args(["commit", "-m", "test"]).exec_with_output() + .assert(); + + let project = project + .file("Cargo.toml", format!(r#" + [project] + + name = "foo" + version = "0.5.0" + authors = ["wycats@example.com"] + + [dependencies.dep1] + + git = 'file:{}' + "#, git_project.root().display())) + .file("src/lib.rs", " + extern crate dep1; + pub fn foo() { dep1::dep() } + "); + + let root = project.root(); + let git_root = git_project.root(); + + assert_that(project.cargo_process("cargo-build"), + execs() + .with_stdout(format!("{} git repository `file:{}`\n\ + {} dep1 v0.5.0 (file:{}#[..])\n\ + {} foo v0.5.0 (file:{})\n", + UPDATING, git_root.display(), + COMPILING, git_root.display(), + COMPILING, root.display())) + .with_stderr("")); +})