[PATCH] Fix incorrect diff of a link -> file change if core.filemode = false.
From: Johannes Sixt <hidden>
Date: 2016-06-15 22:42:54
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Johannes Sixt <hidden>
Date: 2016-06-15 22:42:54
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- 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