From: Johannes Sixt Date: Fri, 16 Feb 2007 23:09:02 GMT Subject: [PATCH] Fix incorrect diff of a link -> file change if core.filemode = false. Message-ID: <200702170009.02500.johannes.sixt@telecom.at> After this sequence: $ ln -s foo A $ git add A $ git commit -m link $ rm A && echo bar > A the working copy contains a regular file A but HEAD contains A as a link. Normally, at this point 'git diff HEAD' displays this change as a removal of the link followed by an addition of a new file. But in a repository where core.filemode is false this is displayed as a modification of the link. The reason is that the check when the cached mode is allowed to override the file's actual mode is not strict enough. Signed-off-by: Johannes Sixt --- diff-lib.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index 91cd877..5fc1910 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -171,7 +171,8 @@ static int get_stat_data(struct cache_entry *ce, changed = ce_match_stat(ce, &st, 0); if (changed) { mode = create_ce_mode(st.st_mode); - if (!trust_executable_bit && S_ISREG(st.st_mode)) + if (!trust_executable_bit && + S_ISREG(st.st_mode) && S_ISREG(ntohl(ce->ce_mode))) mode = ce->ce_mode; sha1 = no_sha1; } -- 1.5.0.19.gddff