@@ -583,12 +583,16 @@ fn scripted_fixture_read_only_with_args_inner(
583
583
Ok ( script_result_directory)
584
584
}
585
585
586
+ #[ cfg( windows) ]
587
+ const NULL_DEVICE : & str = "NUL" ;
588
+ #[ cfg( not( windows) ) ]
589
+ const NULL_DEVICE : & str = "/dev/null" ;
590
+
586
591
fn configure_command < ' a > (
587
592
cmd : & ' a mut std:: process:: Command ,
588
593
args : & [ String ] ,
589
594
script_result_directory : & Path ,
590
595
) -> & ' a mut std:: process:: Command {
591
- let never_path = if cfg ! ( windows) { "-" } else { ":" } ;
592
596
let mut msys_for_git_bash_on_windows = std:: env:: var ( "MSYS" ) . unwrap_or_default ( ) ;
593
597
msys_for_git_bash_on_windows. push_str ( " winsymlinks:nativestrict" ) ;
594
598
cmd. args ( args)
@@ -599,8 +603,8 @@ fn configure_command<'a>(
599
603
. env_remove ( "GIT_ASKPASS" )
600
604
. env_remove ( "SSH_ASKPASS" )
601
605
. env ( "MSYS" , msys_for_git_bash_on_windows)
602
- . env ( "GIT_CONFIG_SYSTEM" , never_path )
603
- . env ( "GIT_CONFIG_GLOBAL" , never_path )
606
+ . env ( "GIT_CONFIG_SYSTEM" , NULL_DEVICE )
607
+ . env ( "GIT_CONFIG_GLOBAL" , NULL_DEVICE )
604
608
. env ( "GIT_TERMINAL_PROMPT" , "false" )
605
609
. env ( "GIT_AUTHOR_DATE" , "2000-01-01 00:00:00 +0000" )
606
610
. env ( "GIT_AUTHOR_EMAIL" , "[email protected] " )
@@ -882,4 +886,55 @@ mod tests {
882
886
fn parse_version_with_trailing_newline ( ) {
883
887
assert_eq ! ( git_version_from_bytes( b"git version 2.37.2\n " ) . unwrap( ) , ( 2 , 37 , 2 ) ) ;
884
888
}
889
+
890
+ const SCOPE_ENV_VALUE : & str = "gitconfig" ;
891
+
892
+ fn populate_ad_hoc_config_files ( dir : & Path ) {
893
+ const CONFIG_DATA : & [ u8 ] = b"[foo]\n \t bar = baz\n " ;
894
+
895
+ let paths: & [ PathBuf ] = if cfg ! ( windows) {
896
+ let unc_literal_nul = dir. canonicalize ( ) . expect ( "directory exists" ) . join ( "NUL" ) ;
897
+ & [ dir. join ( SCOPE_ENV_VALUE ) , dir. join ( "-" ) , unc_literal_nul]
898
+ } else {
899
+ & [ dir. join ( SCOPE_ENV_VALUE ) , dir. join ( "-" ) , dir. join ( ":" ) ]
900
+ } ;
901
+
902
+ // Create the files.
903
+ for path in paths {
904
+ std:: fs:: write ( path, CONFIG_DATA ) . expect ( "can write contents" ) ;
905
+ }
906
+
907
+ // Verify the files. This is mostly to show we really made a `\\?\...\NUL` on Windows.
908
+ for path in paths {
909
+ let buf = std:: fs:: read ( path) . expect ( "the file really exists" ) ;
910
+ assert_eq ! ( buf, CONFIG_DATA , "File {path:?} should be created" ) ;
911
+ }
912
+ }
913
+
914
+ fn check_configure_clears_scope ( scope_env_key : & str , scope_option : & str ) {
915
+ let temp = tempfile:: TempDir :: new ( ) . expect ( "can create temp dir" ) ;
916
+ let dir = temp. path ( ) ;
917
+ populate_ad_hoc_config_files ( dir) ;
918
+
919
+ let mut cmd = std:: process:: Command :: new ( "git" ) ;
920
+ cmd. env ( scope_env_key, SCOPE_ENV_VALUE ) ; // configure_command() should override it.
921
+ let args = [ "config" , "-l" , "--show-origin" , scope_option] . map ( String :: from) ;
922
+ configure_command ( & mut cmd, & args, dir) ;
923
+
924
+ let output = cmd. output ( ) . expect ( "can run git" ) ;
925
+ let stdout = output. stdout . to_str ( ) . expect ( "valid UTF-8" ) ;
926
+ let status = output. status . code ( ) . expect ( "terminated normally" ) ;
927
+ assert_eq ! ( stdout, "" , "should be no config variables to display" ) ;
928
+ assert_eq ! ( status, 0 , "reading the config should nonetheless succeed" ) ;
929
+ }
930
+
931
+ #[ test]
932
+ fn configure_command_clears_system_scope ( ) {
933
+ check_configure_clears_scope ( "GIT_CONFIG_SYSTEM" , "--system" ) ;
934
+ }
935
+
936
+ #[ test]
937
+ fn configure_command_clears_global_scope ( ) {
938
+ check_configure_clears_scope ( "GIT_CONFIG_GLOBAL" , "--global" ) ;
939
+ }
885
940
}
0 commit comments