git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git diff does not precompose unicode file paths (OS X)
@ 2016-03-04  9:07 Alexander Rinass
  2016-03-04 12:16 ` Torsten Bögershausen
  0 siblings, 1 reply; 11+ messages in thread
From: Alexander Rinass @ 2016-03-04  9:07 UTC (permalink / raw)
  To: git

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-04-04 20:43 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-04  9:07 git diff does not precompose unicode file paths (OS X) Alexander Rinass
2016-03-04 12:16 ` Torsten Bögershausen
2016-03-04 14:37   ` Alexander Rinass
2016-03-04 18:36     ` Junio C Hamano
2016-03-04 18:49     ` Ramsay Jones
2016-03-07  7:47       ` Alexander Rinass
2016-03-07  8:54         ` Torsten Bögershausen
     [not found]           ` <5C6A30EF-ED0A-4D64-B971-CF873C64B46E@fournova.com>
2016-03-08 12:30             ` Torsten Bögershausen
2016-03-14 21:45               ` Alexander Rinass
2016-03-15  5:45                 ` Torsten Bögershausen
2016-04-04 20:43                   ` Alexander Rinass

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).