about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDylan DPC <99973273+Dylan-DPC@users.noreply.github.com>2023-01-30 15:11:45 +0530
committerGitHub <noreply@github.com>2023-01-30 15:11:45 +0530
commit4e5cfabd08aa906248aedea3ac61c0eb2a7cc727 (patch)
tree82a86af2c6b5e1b1976bf81d685a7be44797ae4e /src
parent28340bab88507a80c326422933eb3e17558ab915 (diff)
parent6a3ebe6adc58b60cf963b2dd314bc84afd59a0a2 (diff)
downloadrust-4e5cfabd08aa906248aedea3ac61c0eb2a7cc727.tar.gz
rust-4e5cfabd08aa906248aedea3ac61c0eb2a7cc727.zip
Rollup merge of #106106 - jyn514:remote-tracking-branch, r=Mark-Simulacrum
Pass `branch.{branch}.remote=origin` to `git submodule update`

This works around a bug in git itself.
Fixes https://github.com/rust-lang/rust/issues/101144.
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/lib.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 3b9dba4109d..3a0be7a8535 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -110,7 +110,7 @@ use std::fs::{self, File};
 use std::io;
 use std::io::ErrorKind;
 use std::path::{Path, PathBuf};
-use std::process::Command;
+use std::process::{Command, Stdio};
 use std::str;
 
 use build_helper::ci::CiEnv;
@@ -662,12 +662,32 @@ impl Build {
 
         // Try passing `--progress` to start, then run git again without if that fails.
         let update = |progress: bool| {
-            let mut git = Command::new("git");
+            // Git is buggy and will try to fetch submodules from the tracking branch for *this* repository,
+            // even though that has no relation to the upstream for the submodule.
+            let current_branch = {
+                let output = self
+                    .config
+                    .git()
+                    .args(["symbolic-ref", "--short", "HEAD"])
+                    .stderr(Stdio::inherit())
+                    .output();
+                let output = t!(output);
+                if output.status.success() {
+                    Some(String::from_utf8(output.stdout).unwrap().trim().to_owned())
+                } else {
+                    None
+                }
+            };
+
+            let mut git = self.config.git();
+            if let Some(branch) = current_branch {
+                git.arg("-c").arg(format!("branch.{branch}.remote=origin"));
+            }
             git.args(&["submodule", "update", "--init", "--recursive", "--depth=1"]);
             if progress {
                 git.arg("--progress");
             }
-            git.arg(relative_path).current_dir(&self.config.src);
+            git.arg(relative_path);
             git
         };
         // NOTE: doesn't use `try_run` because this shouldn't print an error if it fails.