summaryrefslogtreecommitdiff
path: root/t/t4051-diff-function-context.sh
blob: 30fc5bf2b36d815d6a43f2b439f938b81a8816ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/bin/sh

test_description='diff function context'

. ./test-lib.sh

dir="$TEST_DIRECTORY/t4051"

commit_and_tag () {
	tag=$1 &&
	shift &&
	git add "$@" &&
	test_tick &&
	git commit -m "$tag" &&
	git tag "$tag"
}

first_context_line () {
	awk '
		found {print; exit}
		/^@@/ {found = 1}
	'
}

last_context_line () {
	sed -ne \$p
}

check_diff () {
	name=$1
	desc=$2
	options="-W $3"

	test_expect_success "$desc" '
		git diff $options "$name^" "$name" >"$name.diff"
	'

	test_expect_success ' diff applies' '
		test_when_finished "git reset --hard" &&
		git checkout --detach "$name^" &&
		git apply --index "$name.diff" &&
		git diff --exit-code "$name"
	'
}

test_expect_success 'setup' '
	cat "$dir/includes.c" "$dir/dummy.c" "$dir/dummy.c" "$dir/hello.c" \
		"$dir/dummy.c" "$dir/dummy.c" >file.c &&
	commit_and_tag initial file.c &&

	grep -v "delete me from hello" <file.c >file.c.new &&
	mv file.c.new file.c &&
	commit_and_tag changed_hello file.c &&

	grep -v "delete me from includes" <file.c >file.c.new &&
	mv file.c.new file.c &&
	commit_and_tag changed_includes file.c &&

	cat "$dir/appended1.c" >>file.c &&
	commit_and_tag appended file.c &&

	cat "$dir/appended2.c" >>file.c &&
	commit_and_tag extended file.c &&

	grep -v "Begin of second part" <file.c >file.c.new &&
	mv file.c.new file.c &&
	commit_and_tag long_common_tail file.c &&

	git checkout initial &&
	cat "$dir/hello.c" "$dir/dummy.c" >file.c &&
	commit_and_tag hello_dummy file.c &&

	# overlap function context of 1st change and -u context of 2nd change
	grep -v "delete me from hello" <"$dir/hello.c" >file.c &&
	sed "2a\\
	     extra line" <"$dir/dummy.c" >>file.c &&
	commit_and_tag changed_hello_dummy file.c &&

	git checkout initial &&
	grep -v "delete me from hello" <file.c >file.c.new &&
	mv file.c.new file.c &&
	cat "$dir/appended1.c" >>file.c &&
	commit_and_tag changed_hello_appended file.c
'

check_diff changed_hello 'changed function'

test_expect_failure ' context includes comment' '
	grep "^ .*Hello comment" changed_hello.diff
'

test_expect_success ' context includes begin' '
	grep "^ .*Begin of hello" changed_hello.diff
'

test_expect_success ' context includes end' '
	grep "^ .*End of hello" changed_hello.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" changed_hello.diff) -le 1
'

test_expect_success ' context does not include preceding empty lines' '
	test "$(first_context_line <changed_hello.diff)" != " "
'

test_expect_success ' context does not include trailing empty lines' '
	test "$(last_context_line <changed_hello.diff)" != " "
'

check_diff changed_includes 'changed includes'

test_expect_success ' context includes begin' '
	grep "^ .*Begin.h" changed_includes.diff
'

test_expect_success ' context includes end' '
	grep "^ .*End.h" changed_includes.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" changed_includes.diff) -le 1
'

test_expect_success ' context does not include trailing empty lines' '
	test "$(last_context_line <changed_includes.diff)" != " "
'

check_diff appended 'appended function'

test_expect_success ' context includes begin' '
	grep "^[+].*Begin of first part" appended.diff
'

test_expect_success ' context includes end' '
	grep "^[+].*End of first part" appended.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" appended.diff) -le 1
'

check_diff extended 'appended function part'

test_expect_success ' context includes begin' '
	grep "^ .*Begin of first part" extended.diff
'

test_expect_success ' context includes end' '
	grep "^[+].*End of second part" extended.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" extended.diff) -le 2
'

test_expect_success ' context does not include preceding empty lines' '
	test "$(first_context_line <extended.diff)" != " "
'

check_diff long_common_tail 'change with long common tail and no context' -U0

test_expect_success ' context includes begin' '
	grep "^ .*Begin of first part" long_common_tail.diff
'

test_expect_success ' context includes end' '
	grep "^ .*End of second part" long_common_tail.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" long_common_tail.diff) -le 2
'

test_expect_success ' context does not include preceding empty lines' '
	test "$(first_context_line <long_common_tail.diff.diff)" != " "
'

check_diff changed_hello_appended 'changed function plus appended function'

test_expect_success ' context includes begin' '
	grep "^ .*Begin of hello" changed_hello_appended.diff &&
	grep "^[+].*Begin of first part" changed_hello_appended.diff
'

test_expect_success ' context includes end' '
	grep "^ .*End of hello" changed_hello_appended.diff &&
	grep "^[+].*End of first part" changed_hello_appended.diff
'

test_expect_success ' context does not include other functions' '
	test $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2
'

check_diff changed_hello_dummy 'changed two consecutive functions'

test_expect_success ' context includes begin' '
	grep "^ .*Begin of hello" changed_hello_dummy.diff &&
	grep "^ .*Begin of dummy" changed_hello_dummy.diff
'

test_expect_success ' context includes end' '
	grep "^ .*End of hello" changed_hello_dummy.diff &&
	grep "^ .*End of dummy" changed_hello_dummy.diff
'

test_expect_success ' overlapping hunks are merged' '
	test $(grep -c "^@@" changed_hello_dummy.diff) -eq 1
'

test_done