Skip to content

Commit

Permalink
Add patch for dev-lang/rust that fixes git problem in cargo
Browse files Browse the repository at this point in the history
This change adds a patch for a fix in cargo that causes the branches in
a git repository for a cargo managed project to potentially be messed up
during a rebase --exec cycle when a git fetch is invoked as part of the
command being executed.
This problem is tracked upstream as issue #7072 [1].

[1] rust-lang/cargo#7072
  • Loading branch information
d-e-s-o committed Jun 30, 2019
1 parent 21c6742 commit c0c6aaa
Showing 1 changed file with 92 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
From 00fd31dd9bc757d8b8a3c35466daec09aa965d83 Mon Sep 17 00:00:00 2001
From: Eric Huss <eric@huss.org>
Date: Sat, 29 Jun 2019 13:32:21 -0700
Subject: [PATCH] Clean environment when git-fetch-with-cli is used.

---
src/cargo/sources/git/utils.rs | 11 ++++++++
tests/testsuite/git.rs | 49 ++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+)

diff --git a/src/tools/cargo/src/cargo/sources/git/utils.rs b/src/tools/cargo/src/cargo/sources/git/utils.rs
index a71e49..5ad3ed 100644
--- a/src/tools/cargo/src/cargo/sources/git/utils.rs
+++ b/src/tools/cargo/src/cargo/sources/git/utils.rs
@@ -770,6 +770,17 @@ fn fetch_with_cli(
.arg("--update-head-ok") // see discussion in #2078
.arg(url.to_string())
.arg(refspec)
+ // If cargo is run by git (for example, the `exec` command in `git
+ // rebase`), the GIT_DIR is set by git and will point to the wrong
+ // location (this takes precedence over the cwd). Make sure this is
+ // unset so git will look at cwd for the repo.
+ .env_remove("GIT_DIR")
+ // The reset of these may not be necessary, but I'm including them
+ // just to be extra paranoid and avoid any issues.
+ .env_remove("GIT_WORK_TREE")
+ .env_remove("GIT_INDEX_FILE")
+ .env_remove("GIT_OBJECT_DIRECTORY")
+ .env_remove("GIT_ALTERNATE_OBJECT_DIRECTORIES")
.cwd(repo.path());
config
.shell()
diff --git a/src/tools/cargo/tests/testsuite/git.rs b/src/tools/cargo/tests/testsuite/git.rs
index 8cdd3f..9762ea 100644
--- a/src/tools/cargo/tests/testsuite/git.rs
+++ b/src/tools/cargo/tests/testsuite/git.rs
@@ -2694,3 +2694,52 @@ fn git_with_cli_force() {
p.cargo("build").run();
p.rename_run("foo", "foo2").with_stdout("two").run();
}
+
+#[cargo_test]
+fn git_fetch_cli_env_clean() {
+ if disable_git_cli() {
+ return;
+ }
+ // This tests that git-fetch-with-cli works when GIT_DIR environment
+ // variable is set (for whatever reason).
+ let git_dep = git::new("dep1", |project| {
+ project
+ .file("Cargo.toml", &basic_manifest("dep1", "0.5.0"))
+ .file("src/lib.rs", "")
+ })
+ .unwrap();
+
+ let git_proj = git::new("foo", |project| {
+ project
+ .file(
+ "Cargo.toml",
+ &format!(
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+ [dependencies]
+ dep1 = {{ git = '{}' }}
+ "#,
+ git_dep.url()
+ ),
+ )
+ .file("src/lib.rs", "pub extern crate dep1;")
+ .file(
+ ".cargo/config",
+ "
+ [net]
+ git-fetch-with-cli = true
+ ",
+ )
+ })
+ .unwrap();
+
+ // The directory set here isn't too important. Pointing to our own git
+ // directory causes git to be confused and fail. Can also point to an
+ // empty directory, or a nonexistent one.
+ git_proj
+ .cargo("fetch")
+ .env("GIT_DIR", git_proj.root().join(".git"))
+ .run();
+}
--
2.21.0

0 comments on commit c0c6aaa

Please sign in to comment.