Skip to content

Commit

Permalink
Teach read-tree 2-way merge to ignore intermediate symlinks
Browse files Browse the repository at this point in the history
Earlier in 16a4c61, we taught "read-tree -m -u" not to be
confused when switching from a branch that has a path frotz/filfre
to another branch that has a symlink frotz that points at xyzzy/
directory.  The fix was incomplete in that it was still confused
when coming back (i.e. switching from a branch with frotz -> xyzzy/
to another branch with frotz/filfre).

This fix is rather expensive in that for a path that is created
we would need to see if any of the leading component of that
path exists as a symbolic link in the filesystem (in which case,
we know that path itself does not exist, and the fact we already
decided to check it out tells us that in the index we already
know that symbolic link is going away as there is no D/F
conflict).

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Jul 12, 2007
1 parent 1b2782a commit ec0603e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
50 changes: 50 additions & 0 deletions t/t2007-checkout-symlink.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/bin/sh
#
# Copyright (c) 2007 Junio C Hamano

test_description='git checkout to switch between branches with symlink<->dir'

. ./test-lib.sh

test_expect_success setup '
mkdir frotz &&
echo hello >frotz/filfre &&
git add frotz/filfre &&
test_tick &&
git commit -m "master has file frotz/filfre" &&
git branch side &&
echo goodbye >nitfol &&
git add nitfol
test_tick &&
git commit -m "master adds file nitfol" &&
git checkout side &&
git rm --cached frotz/filfre &&
mv frotz xyzzy &&
ln -s xyzzy frotz &&
git add xyzzy/filfre frotz &&
test_tick &&
git commit -m "side moves frotz/ to xyzzy/ and adds frotz->xyzzy/"
'

test_expect_success 'switch from symlink to dir' '
git checkout master
'

rm -fr frotz xyzzy nitfol &&
git checkout -f master || exit

test_expect_success 'switch from dir to symlink' '
git checkout side
'

test_done
3 changes: 3 additions & 0 deletions unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,9 @@ static void verify_absent(const char *path, const char *action,
if (o->index_only || o->reset || !o->update)
return;

if (has_symlink_leading_path(path, NULL))
return;

if (!lstat(path, &st)) {
int cnt;

Expand Down

0 comments on commit ec0603e

Please sign in to comment.