@@ -204,29 +204,59 @@ pub fn get_git_untracked_files(
204
204
///
205
205
/// This can result in formatting thousands of files instead of a dozen,
206
206
/// so we should warn the user something is wrong.
207
- pub fn warn_old_master_branch(
208
- config: &GitConfig<'_>,
209
- git_dir: &Path,
210
- ) -> Result<(), Box<dyn std::error::Error>> {
211
- use std::time::Duration;
212
- const WARN_AFTER: Duration = Duration::from_secs(60 * 60 * 24 * 10);
213
- let updated_master = updated_master_branch(config, Some(git_dir))?;
214
- let branch_path = git_dir.join(".git/refs/remotes").join(&updated_master);
215
- match std::fs::metadata(branch_path) {
216
- Ok(meta) => {
217
- if meta.modified()?.elapsed()? > WARN_AFTER {
218
- eprintln!("warning: {updated_master} has not been updated in 10 days");
219
- } else {
220
- return Ok(());
207
+ pub fn warn_old_master_branch(config: &GitConfig<'_>, git_dir: &Path) {
208
+ if crate::ci::CiEnv::is_ci() {
209
+ // this warning is useless in CI,
210
+ // and CI probably won't have the right branches anyway.
211
+ return;
212
+ }
213
+ // this will be overwritten by the actual name, if possible
214
+ let mut updated_master = "the upstream master branch".to_string();
215
+ match warn_old_master_branch_(config, git_dir, &mut updated_master) {
216
+ Ok(branch_is_old) => {
217
+ if !branch_is_old {
218
+ return;
221
219
}
220
+ // otherwise fall through and print the rest of the warning
222
221
}
223
222
Err(err) => {
224
223
eprintln!("warning: unable to check if {updated_master} is old due to error: {err}")
225
224
}
226
225
}
227
226
eprintln!(
228
227
"warning: {updated_master} is used to determine if files have been modified\n\
229
- warning: if it is not updated, this may cause files to be needlessly reformatted"
228
+ warning: if it is not updated, this may cause files to be needlessly reformatted"
230
229
);
231
- Ok(())
230
+ }
231
+
232
+ pub fn warn_old_master_branch_(
233
+ config: &GitConfig<'_>,
234
+ git_dir: &Path,
235
+ updated_master: &mut String,
236
+ ) -> Result<bool, Box<dyn std::error::Error>> {
237
+ use std::time::Duration;
238
+ *updated_master = updated_master_branch(config, Some(git_dir))?;
239
+ let branch_path = git_dir.join(".git/refs/remotes").join(&updated_master);
240
+ const WARN_AFTER: Duration = Duration::from_secs(60 * 60 * 24 * 10);
241
+ let meta = match std::fs::metadata(&branch_path) {
242
+ Ok(meta) => meta,
243
+ Err(err) => {
244
+ let gcd = git_common_dir(&git_dir)?;
245
+ if branch_path.starts_with(&gcd) {
246
+ return Err(Box::new(err));
247
+ }
248
+ std::fs::metadata(Path::new(&gcd).join("refs/remotes").join(&updated_master))?
249
+ }
250
+ };
251
+ if meta.modified()?.elapsed()? > WARN_AFTER {
252
+ eprintln!("warning: {updated_master} has not been updated in 10 days");
253
+ Ok(true)
254
+ } else {
255
+ Ok(false)
256
+ }
257
+ }
258
+
259
+ fn git_common_dir(dir: &Path) -> Result<String, String> {
260
+ output_result(Command::new("git").arg("-C").arg(dir).arg("rev-parse").arg("--git-common-dir"))
261
+ .map(|x| x.trim().to_string())
232
262
}
0 commit comments