From 4b20e4fc67735ce82bb47c60a6e8f46bbcb33127 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 18 Feb 2015 11:07:17 +0000 Subject: [PATCH 41/N] fixup! Add functionality for converting UNIX paths in arguments and environment variables to Windows form for native Win32 applications. Let's teach MSYS2's path conversion to leave Git's :name and :/message arguments alone, please. These arguments start with colons and are hence unlikely to contain a path list (a path list starting with a colon would start with an empty item?!?). Without this patch, you will see this: $ GIT_TRACE=1 /c/Program\ Files/Git/cmd/git version :/message 13:48:44.258390 exec-cmd.c:244 trace: resolved executable dir: C:/Program Files/Git/mingw64/bin 13:48:44.269314 git.c:463 trace: built-in: git version ';C:\msys64\message' git version 2.43.0.windows.1 In other words, the argument `:/message` is mangled in an undesired way. This addresses the expectations of the following test cases in the test suite of https://github.com/git/git/tree/v2.43.0: -t0060.81 :\\abc is an absolute path -t1501.35 Auto discovery -t1501.36 $GIT_DIR/common overrides core.worktree -t1501.37 $GIT_WORK_TREE overrides $GIT_DIR/common -t1506.3 correct relative file objects (0) -t1506.8 correct relative file objects (5) -t1506.9 correct relative file objects (6) -t2070.7 restore --staged uses HEAD as source -t3013.16 git ls-files --format with relative path -t3400.6 rebase, with and specified as :/quuxery -t3404.84 rebase -i, with and specified as :/quuxery -t3703.2 add :/ -t3703.3 add :/anothersub -t4202.8 oneline -t4202.22 git log --no-walk sorts by commit time -t4202.23 git log --no-walk=sorted sorts by commit time -t4202.24 git log --line-prefix="=== " --no-walk sorts by commit time -t4202.25 git log --no-walk=unsorted leaves list of commits as given -t4202.26 git show leaves list of commits as given -t4202.138 log --source paints branch names -t4202.139 log --source paints tag names -t4202.140 log --source paints symmetric ranges -t4208.2 "git log :/" should not be ambiguous -t4208.3 "git log :/a" should be ambiguous (applied both rev and worktree) -t4208.4 "git log :/a -- " should not be ambiguous -t4208.5 "git log :/detached -- " should find a commit only in HEAD -t4208.7 "git log :/detached -- " should find HEAD only of own worktree -t4208.10 "git log :/in" should not be ambiguous -t4208.13 git log HEAD -- :/ -t5616.43 lazy-fetch in submodule succeeds -t6132.7 t_e_i() exclude sub2 from sub -t6132.14 m_p_d() exclude sub2 from sub -t6132.19 grep --untracked PATTERN -t6132.21 grep --untracked PATTERN :(exclude)*FILE -t6133.6 :/*.t from a subdir dwims to a pathspec -t7201.14 checkout to detach HEAD with :/message -t9903.37 prompt - untracked files status indicator - untracked files -t9903.39 prompt - untracked files status indicator - non-empty untracked dir -t9903.40 prompt - untracked files status indicator - untracked files outside cwd -t9903.44 prompt - untracked files status indicator - shell variable set with config enabled -t9903.56 prompt - bash color pc mode - untracked files status indicator Signed-off-by: Johannes Schindelin --- winsup/cygwin/msys2_path_conv.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/winsup/cygwin/msys2_path_conv.cc b/winsup/cygwin/msys2_path_conv.cc index 35b7757..8870d38 100644 --- a/winsup/cygwin/msys2_path_conv.cc +++ b/winsup/cygwin/msys2_path_conv.cc @@ -356,6 +356,12 @@ skip_p2w: return NONE; } + /* + * Prevent Git's :file.txt and :/message syntax from beeing modified. + */ + if (*it == ':') + goto skip_p2w; + while (!isalnum(*it) && *it != '/' && *it != '\\' && *it != ':' && *it != '-' && *it != '.') { recurse = true; it = ++*src;