git/t/t4027-diff-submodule.sh
Junio C Hamano 8e08b4198c Teach diff that modified submodule directory is dirty
A diff run in superproject only compares the name of the commit object
bound at the submodule paths.  When we compare with a work tree and the
checked out submodule directory is dirty (e.g. has either staged or
unstaged changes, or has new files the user forgot to add to the index),
show the work tree side as "dirty".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-01-16 16:40:56 -08:00

182 lines
4.1 KiB
Bash
Executable file

#!/bin/sh
test_description='difference in submodules'
. ./test-lib.sh
. "$TEST_DIRECTORY"/diff-lib.sh
_z40=0000000000000000000000000000000000000000
test_expect_success setup '
test_tick &&
test_create_repo sub &&
(
cd sub &&
echo hello >world &&
git add world &&
git commit -m submodule
) &&
test_tick &&
echo frotz >nitfol &&
git add nitfol sub &&
git commit -m superproject &&
(
cd sub &&
echo goodbye >world &&
git add world &&
git commit -m "submodule #2"
) &&
set x $(
cd sub &&
git rev-list HEAD
) &&
echo ":160000 160000 $3 $_z40 M sub" >expect &&
subtip=$3 subprev=$2
'
test_expect_success 'git diff --raw HEAD' '
git diff --raw --abbrev=40 HEAD >actual &&
test_cmp expect actual
'
test_expect_success 'git diff-index --raw HEAD' '
git diff-index --raw HEAD >actual.index &&
test_cmp expect actual.index
'
test_expect_success 'git diff-files --raw' '
git diff-files --raw >actual.files &&
test_cmp expect actual.files
'
expect_from_to () {
printf "%sSubproject commit %s\n+Subproject commit %s\n" \
"-" "$1" "$2"
}
test_expect_success 'git diff HEAD' '
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subtip $subprev &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (work tree)' '
echo >>sub/world &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subtip $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (index)' '
(
cd sub &&
git reset --hard &&
echo >>world &&
git add world
) &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subtip $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
(
cd sub &&
git reset --hard &&
git clean -qfdx &&
>cruft
) &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subtip $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' '
git commit -m "x" sub &&
echo >>sub/world &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subprev $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (index, refs match)' '
(
cd sub &&
git reset --hard &&
echo >>world &&
git add world
) &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subprev $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' '
(
cd sub &&
git reset --hard &&
git clean -qfdx &&
>cruft
) &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subprev $subprev-dirty &&
test_cmp expect.body actual.body
'
test_expect_success 'git diff (empty submodule dir)' '
: >empty &&
rm -rf sub/* sub/.git &&
git diff > actual.empty &&
test_cmp empty actual.empty
'
test_expect_success 'conflicted submodule setup' '
# 39 efs
c=fffffffffffffffffffffffffffffffffffffff
(
echo "000000 $_z40 0 sub"
echo "160000 1$c 1 sub"
echo "160000 2$c 2 sub"
echo "160000 3$c 3 sub"
) | git update-index --index-info &&
echo >expect.nosub '\''diff --cc sub
index 2ffffff,3ffffff..0000000
--- a/sub
+++ b/sub
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 2fffffffffffffffffffffffffffffffffffffff
-Subproject commit 3fffffffffffffffffffffffffffffffffffffff
++Subproject commit 0000000000000000000000000000000000000000'\'' &&
hh=$(git rev-parse HEAD) &&
sed -e "s/$_z40/$hh/" expect.nosub >expect.withsub
'
test_expect_success 'combined (empty submodule)' '
rm -fr sub && mkdir sub &&
git diff >actual &&
test_cmp expect.nosub actual
'
test_expect_success 'combined (with submodule)' '
rm -fr sub &&
git clone --no-checkout . sub &&
git diff >actual &&
test_cmp expect.withsub actual
'
test_done