Skip to content

Commit

Permalink
Merge branch 'rs/refresh-beyond-symlink' into maint
Browse files Browse the repository at this point in the history
* rs/refresh-beyond-symlink:
  read-cache: check for leading symlinks when refreshing index
  • Loading branch information
Junio C Hamano committed Sep 19, 2014
2 parents ffe41f8 + ccad42d commit 92ea1ac
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
8 changes: 8 additions & 0 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,14 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate,
return ce;
}

if (has_symlink_leading_path(ce->name, ce_namelen(ce))) {
if (ignore_missing)
return ce;
if (err)
*err = ENOENT;
return NULL;
}

if (lstat(ce->name, &st) < 0) {
if (ignore_missing && errno == ENOENT)
return ce;
Expand Down
43 changes: 43 additions & 0 deletions t/t7515-status-symlinks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/bin/sh

test_description='git status and symlinks'

. ./test-lib.sh

test_expect_success 'setup' '
echo .gitignore >.gitignore &&
echo actual >>.gitignore &&
echo expect >>.gitignore &&
mkdir dir &&
echo x >dir/file1 &&
echo y >dir/file2 &&
git add dir &&
git commit -m initial &&
git tag initial
'

test_expect_success SYMLINKS 'symlink to a directory' '
test_when_finished "rm symlink" &&
ln -s dir symlink &&
echo "?? symlink" >expect &&
git status --porcelain >actual &&
test_cmp expect actual
'

test_expect_success SYMLINKS 'symlink replacing a directory' '
test_when_finished "rm -rf copy && git reset --hard initial" &&
mkdir copy &&
cp dir/file1 copy/file1 &&
echo "changed in copy" >copy/file2 &&
git add copy &&
git commit -m second &&
rm -rf copy &&
ln -s dir copy &&
echo " D copy/file1" >expect &&
echo " D copy/file2" >>expect &&
echo "?? copy" >>expect &&
git status --porcelain >actual &&
test_cmp expect actual
'

test_done

0 comments on commit 92ea1ac

Please sign in to comment.