Skip to content

Commit 63651e1

Browse files
Felipe Gonçalves Assisgitster
authored andcommitted
t3034: add rename threshold tests
10ae752 (merge-recursive: option to specify rename threshold, 2010-09-27) introduced this feature but did not include any tests. The tests use the new option --find-renames, which replaces the then introduced and now deprecated option --rename-threshold. Also update name and description of t3032 for consistency: "merge-recursive options" -> "merge-recursive space options" Signed-off-by: Felipe Gonçalves Assis <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 87892f6 commit 63651e1

File tree

2 files changed

+239
-1
lines changed

2 files changed

+239
-1
lines changed

t/t3032-merge-recursive-options.sh renamed to t/t3032-merge-recursive-space-options.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/sh
22

3-
test_description='merge-recursive options
3+
test_description='merge-recursive space options
44
55
* [master] Clarify
66
! [remote] Remove cruft
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
#!/bin/sh
2+
3+
test_description='merge-recursive rename options
4+
5+
Test rename detection by examining rename/delete conflicts.
6+
7+
* (HEAD -> rename) rename
8+
| * (master) delete
9+
|/
10+
* base
11+
12+
git diff --name-status base master
13+
D 0-old
14+
D 1-old
15+
D 2-old
16+
D 3-old
17+
18+
git diff --name-status -M01 base rename
19+
R025 0-old 0-new
20+
R050 1-old 1-new
21+
R075 2-old 2-new
22+
R100 3-old 3-new
23+
24+
Actual similarity indices are parsed from diff output. We rely on the fact that
25+
they are rounded down (see, e.g., Documentation/diff-generate-patch.txt, which
26+
mentions this in a different context).
27+
'
28+
29+
. ./test-lib.sh
30+
31+
get_expected_stages () {
32+
git checkout rename -- $1-new &&
33+
git ls-files --stage $1-new >expected-stages-undetected-$1 &&
34+
sed "s/ 0 / 2 /" <expected-stages-undetected-$1 \
35+
>expected-stages-detected-$1 &&
36+
git read-tree -u --reset HEAD
37+
}
38+
39+
rename_detected () {
40+
git ls-files --stage $1-old $1-new >stages-actual-$1 &&
41+
test_cmp expected-stages-detected-$1 stages-actual-$1
42+
}
43+
44+
rename_undetected () {
45+
git ls-files --stage $1-old $1-new >stages-actual-$1 &&
46+
test_cmp expected-stages-undetected-$1 stages-actual-$1
47+
}
48+
49+
check_common () {
50+
git ls-files --stage >stages-actual &&
51+
test_line_count = 4 stages-actual
52+
}
53+
54+
check_threshold_0 () {
55+
check_common &&
56+
rename_detected 0 &&
57+
rename_detected 1 &&
58+
rename_detected 2 &&
59+
rename_detected 3
60+
}
61+
62+
check_threshold_1 () {
63+
check_common &&
64+
rename_undetected 0 &&
65+
rename_detected 1 &&
66+
rename_detected 2 &&
67+
rename_detected 3
68+
}
69+
70+
check_threshold_2 () {
71+
check_common &&
72+
rename_undetected 0 &&
73+
rename_undetected 1 &&
74+
rename_detected 2 &&
75+
rename_detected 3
76+
}
77+
78+
check_exact_renames () {
79+
check_common &&
80+
rename_undetected 0 &&
81+
rename_undetected 1 &&
82+
rename_undetected 2 &&
83+
rename_detected 3
84+
}
85+
86+
test_expect_success 'setup repo' '
87+
cat <<-\EOF >3-old &&
88+
33a
89+
33b
90+
33c
91+
33d
92+
EOF
93+
sed s/33/22/ <3-old >2-old &&
94+
sed s/33/11/ <3-old >1-old &&
95+
sed s/33/00/ <3-old >0-old &&
96+
git add [0-3]-old &&
97+
git commit -m base &&
98+
git rm [0-3]-old &&
99+
git commit -m delete &&
100+
git checkout -b rename HEAD^ &&
101+
cp 3-old 3-new &&
102+
sed 1,1s/./x/ <2-old >2-new &&
103+
sed 1,2s/./x/ <1-old >1-new &&
104+
sed 1,3s/./x/ <0-old >0-new &&
105+
git add [0-3]-new &&
106+
git rm [0-3]-old &&
107+
git commit -m rename &&
108+
get_expected_stages 0 &&
109+
get_expected_stages 1 &&
110+
get_expected_stages 2 &&
111+
get_expected_stages 3 &&
112+
check_50="false" &&
113+
tail="HEAD^ -- HEAD master"
114+
'
115+
116+
test_expect_success 'setup thresholds' '
117+
git diff --name-status -M01 HEAD^ HEAD >diff-output &&
118+
test_debug "cat diff-output" &&
119+
test_line_count = 4 diff-output &&
120+
grep "R[0-9][0-9][0-9] \([0-3]\)-old \1-new" diff-output \
121+
>grep-output &&
122+
test_cmp diff-output grep-output &&
123+
th0=$(sed -n "s/R\(...\) 0-old 0-new/\1/p" <diff-output) &&
124+
th1=$(sed -n "s/R\(...\) 1-old 1-new/\1/p" <diff-output) &&
125+
th2=$(sed -n "s/R\(...\) 2-old 2-new/\1/p" <diff-output) &&
126+
th3=$(sed -n "s/R\(...\) 3-old 3-new/\1/p" <diff-output) &&
127+
test "$th0" -lt "$th1" &&
128+
test "$th1" -lt "$th2" &&
129+
test "$th2" -lt "$th3" &&
130+
test "$th3" = 100 &&
131+
if test 50 -le "$th0"
132+
then
133+
check_50=check_threshold_0
134+
elif test 50 -le "$th1"
135+
then
136+
check_50=check_threshold_1
137+
elif test 50 -le "$th2"
138+
then
139+
check_50=check_threshold_2
140+
fi &&
141+
th0="$th0%" &&
142+
th1="$th1%" &&
143+
th2="$th2%" &&
144+
th3="$th3%"
145+
'
146+
147+
test_expect_success 'assumption for tests: rename detection with diff' '
148+
git diff --name-status -M$th0 --diff-filter=R HEAD^ HEAD \
149+
>diff-output-0 &&
150+
git diff --name-status -M$th1 --diff-filter=R HEAD^ HEAD \
151+
>diff-output-1 &&
152+
git diff --name-status -M$th2 --diff-filter=R HEAD^ HEAD \
153+
>diff-output-2 &&
154+
git diff --name-status -M100% --diff-filter=R HEAD^ HEAD \
155+
>diff-output-3 &&
156+
test_line_count = 4 diff-output-0 &&
157+
test_line_count = 3 diff-output-1 &&
158+
test_line_count = 2 diff-output-2 &&
159+
test_line_count = 1 diff-output-3
160+
'
161+
162+
test_expect_success 'default similarity threshold is 50%' '
163+
git read-tree --reset -u HEAD &&
164+
test_must_fail git merge-recursive $tail &&
165+
$check_50
166+
'
167+
168+
test_expect_success 'low rename threshold' '
169+
git read-tree --reset -u HEAD &&
170+
test_must_fail git merge-recursive --find-renames=$th0 $tail &&
171+
check_threshold_0
172+
'
173+
174+
test_expect_success 'medium rename threshold' '
175+
git read-tree --reset -u HEAD &&
176+
test_must_fail git merge-recursive --find-renames=$th1 $tail &&
177+
check_threshold_1
178+
'
179+
180+
test_expect_success 'high rename threshold' '
181+
git read-tree --reset -u HEAD &&
182+
test_must_fail git merge-recursive --find-renames=$th2 $tail &&
183+
check_threshold_2
184+
'
185+
186+
test_expect_success 'exact renames only' '
187+
git read-tree --reset -u HEAD &&
188+
test_must_fail git merge-recursive --find-renames=100% $tail &&
189+
check_exact_renames
190+
'
191+
192+
test_expect_success 'rename threshold is truncated' '
193+
git read-tree --reset -u HEAD &&
194+
test_must_fail git merge-recursive --find-renames=200% $tail &&
195+
check_exact_renames
196+
'
197+
198+
test_expect_success 'last wins in --find-renames=<m> --find-renames=<n>' '
199+
git read-tree --reset -u HEAD &&
200+
test_must_fail git merge-recursive \
201+
--find-renames=$th0 --find-renames=$th2 $tail &&
202+
check_threshold_2
203+
'
204+
205+
test_expect_success '--find-renames resets threshold' '
206+
git read-tree --reset -u HEAD &&
207+
test_must_fail git merge-recursive \
208+
--find-renames=$th0 --find-renames $tail &&
209+
$check_50
210+
'
211+
212+
test_expect_success 'assumption for further tests: trivial merge succeeds' '
213+
git read-tree --reset -u HEAD &&
214+
git merge-recursive HEAD -- HEAD HEAD &&
215+
git diff --quiet --cached &&
216+
git merge-recursive --find-renames=$th0 HEAD -- HEAD HEAD &&
217+
git diff --quiet --cached &&
218+
git merge-recursive --find-renames=$th2 HEAD -- HEAD HEAD &&
219+
git diff --quiet --cached &&
220+
git merge-recursive --find-renames=100% HEAD -- HEAD HEAD &&
221+
git diff --quiet --cached
222+
'
223+
224+
test_expect_success '--find-renames rejects negative argument' '
225+
git read-tree --reset -u HEAD &&
226+
test_must_fail git merge-recursive --find-renames=-25 \
227+
HEAD -- HEAD HEAD &&
228+
git diff --quiet --cached
229+
'
230+
231+
test_expect_success '--find-renames rejects non-numbers' '
232+
git read-tree --reset -u HEAD &&
233+
test_must_fail git merge-recursive --find-renames=0xf \
234+
HEAD -- HEAD HEAD &&
235+
git diff --quiet --cached
236+
'
237+
238+
test_done

0 commit comments

Comments
 (0)