about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbinarycat <binarycat@envs.net>2024-08-25 13:25:27 -0400
committerbinarycat <binarycat@envs.net>2024-08-27 15:30:17 -0400
commit94e9c4cd64f9f30e46be5a149f90205d7096c104 (patch)
treedf4cfaab181e97a34b4e10beb190b467da2311e4
parent600edc948ab5de7a92538bcc2f49cb8d47925e2d (diff)
downloadrust-94e9c4cd64f9f30e46be5a149f90205d7096c104.tar.gz
rust-94e9c4cd64f9f30e46be5a149f90205d7096c104.zip
warn the user if the upstream master branch is old
fixes https://github.com/rust-lang/rust/issues/129528
-rw-r--r--src/bootstrap/src/core/build_steps/format.rs5
-rw-r--r--src/tools/build_helper/src/git.rs34
2 files changed, 37 insertions, 2 deletions
diff --git a/src/bootstrap/src/core/build_steps/format.rs b/src/bootstrap/src/core/build_steps/format.rs
index 8c52df78ab6..1e78583476a 100644
--- a/src/bootstrap/src/core/build_steps/format.rs
+++ b/src/bootstrap/src/core/build_steps/format.rs
@@ -7,7 +7,7 @@ use std::sync::mpsc::SyncSender;
 use std::sync::Mutex;
 
 use build_helper::ci::CiEnv;
-use build_helper::git::get_git_modified_files;
+use build_helper::git::{get_git_modified_files, warn_old_master_branch};
 use ignore::WalkBuilder;
 
 use crate::core::builder::Builder;
@@ -93,7 +93,8 @@ fn get_modified_rs_files(build: &Builder<'_>) -> Result<Option<Vec<String>>, Str
     if !verify_rustfmt_version(build) {
         return Ok(None);
     }
-
+    warn_old_master_branch(&build.config.git_config(), &build.config.src)
+        .map_err(|e| e.to_string())?;
     get_git_modified_files(&build.config.git_config(), Some(&build.config.src), &["rs"])
 }
 
diff --git a/src/tools/build_helper/src/git.rs b/src/tools/build_helper/src/git.rs
index da84569c778..cc48a8964a3 100644
--- a/src/tools/build_helper/src/git.rs
+++ b/src/tools/build_helper/src/git.rs
@@ -159,3 +159,37 @@ pub fn get_git_untracked_files(
         .collect();
     Ok(Some(files))
 }
+
+/// Print a warning if the branch returned from `updated_master_branch` is old
+///
+/// For certain configurations of git repository, this remote will not be
+/// updated when running `git pull`.
+///
+/// This can result in formatting thousands of files instead of a dozen,
+/// so we should warn the user something is wrong.
+pub fn warn_old_master_branch(
+    config: &GitConfig<'_>,
+    git_dir: &Path,
+) -> Result<(), Box<dyn std::error::Error>> {
+    use std::time::Duration;
+    const WARN_AFTER: Duration = Duration::from_secs(60 * 60 * 24 * 10);
+    let updated_master = updated_master_branch(config, Some(git_dir))?;
+    let branch_path = git_dir.join(".git/refs/remotes").join(&updated_master);
+    match std::fs::metadata(branch_path) {
+        Ok(meta) => {
+            if meta.modified()?.elapsed()? > WARN_AFTER {
+                eprintln!("warning: {updated_master} has not been updated in 10 days");
+            } else {
+                return Ok(());
+            }
+        }
+        Err(err) => {
+            eprintln!("warning: unable to check if {updated_master} is old due to error: {err}")
+        }
+    }
+    eprintln!(
+        "warning: {updated_master} is used to determine if files have been modified\n\
+               warning: if it is not updated, this may cause files to be needlessly reformatted"
+    );
+    Ok(())
+}