git/t/t4060-diff-submodule-option-diff-format.sh
brian m. carlson 417e45e5e3 t4060: make test work with SHA-256
In this test, there are two main types of object IDs we see in the
diffs: the ones for the submodules, which we care about, and the ones
for the individual files, which are unrelated to what we're testing.
Much of the test already computes the former, so extend the rest of the
test to do so as well.  Add a diff comparison function that normalizes
the differences in the latter, since they're not explicitly what we're
testing.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-02-07 11:07:30 -08:00

833 lines
20 KiB
Bash
Executable file

#!/bin/sh
#
# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
# Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
# Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
#
test_description='Support for diff format verbose submodule difference in git diff
This test tries to verify the sanity of --submodule=diff option of git diff.
'
. ./test-lib.sh
# Tested non-UTF-8 encoding
test_encoding="ISO8859-1"
# String "added" in German (translated with Google Translate), encoded in UTF-8,
# used in sample commit log messages in add_file() function below.
added=$(printf "hinzugef\303\274gt")
add_file () {
(
cd "$1" &&
shift &&
for name
do
echo "$name" >"$name" &&
git add "$name" &&
test_tick &&
# "git commit -m" would break MinGW, as Windows refuse to pass
# $test_encoding encoded parameter to git.
echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
git -c "i18n.commitEncoding=$test_encoding" commit -F -
done >/dev/null &&
git rev-parse --short --verify HEAD
)
}
commit_file () {
test_tick &&
git commit "$@" -m "Commit $*" >/dev/null
}
diff_cmp () {
for i in "$1" "$2"
do
sed -e 's/^index 0000000\.\.[0-9a-f]*/index 0000000..1234567/' \
-e 's/^index [0-9a-f]*\.\.[0-9a-f]*/index 1234567..89abcde/' \
"$i" >"$i.compare" || return 1
done &&
test_cmp "$1.compare" "$2.compare" &&
rm -f "$1.compare" "$2.compare"
}
test_expect_success 'setup repository' '
test_create_repo sm1 &&
add_file . foo &&
head1=$(add_file sm1 foo1 foo2) &&
fullhead1=$(git -C sm1 rev-parse --verify HEAD)
'
test_expect_success 'added submodule' '
git add sm1 &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 0000000...$head1 (new submodule)
diff --git a/sm1/foo1 b/sm1/foo1
new file mode 100644
index 0000000..1715acd
--- /dev/null
+++ b/sm1/foo1
@@ -0,0 +1 @@
+foo1
diff --git a/sm1/foo2 b/sm1/foo2
new file mode 100644
index 0000000..54b060e
--- /dev/null
+++ b/sm1/foo2
@@ -0,0 +1 @@
+foo2
EOF
diff_cmp expected actual
'
test_expect_success 'added submodule, set diff.submodule' '
test_config diff.submodule log &&
git add sm1 &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 0000000...$head1 (new submodule)
diff --git a/sm1/foo1 b/sm1/foo1
new file mode 100644
index 0000000..1715acd
--- /dev/null
+++ b/sm1/foo1
@@ -0,0 +1 @@
+foo1
diff --git a/sm1/foo2 b/sm1/foo2
new file mode 100644
index 0000000..54b060e
--- /dev/null
+++ b/sm1/foo2
@@ -0,0 +1 @@
+foo2
EOF
diff_cmp expected actual
'
test_expect_success '--submodule=short overrides diff.submodule' '
test_config diff.submodule log &&
git add sm1 &&
git diff --submodule=short --cached >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
new file mode 160000
index 0000000..$head1
--- /dev/null
+++ b/sm1
@@ -0,0 +1 @@
+Subproject commit $fullhead1
EOF
diff_cmp expected actual
'
test_expect_success 'diff.submodule does not affect plumbing' '
test_config diff.submodule log &&
git diff-index -p HEAD >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
new file mode 160000
index 0000000..$head1
--- /dev/null
+++ b/sm1
@@ -0,0 +1 @@
+Subproject commit $fullhead1
EOF
diff_cmp expected actual
'
commit_file sm1 &&
head2=$(add_file sm1 foo3)
test_expect_success 'modified submodule(forward)' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head1..$head2:
diff --git a/sm1/foo3 b/sm1/foo3
new file mode 100644
index 0000000..c1ec6c6
--- /dev/null
+++ b/sm1/foo3
@@ -0,0 +1 @@
+foo3
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule(forward)' '
git diff --submodule=diff >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head1..$head2:
diff --git a/sm1/foo3 b/sm1/foo3
new file mode 100644
index 0000000..c1ec6c6
--- /dev/null
+++ b/sm1/foo3
@@ -0,0 +1 @@
+foo3
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule(forward) --submodule' '
git diff --submodule >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head1..$head2:
> Add foo3 ($added foo3)
EOF
diff_cmp expected actual
'
fullhead2=$(cd sm1; git rev-parse --verify HEAD)
test_expect_success 'modified submodule(forward) --submodule=short' '
git diff --submodule=short >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
index $head1..$head2 160000
--- a/sm1
+++ b/sm1
@@ -1 +1 @@
-Subproject commit $fullhead1
+Subproject commit $fullhead2
EOF
diff_cmp expected actual
'
commit_file sm1 &&
head3=$(
cd sm1 &&
git reset --hard HEAD~2 >/dev/null &&
git rev-parse --short --verify HEAD
)
test_expect_success 'modified submodule(backward)' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head2..$head3 (rewind):
diff --git a/sm1/foo2 b/sm1/foo2
deleted file mode 100644
index 54b060e..0000000
--- a/sm1/foo2
+++ /dev/null
@@ -1 +0,0 @@
-foo2
diff --git a/sm1/foo3 b/sm1/foo3
deleted file mode 100644
index c1ec6c6..0000000
--- a/sm1/foo3
+++ /dev/null
@@ -1 +0,0 @@
-foo3
EOF
diff_cmp expected actual
'
head4=$(add_file sm1 foo4 foo5)
test_expect_success 'modified submodule(backward and forward)' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head2...$head4:
diff --git a/sm1/foo2 b/sm1/foo2
deleted file mode 100644
index 54b060e..0000000
--- a/sm1/foo2
+++ /dev/null
@@ -1 +0,0 @@
-foo2
diff --git a/sm1/foo3 b/sm1/foo3
deleted file mode 100644
index c1ec6c6..0000000
--- a/sm1/foo3
+++ /dev/null
@@ -1 +0,0 @@
-foo3
diff --git a/sm1/foo4 b/sm1/foo4
new file mode 100644
index 0000000..a0016db
--- /dev/null
+++ b/sm1/foo4
@@ -0,0 +1 @@
+foo4
diff --git a/sm1/foo5 b/sm1/foo5
new file mode 100644
index 0000000..d6f2413
--- /dev/null
+++ b/sm1/foo5
@@ -0,0 +1 @@
+foo5
EOF
diff_cmp expected actual
'
commit_file sm1 &&
mv sm1 sm1-bak &&
echo sm1 >sm1 &&
head5=$(git hash-object sm1 | cut -c1-7) &&
git add sm1 &&
rm -f sm1 &&
mv sm1-bak sm1
test_expect_success 'typechanged submodule(submodule->blob), --cached' '
git diff --submodule=diff --cached >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head4...0000000 (submodule deleted)
diff --git a/sm1/foo1 b/sm1/foo1
deleted file mode 100644
index 1715acd..0000000
--- a/sm1/foo1
+++ /dev/null
@@ -1 +0,0 @@
-foo1
diff --git a/sm1/foo4 b/sm1/foo4
deleted file mode 100644
index a0016db..0000000
--- a/sm1/foo4
+++ /dev/null
@@ -1 +0,0 @@
-foo4
diff --git a/sm1/foo5 b/sm1/foo5
deleted file mode 100644
index d6f2413..0000000
--- a/sm1/foo5
+++ /dev/null
@@ -1 +0,0 @@
-foo5
diff --git a/sm1 b/sm1
new file mode 100644
index 0000000..9da5fb8
--- /dev/null
+++ b/sm1
@@ -0,0 +1 @@
+sm1
EOF
diff_cmp expected actual
'
test_expect_success 'typechanged submodule(submodule->blob)' '
git diff --submodule=diff >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
deleted file mode 100644
index 9da5fb8..0000000
--- a/sm1
+++ /dev/null
@@ -1 +0,0 @@
-sm1
Submodule sm1 0000000...$head4 (new submodule)
diff --git a/sm1/foo1 b/sm1/foo1
new file mode 100644
index 0000000..1715acd
--- /dev/null
+++ b/sm1/foo1
@@ -0,0 +1 @@
+foo1
diff --git a/sm1/foo4 b/sm1/foo4
new file mode 100644
index 0000000..a0016db
--- /dev/null
+++ b/sm1/foo4
@@ -0,0 +1 @@
+foo4
diff --git a/sm1/foo5 b/sm1/foo5
new file mode 100644
index 0000000..d6f2413
--- /dev/null
+++ b/sm1/foo5
@@ -0,0 +1 @@
+foo5
EOF
diff_cmp expected actual
'
rm -rf sm1 &&
git checkout-index sm1
test_expect_success 'typechanged submodule(submodule->blob)' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head4...0000000 (submodule deleted)
diff --git a/sm1 b/sm1
new file mode 100644
index 0000000..9da5fb8
--- /dev/null
+++ b/sm1
@@ -0,0 +1 @@
+sm1
EOF
diff_cmp expected actual
'
rm -f sm1 &&
test_create_repo sm1 &&
head6=$(add_file sm1 foo6 foo7)
fullhead6=$(cd sm1; git rev-parse --verify HEAD)
test_expect_success 'nonexistent commit' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head4...$head6 (commits not present)
EOF
diff_cmp expected actual
'
commit_file
test_expect_success 'typechanged submodule(blob->submodule)' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
deleted file mode 100644
index 9da5fb8..0000000
--- a/sm1
+++ /dev/null
@@ -1 +0,0 @@
-sm1
Submodule sm1 0000000...$head6 (new submodule)
diff --git a/sm1/foo6 b/sm1/foo6
new file mode 100644
index 0000000..462398b
--- /dev/null
+++ b/sm1/foo6
@@ -0,0 +1 @@
+foo6
diff --git a/sm1/foo7 b/sm1/foo7
new file mode 100644
index 0000000..6e9262c
--- /dev/null
+++ b/sm1/foo7
@@ -0,0 +1 @@
+foo7
EOF
diff_cmp expected actual
'
commit_file sm1 &&
test_expect_success 'submodule is up to date' '
head7=$(git -C sm1 rev-parse --short --verify HEAD) &&
git diff-index -p --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains untracked content' '
echo new > sm1/new-file &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
EOF
diff_cmp expected actual
'
test_expect_success 'submodule contains untracked content (untracked ignored)' '
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains untracked content (dirty ignored)' '
git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains untracked content (all ignored)' '
git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains untracked and modified content' '
echo new > sm1/foo6 &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
Submodule sm1 contains modified content
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
# NOT OK
test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
echo new > sm1/foo6 &&
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '
echo new > sm1/foo6 &&
git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains untracked and modified content (all ignored)' '
echo new > sm1/foo6 &&
git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'submodule contains modified content' '
rm -f sm1/new-file &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
(cd sm1; git commit -mchange foo6 >/dev/null) &&
head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
test_expect_success 'submodule is modified' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked content' '
echo new > sm1/new-file &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked content (all ignored)' '
git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'modified submodule contains untracked and modified content' '
echo modification >> sm1/foo6 &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
Submodule sm1 contains modified content
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..dfda541 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1,2 @@
-foo6
+new
+modification
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
echo modification >> sm1/foo6 &&
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..e20e2d9 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1,3 @@
-foo6
+new
+modification
+modification
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '
echo modification >> sm1/foo6 &&
git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..3e75765 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1 @@
-foo6
+new
EOF
diff_cmp expected actual
'
test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '
echo modification >> sm1/foo6 &&
git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
test_must_be_empty actual
'
# NOT OK
test_expect_success 'modified submodule contains modified content' '
rm -f sm1/new-file &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
Submodule sm1 $head7..$head8:
diff --git a/sm1/foo6 b/sm1/foo6
index 462398b..ac466ca 100644
--- a/sm1/foo6
+++ b/sm1/foo6
@@ -1 +1,5 @@
-foo6
+new
+modification
+modification
+modification
+modification
EOF
diff_cmp expected actual
'
rm -rf sm1
test_expect_success 'deleted submodule' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
EOF
diff_cmp expected actual
'
test_expect_success 'create second submodule' '
test_create_repo sm2 &&
head9=$(add_file sm2 foo8 foo9) &&
git add sm2
'
test_expect_success 'multiple submodules' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
new file mode 100644
index 0000000..db9916b
--- /dev/null
+++ b/sm2/foo8
@@ -0,0 +1 @@
+foo8
diff --git a/sm2/foo9 b/sm2/foo9
new file mode 100644
index 0000000..9c3b4f6
--- /dev/null
+++ b/sm2/foo9
@@ -0,0 +1 @@
+foo9
EOF
diff_cmp expected actual
'
test_expect_success 'path filter' '
git diff-index -p --submodule=diff HEAD sm2 >actual &&
cat >expected <<-EOF &&
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
new file mode 100644
index 0000000..db9916b
--- /dev/null
+++ b/sm2/foo8
@@ -0,0 +1 @@
+foo8
diff --git a/sm2/foo9 b/sm2/foo9
new file mode 100644
index 0000000..9c3b4f6
--- /dev/null
+++ b/sm2/foo9
@@ -0,0 +1 @@
+foo9
EOF
diff_cmp expected actual
'
commit_file sm2
test_expect_success 'given commit' '
git diff-index -p --submodule=diff HEAD^ >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
new file mode 100644
index 0000000..db9916b
--- /dev/null
+++ b/sm2/foo8
@@ -0,0 +1 @@
+foo8
diff --git a/sm2/foo9 b/sm2/foo9
new file mode 100644
index 0000000..9c3b4f6
--- /dev/null
+++ b/sm2/foo9
@@ -0,0 +1 @@
+foo9
EOF
diff_cmp expected actual
'
test_expect_success 'setup .git file for sm2' '
(cd sm2 &&
REAL="$(pwd)/../.real" &&
mv .git "$REAL" &&
echo "gitdir: $REAL" >.git)
'
test_expect_success 'diff --submodule=diff with .git file' '
git diff --submodule=diff HEAD^ >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
new file mode 100644
index 0000000..db9916b
--- /dev/null
+++ b/sm2/foo8
@@ -0,0 +1 @@
+foo8
diff --git a/sm2/foo9 b/sm2/foo9
new file mode 100644
index 0000000..9c3b4f6
--- /dev/null
+++ b/sm2/foo9
@@ -0,0 +1 @@
+foo9
EOF
diff_cmp expected actual
'
test_expect_success 'setup nested submodule' '
git submodule add -f ./sm2 &&
git commit -a -m "add sm2" &&
git -C sm2 submodule add ../sm2 nested &&
git -C sm2 commit -a -m "nested sub" &&
head10=$(git -C sm2 rev-parse --short --verify HEAD)
'
test_expect_success 'move nested submodule HEAD' '
echo "nested content" >sm2/nested/file &&
git -C sm2/nested add file &&
git -C sm2/nested commit --allow-empty -m "new HEAD" &&
head11=$(git -C sm2/nested rev-parse --short --verify HEAD)
'
test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
cat >expected <<-EOF &&
Submodule nested $head9..$head11:
diff --git a/nested/file b/nested/file
new file mode 100644
index 0000000..ca281f5
--- /dev/null
+++ b/nested/file
@@ -0,0 +1 @@
+nested content
EOF
git -C sm2 diff --submodule=diff >actual 2>err &&
test_must_be_empty err &&
diff_cmp expected actual
'
test_expect_success 'diff --submodule=diff recurses into nested submodules' '
cat >expected <<-EOF &&
Submodule sm2 contains modified content
Submodule sm2 $head9..$head10:
diff --git a/sm2/.gitmodules b/sm2/.gitmodules
new file mode 100644
index 0000000..3a816b8
--- /dev/null
+++ b/sm2/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "nested"]
+ path = nested
+ url = ../sm2
Submodule nested 0000000...$head11 (new submodule)
diff --git a/sm2/nested/file b/sm2/nested/file
new file mode 100644
index 0000000..ca281f5
--- /dev/null
+++ b/sm2/nested/file
@@ -0,0 +1 @@
+nested content
diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
new file mode 100644
index 0000000..db9916b
--- /dev/null
+++ b/sm2/nested/foo8
@@ -0,0 +1 @@
+foo8
diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
new file mode 100644
index 0000000..9c3b4f6
--- /dev/null
+++ b/sm2/nested/foo9
@@ -0,0 +1 @@
+foo9
EOF
git diff --submodule=diff >actual 2>err &&
test_must_be_empty err &&
diff_cmp expected actual
'
test_done