1
+#!/bin/sh
2
+#
3
+# Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
4
+#
5
+
6
+test_description='Test for submodule diff on non-checked out submodule
7
+
8
+This test tries to verify that add_submodule_odb works when the submodule was
9
+initialized previously but the checkout has since been removed.
10
+'
11
+
12
+. ./test-lib.sh
13
+
14
+# Tested non-UTF-8 encoding
15
+test_encoding="ISO8859-1"
16
+
17
+# String "added" in German (translated with Google Translate), encoded in UTF-8,
18
+# used in sample commit log messages in add_file() function below.
19
+added=$(printf "hinzugef\303\274gt")
20
+
21
+add_file () {
22
+ (
23
+ cd "$1" &&
24
+ shift &&
25
+ for name
26
+ do
27
+ echo "$name" >"$name" &&
28
+ git add "$name" &&
29
+ test_tick &&
30
+ # "git commit -m" would break MinGW, as Windows refuse to pass
31
+ # $test_encoding encoded parameter to git.
32
+ echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
33
+ git -c "i18n.commitEncoding=$test_encoding" commit -F -
34
+ done >/dev/null &&
35
+ git rev-parse --short --verify HEAD
36
+ )
37
+}
38
+
39
+commit_file () {
40
+ test_tick &&
41
+ git commit "$@" -m "Commit $*" >/dev/null
42
+}
43
+
44
+test_expect_success 'setup - submodules' '
45
+ test_create_repo sm2 &&
46
+ add_file . foo &&
47
+ add_file sm2 foo1 foo2 &&
48
+ smhead1=$(git -C sm2 rev-parse --short --verify HEAD)
49
+'
50
+
51
+test_expect_success 'setup - git submodule add' '
52
+ git submodule add ./sm2 sm1 &&
53
+ commit_file sm1 .gitmodules &&
54
+ git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
55
+ cat >expected <<-EOF &&
56
+ Submodule sm1 0000000...$smhead1 (new submodule)
57
+ EOF
58
+ test_cmp expected actual
59
+'
60
+
61
+test_expect_success 'submodule directory removed' '
62
+ rm -rf sm1 &&
63
+ git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
64
+ cat >expected <<-EOF &&
65
+ Submodule sm1 0000000...$smhead1 (new submodule)
66
+ EOF
67
+ test_cmp expected actual
68
+'
69
+
70
+test_expect_success 'setup - submodule multiple commits' '
71
+ git submodule update --checkout sm1 &&
72
+ smhead2=$(add_file sm1 foo3 foo4) &&
73
+ commit_file sm1 &&
74
+ git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
75
+ cat >expected <<-EOF &&
76
+ Submodule sm1 $smhead1..$smhead2:
77
+ > Add foo4 ($added foo4)
78
+ > Add foo3 ($added foo3)
79
+ EOF
80
+ test_cmp expected actual
81
+'
82
+
83
+test_expect_success 'submodule removed multiple commits' '
84
+ rm -rf sm1 &&
85
+ git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
86
+ cat >expected <<-EOF &&
87
+ Submodule sm1 $smhead1..$smhead2:
88
+ > Add foo4 ($added foo4)
89
+ > Add foo3 ($added foo3)
90
+ EOF
91
+ test_cmp expected actual
92
+'
93
+
94
+test_expect_success 'submodule not initialized in new clone' '
95
+ git clone . sm3 &&
96
+ git -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
97
+ cat >expected <<-EOF &&
98
+ Submodule sm1 $smhead1...$smhead2 (not initialized)
99
+ EOF
100
+ test_cmp expected actual
101
+'
102
+
103
+test_expect_success 'setup submodule moved' '
104
+ git submodule update --checkout sm1 &&
105
+ git mv sm1 sm4 &&
106
+ commit_file sm4 &&
107
+ git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
108
+ cat >expected <<-EOF &&
109
+ Submodule sm4 0000000...$smhead2 (new submodule)
110
+ EOF
111
+ test_cmp expected actual
112
+'
113
+
114
+test_expect_success 'submodule moved then removed' '
115
+ smhead3=$(add_file sm4 foo6 foo7) &&
116
+ commit_file sm4 &&
117
+ rm -rf sm4 &&
118
+ git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
119
+ cat >expected <<-EOF &&
120
+ Submodule sm4 $smhead2..$smhead3:
121
+ > Add foo7 ($added foo7)
122
+ > Add foo6 ($added foo6)
123
+ EOF
124
+ test_cmp expected actual
125
+'
126
+
127
+test_done