@@ -509,6 +509,12 @@ impl Build {
509
509
if !self . config . submodules ( self . rust_info ( ) ) {
510
510
return ;
511
511
}
512
+ if env:: var_os ( "GIT_DIR" ) . is_some ( ) {
513
+ // GIT_DIR is set when we are running inside a git invocation, e.g. in a commit hook.
514
+ // Skip submodule processing as messing with the git state here can have "fun" results.
515
+ // Also see the discussion in <https://github.com/rust-lang/rust/pull/126255>.
516
+ return ;
517
+ }
512
518
513
519
let absolute_path = self . config . src . join ( relative_path) ;
514
520
@@ -520,34 +526,29 @@ impl Build {
520
526
return ;
521
527
}
522
528
523
- // check_submodule
524
- let checked_out_hash =
525
- output ( Command :: new ( "git" ) . args ( [ "rev-parse" , "HEAD" ] ) . current_dir ( & absolute_path) ) ;
526
- // update_submodules
527
- let recorded = output (
528
- Command :: new ( "git" )
529
- . args ( [ "ls-tree" , "HEAD" ] )
530
- . arg ( relative_path)
531
- . current_dir ( & self . config . src ) ,
532
- ) ;
529
+ let submodule_git = || {
530
+ let mut cmd = Command :: new ( "git" ) ;
531
+ cmd. current_dir ( & absolute_path) ;
532
+ cmd
533
+ } ;
534
+
535
+ // Determine commit checked out in submodule.
536
+ let checked_out_hash = output ( submodule_git ( ) . args ( [ "rev-parse" , "HEAD" ] ) ) ;
537
+ let checked_out_hash = checked_out_hash. trim_end ( ) ;
538
+ // Determine commit that the submodule *should* have.
539
+ let recorded = output ( self . config . git ( ) . args ( [ "ls-tree" , "HEAD" ] ) . arg ( relative_path) ) ;
533
540
let actual_hash = recorded
534
541
. split_whitespace ( )
535
542
. nth ( 2 )
536
543
. unwrap_or_else ( || panic ! ( "unexpected output `{}`" , recorded) ) ;
537
544
538
- // update_submodule
539
- if actual_hash == checked_out_hash. trim_end ( ) {
545
+ if actual_hash == checked_out_hash {
540
546
// already checked out
541
547
return ;
542
548
}
543
549
544
550
println ! ( "Updating submodule {}" , relative_path. display( ) ) ;
545
- self . run (
546
- Command :: new ( "git" )
547
- . args ( [ "submodule" , "-q" , "sync" ] )
548
- . arg ( relative_path)
549
- . current_dir ( & self . config . src ) ,
550
- ) ;
551
+ self . run ( self . config . git ( ) . args ( [ "submodule" , "-q" , "sync" ] ) . arg ( relative_path) ) ;
551
552
552
553
// Try passing `--progress` to start, then run git again without if that fails.
553
554
let update = |progress : bool | {
@@ -590,26 +591,22 @@ impl Build {
590
591
// Save any local changes, but avoid running `git stash pop` if there are none (since it will exit with an error).
591
592
// diff-index reports the modifications through the exit status
592
593
let has_local_modifications = !self . run_cmd (
593
- BootstrapCommand :: from (
594
- Command :: new ( "git" )
595
- . args ( [ "diff-index" , "--quiet" , "HEAD" ] )
596
- . current_dir ( & absolute_path) ,
597
- )
598
- . allow_failure ( )
599
- . output_mode ( match self . is_verbose ( ) {
600
- true => OutputMode :: PrintAll ,
601
- false => OutputMode :: PrintOutput ,
602
- } ) ,
594
+ BootstrapCommand :: from ( submodule_git ( ) . args ( [ "diff-index" , "--quiet" , "HEAD" ] ) )
595
+ . allow_failure ( )
596
+ . output_mode ( match self . is_verbose ( ) {
597
+ true => OutputMode :: PrintAll ,
598
+ false => OutputMode :: PrintOutput ,
599
+ } ) ,
603
600
) ;
604
601
if has_local_modifications {
605
- self . run ( Command :: new ( "git" ) . args ( [ "stash" , "push" ] ) . current_dir ( & absolute_path ) ) ;
602
+ self . run ( submodule_git ( ) . args ( [ "stash" , "push" ] ) ) ;
606
603
}
607
604
608
- self . run ( Command :: new ( "git" ) . args ( [ "reset" , "-q" , "--hard" ] ) . current_dir ( & absolute_path ) ) ;
609
- self . run ( Command :: new ( "git" ) . args ( [ "clean" , "-qdfx" ] ) . current_dir ( & absolute_path ) ) ;
605
+ self . run ( submodule_git ( ) . args ( [ "reset" , "-q" , "--hard" ] ) ) ;
606
+ self . run ( submodule_git ( ) . args ( [ "clean" , "-qdfx" ] ) ) ;
610
607
611
608
if has_local_modifications {
612
- self . run ( Command :: new ( "git" ) . args ( [ "stash" , "pop" ] ) . current_dir ( absolute_path ) ) ;
609
+ self . run ( submodule_git ( ) . args ( [ "stash" , "pop" ] ) ) ;
613
610
}
614
611
}
615
612
0 commit comments