diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2009-01-29 17:30:51 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-01-30 21:11:24 -0800 |
commit | 418566b6fdcc0eb1b5549d0742366aa13a7ff277 (patch) | |
tree | a2d36ff84e44fef36ed1e9d556aea94c6d5a78a6 | |
parent | 41a4d16e200d24b2435148e974b665429931abc9 (diff) | |
download | git-418566b6fdcc0eb1b5549d0742366aa13a7ff277.tar.gz git-418566b6fdcc0eb1b5549d0742366aa13a7ff277.tar.xz |
Fix 'git diff --no-index' with a non-existing symlink target
When trying to find out mode changes, we should not access the symlink
targets using stat(); instead we use lstat() so that the diff does
not fail trying to find a non-existing symlink target.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | diff-no-index.c | 2 | ||||
-rwxr-xr-x | t/t4011-diff-symlink.sh | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/diff-no-index.c b/diff-no-index.c index 60ed17470..0dbd9dad8 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -40,7 +40,7 @@ static int get_mode(const char *path, int *mode) *mode = 0; else if (!strcmp(path, "-")) *mode = create_ce_mode(0666); - else if (stat(path, &st)) + else if (lstat(path, &st)) return error("Could not access '%s'", path); else *mode = st.st_mode; diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh index 02efecae3..9055c8b31 100755 --- a/t/t4011-diff-symlink.sh +++ b/t/t4011-diff-symlink.sh @@ -82,4 +82,11 @@ test_expect_success \ git diff-index -M -p $tree > current && compare_diff_patch current expected' +test_expect_success \ + 'diff symlinks with non-existing targets' \ + 'ln -s narf pinky && + ln -s take\ over brain && + test_must_fail git diff --no-index pinky brain > output 2> output.err && + grep narf output && + ! grep error output.err' test_done |