Skip to content
  • Johannes Schindelin's avatar
    t2300: "git --exec-path" is not usable in $PATH on Windows as-is · 412b9a16
    Johannes Schindelin authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The "git" command prepends the exec-path to the PATH environment
    variable for processes it spawns.  That is how ". git-sh-setup" in
    our scripted Porcelains can find the dot-sourced file in the
    exec-path location that is not usually on user's PATH.
    
    When t2300 runs, because it is not spawned by the "git" command, the
    scriptlet being tested did not run with a realistic setting of PATH
    environment.  It lacked the exec-path on the PATH, and failed to
    find the dot-sourced file.  A recent update to t2300 attempted to
    fix this, with "PATH=$(git --exec-path):$PATH", which has been the
    recommended way around v1.6.0 days (a script whose original was
    written before that release that survives to this day is likely to
    have such a line).
    
    However, the "git --exec-path" command outputs C:\path\to\exec\dir
    (not /c/path/to/exec/dir) on Windows; the recent update failed to
    consider the problem that comes from it.
    
    Even though Git itself, when doing the equivalent internally, does
    so in a platform native way (i.e. on Windows, C:\path\to\exec\dir is
    prepended to the existing value of %PATH% using ';' as a component
    separator), the result is further massaged by bash and gets turned
    into $PATH that uses /c/path/to/exec/dir with ':' separating the
    components, which is the form understood by bash, so scripted
    Porcelains find commands from PATH correctly.
    
    An end user script written in shell, however, cannot prepend
    "C:\path\to\exec\dir:" to the existing value of $PATH and expect
    bash to magically turn it into the form it understands.  In other
    words, "PATH=$(git --exec-path):$PATH" does not work as an emulation
    of what "Git" internally does to the PATH on Windows.
    
    To correctly emulate how exec-path is prepended to the PATH
    environment internally on Windows, we'd need to convert
    C:\git-sdk-64\usr\src\git to at least /c\git-sdk-64\usr\src\git
    ourselves before prepending it to PATH.
    
    Signed-off-by: default avatarJohannes Schindelin <johannes.schindelin@gmx.de>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    412b9a16