@@ -45,13 +45,25 @@ const MSYS_USR_VARIANTS: &[&str] = &["mingw64", "mingw32", "clangarm64", "clang6
4545///
4646/// Currently this is used only for finding the path to an `sh.exe` associated with Git. This is
4747/// separate from `installation_config()` and `installation_config_prefix()` in `gix_path::env`.
48+ /// This is *not* suitable for finding the highest-scoped configuration file, because that could be
49+ /// installed in an unusual place, or customized via `GIT_CONFIG_SYSTEM` or `GIT_CONFIG_NOSYSTEM`,
50+ /// all of which `installation_config()` should reflect. Likewise, `installation_config_prefix()`
51+ /// has strong uses, such as to find a directory inside `ProgramData` containing configuration.
52+ /// But it is possible that some marginal uses of `installation_config_prefix()`, if they do not
53+ /// really relate to configuration, could be replaced with `git_for_windows_root()` in the future.
4854fn git_for_windows_root ( ) -> Option < & ' static Path > {
4955 static GIT_ROOT : Lazy < Option < PathBuf > > = Lazy :: new ( || {
5056 super :: core_dir ( )
51- . filter ( |core| core. is_absolute ( ) && core. ends_with ( "libexec/git-core" ) )
57+ . filter ( |core| {
58+ // Only use this if the directory structure resembles a Git installation. This
59+ // accepts installations of common types that are not broken when `GIT_EXEC_PATH`
60+ // is unset, as well as values of `GIT_EXEC_PATH` that are likely to be usable.
61+ core. is_absolute ( ) && core. ends_with ( "libexec/git-core" )
62+ } )
5263 . and_then ( |core| core. ancestors ( ) . nth ( 2 ) )
5364 . filter ( |prefix| {
5465 // Only use `libexec/git-core` from inside something `usr`-like, such as `mingw64`.
66+ // See `MSYS_USR_VARIANTS` for details and the rationale for this restriction.
5567 MSYS_USR_VARIANTS . iter ( ) . any ( |name| prefix. ends_with ( name) )
5668 } )
5769 . and_then ( |prefix| prefix. parent ( ) )
0 commit comments