Skip to content

Commit

Permalink
Add corner case tests for diff-index and diff-files
Browse files Browse the repository at this point in the history
diff-index and diff-files can get confused in corner cases when an indexed
blob turns into something else in the work tree.  This patch adds tests to
expose such breakages.

The test is classified under t2XXX series instead of t4XXX series, because
the ultimate objective is to fix "add -u" (and "commit -a" that shares the
same issue).

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 31, 2008
1 parent c20711d commit 6301f30
Showing 1 changed file with 140 additions and 0 deletions.
140 changes: 140 additions & 0 deletions t/t2201-add-update-typechange.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#!/bin/sh

test_description='more git add -u'

. ./test-lib.sh

_z40=0000000000000000000000000000000000000000

test_expect_success setup '
>xyzzy &&
_empty=$(git hash-object --stdin <xyzzy) &&
>yomin &&
>caskly &&
ln -s frotz nitfol &&
mkdir rezrov &&
>rezrov/bozbar &&
git add caskly xyzzy yomin nitfol rezrov/bozbar &&
test_tick &&
git commit -m initial
'

test_expect_success modify '
rm -f xyzzy yomin nitfol caskly &&
# caskly disappears (not a submodule)
mkdir caskly &&
# nitfol changes from symlink to regular
>nitfol &&
# rezrov/bozbar disappears
rm -fr rezrov &&
ln -s xyzzy rezrov &&
# xyzzy disappears (not a submodule)
mkdir xyzzy &&
echo gnusto >xyzzy/bozbar &&
# yomin gets replaced with a submodule
mkdir yomin &&
>yomin/yomin &&
(
cd yomin &&
git init &&
git add yomin &&
git commit -m "sub initial"
) &&
yomin=$(GIT_DIR=yomin/.git git rev-parse HEAD) &&
# yonk is added and then turned into a submodule
# this should appear as T in diff-files and as A in diff-index
>yonk &&
git add yonk &&
rm -f yonk &&
mkdir yonk &&
>yonk/yonk &&
(
cd yonk &&
git init &&
git add yonk &&
git commit -m "sub initial"
) &&
yonk=$(GIT_DIR=yonk/.git git rev-parse HEAD) &&
# zifmia is added and then removed
# this should appear in diff-files but not in diff-index.
>zifmia &&
git add zifmia &&
rm -f zifmia &&
mkdir zifmia &&
{
git ls-tree -r HEAD |
sed -e "s/^/:/" -e "
/ caskly/{
s/ caskly/ $_z40 D&/
s/blob/000000/
}
/ nitfol/{
s/ nitfol/ $_z40 T&/
s/blob/100644/
}
/ rezrov.bozbar/{
s/ rezrov.bozbar/ $_z40 D&/
s/blob/000000/
}
/ xyzzy/{
s/ xyzzy/ $_z40 D&/
s/blob/000000/
}
/ yomin/{
s/ yomin/ $_z40 T&/
s/blob/160000/
}
"
} >expect &&
{
cat expect
echo ":100644 160000 $_empty $_z40 T yonk"
echo ":100644 000000 $_empty $_z40 D zifmia"
} >expect-files &&
{
cat expect
echo ":000000 160000 $_z40 $_z40 A yonk"
} >expect-index &&
{
echo "100644 $_empty 0 nitfol"
echo "160000 $yomin 0 yomin"
echo "160000 $yonk 0 yonk"
} >expect-final
'

test_expect_failure diff-files '
git diff-files --raw >actual &&
diff -u expect-files actual
'

test_expect_failure diff-index '
git diff-index --raw HEAD -- >actual &&
diff -u expect-index actual
'

test_expect_failure 'add -u' '
rm -f ".git/saved-index" &&
cp -p ".git/index" ".git/saved-index" &&
git add -u &&
git ls-files -s >actual &&
diff -u expect-final actual
'

test_expect_failure 'commit -a' '
if test -f ".git/saved-index"
then
rm -f ".git/index" &&
mv ".git/saved-index" ".git/index"
fi &&
git commit -m "second" -a &&
git ls-files -s >actual &&
diff -u expect-final actual &&
rm -f .git/index &&
git read-tree HEAD &&
git ls-files -s >actual &&
diff -u expect-final actual
'

test_done

0 comments on commit 6301f30

Please sign in to comment.