From: Torsten Bögershausen Date: Fri, 04 Mar 2016 12:16:12 GMT Subject: Re: git diff does not precompose unicode file paths (OS X) Message-ID: <56D97C8C.1060205@web.de> In-Reply-To: <0008C25D-C3F0-4A1F-8B50-4EF1E84CA04F@fournova.com> On 03/04/2016 10:07 AM, Alexander Rinass wrote: > Hallo, > > It appears that the git diff command does not precompose file path arguments, even if the option core.precomposeunicode is set to true (which is the default on OS X). > > Passing the decomposed form of a file path to the git diff command will yield no diff for a modified file. > > In my case, the decomposed form of the file path is sent by the OS X Cocoa framework's NSTask, wich I am using in an application. It can be simulated on OS X by using $(iconv -f utf-8 -t utf-8-mac <<< FILE_PATH) as file path argument on the shell. > > Git commands like add, log, ls-tree, ls-files, mv, ... accept both file path forms, git diff does not. > > It can be tested with the following setup on OS X (as iconv's utf-8-mac encoding is only available on OS X): > > git init . > git config core.quotepath true > git config core.precomposeunicode true # (default on OS X) > touch .gitignore && git add .gitignore && git commit -m "Initial commit" > > echo "." >> Ä > git add Ä > git commit -m "Create commit with unicode file path" > > echo "." >> Ä > > This gives the following status, showing the precomposed form of "Ä": > > git status --short > M "\303\204" > > Running git add with both forms does work as expected: > > git add Ä > git status --short > M "\303\204" > > git reset HEAD -- Ä > > git add $(iconv -f utf-8 -t utf-8-mac <<< Ä) > git status --short > M "\303\204" > > git reset HEAD -- Ä > > However, running git diff only works with the precomposed form: > > git status --short > M "\303\204" > > git --no-pager diff -- Ä > [...shows diff...] > > git --no-pager diff -- $(iconv -f utf-8 -t utf-8-mac <<< Ä) > [...shows NO diff...] > > I took a look at the Git source code, and the builtin/diff*.c do not contain the parse_options call (which does the precompose_argv call) that the other builtins use. > > But I am not really familiar with either C or the Git project structure, so this may not mean anything. > > Best regards, > Alexander Rinass > Good analyzes, and thanks for the report. It should be possible to stick in a precompose_arrgv(argc, argv) into builtin/diff.c Do you you can test that ?