1#!/bin/sh
2
3test_description='git-cvsserver and git refspecs
4
5tests ability for git-cvsserver to switch between and compare
6tags, branches and other git refspecs'
7
8. ./test-lib.sh
9
10#########
11
12check_start_tree() {
13 rm -f "$WORKDIR/check.list"
14 echo "start $1" >> "${WORKDIR}/check.log"
15}
16
17check_file() {
18 sandbox="$1"
19 file="$2"
20 ver="$3"
21 GIT_DIR=$SERVERDIR git show "${ver}:${file}" \
22 > "$WORKDIR/check.got" 2> "$WORKDIR/check.stderr"
23 test_cmp "$WORKDIR/check.got" "$sandbox/$file"
24 stat=$?
25 echo "check_file $sandbox $file $ver : $stat" >> "$WORKDIR/check.log"
26 echo "$file" >> "$WORKDIR/check.list"
27 return $stat
28}
29
30check_end_tree() {
31 sandbox="$1"
32 expectCount=$(wc -l < "$WORKDIR/check.list")
33 cvsCount=$(find "$sandbox" -name CVS -prune -o -type f -print | wc -l)
34 test x"$cvsCount" = x"$expectCount"
35 stat=$?
36 echo "check_end $sandbox : $stat cvs=$cvsCount expect=$expectCount" \
37 >> "$WORKDIR/check.log"
38 return $stat
39}
40
41check_end_full_tree() {
42 sandbox="$1"
43 ver="$2"
44 expectCount=$(wc -l < "$WORKDIR/check.list")
45 cvsCount=$(find "$sandbox" -name CVS -prune -o -type f -print | wc -l)
46 gitCount=$(git ls-tree -r "$2" | wc -l)
47 test x"$cvsCount" = x"$expectCount" -a x"$gitCount" = x"$expectCount"
48 stat=$?
49 echo "check_end $sandbox : $stat cvs=$cvsCount git=$gitCount expect=$expectCount" \
50 >> "$WORKDIR/check.log"
51 return $stat
52}
53
54#########
55
56check_diff() {
57 diffFile="$1"
58 vOld="$2"
59 vNew="$3"
60 rm -rf diffSandbox
61 git clone -q -n . diffSandbox &&
62 ( cd diffSandbox &&
63 git checkout "$vOld" &&
64 git apply -p0 --index <"../$diffFile" &&
65 git diff --exit-code "$vNew" ) > check_diff_apply.out 2>&1
66}
67
68#########
69
70cvs >/dev/null 2>&1
71if test $? -ne 1
72then
73 skip_all='skipping git-cvsserver tests, cvs not found'
74 test_done
75fi
76if ! test_have_prereq PERL
77then
78 skip_all='skipping git-cvsserver tests, perl not available'
79 test_done
80fi
81"$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
82 skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable'
83 test_done
84}
85
86unset GIT_DIR GIT_CONFIG
87WORKDIR=$(pwd)
88SERVERDIR=$(pwd)/gitcvs.git
89git_config="$SERVERDIR/config"
90CVSROOT=":fork:$SERVERDIR"
91CVSWORK="$(pwd)/cvswork"
92CVS_SERVER=git-cvsserver
93export CVSROOT CVS_SERVER
94
95rm -rf "$CVSWORK" "$SERVERDIR"
96test_expect_success 'setup v1, b1' '
97 echo "Simple text file" > textfile.c &&
98 echo "t2" > t2 &&
99 mkdir adir &&
100 echo "adir/afile line1" > adir/afile &&
101 echo "adir/afile line2" >> adir/afile &&
102 echo "adir/afile line3" >> adir/afile &&
103 echo "adir/afile line4" >> adir/afile &&
104 echo "adir/a2file" >> adir/a2file &&
105 mkdir adir/bdir &&
106 echo "adir/bdir/bfile line 1" > adir/bdir/bfile &&
107 echo "adir/bdir/bfile line 2" >> adir/bdir/bfile &&
108 echo "adir/bdir/b2file" > adir/bdir/b2file &&
109 git add textfile.c t2 adir &&
110 git commit -q -m "First Commit (v1)" &&
111 git tag v1 &&
112 git branch b1 &&
113 git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&
114 GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
115 GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log"
116'
117
118rm -rf cvswork
119test_expect_success 'cvs co v1' '
120 cvs -f -Q co -r v1 -d cvswork master >cvs.log 2>&1 &&
121 check_start_tree cvswork &&
122 check_file cvswork textfile.c v1 &&
123 check_file cvswork t2 v1 &&
124 check_file cvswork adir/afile v1 &&
125 check_file cvswork adir/a2file v1 &&
126 check_file cvswork adir/bdir/bfile v1 &&
127 check_file cvswork adir/bdir/b2file v1 &&
128 check_end_tree cvswork
129'
130
131rm -rf cvswork
132test_expect_success 'cvs co b1' '
133 cvs -f co -r b1 -d cvswork master >cvs.log 2>&1 &&
134 check_start_tree cvswork &&
135 check_file cvswork textfile.c v1 &&
136 check_file cvswork t2 v1 &&
137 check_file cvswork adir/afile v1 &&
138 check_file cvswork adir/a2file v1 &&
139 check_file cvswork adir/bdir/bfile v1 &&
140 check_file cvswork adir/bdir/b2file v1 &&
141 check_end_tree cvswork
142'
143
144test_expect_success 'cvs co b1 [cvswork3]' '
145 cvs -f co -r b1 -d cvswork3 master >cvs.log 2>&1 &&
146 check_start_tree cvswork3 &&
147 check_file cvswork3 textfile.c v1 &&
148 check_file cvswork3 t2 v1 &&
149 check_file cvswork3 adir/afile v1 &&
150 check_file cvswork3 adir/a2file v1 &&
151 check_file cvswork3 adir/bdir/bfile v1 &&
152 check_file cvswork3 adir/bdir/b2file v1 &&
153 check_end_full_tree cvswork3 v1
154'
155
156test_expect_success 'edit cvswork3 and save diff' '
157 ( cd cvswork3 &&
158 sed -e "s/line1/line1 - data/" adir/afile >adir/afileNEW &&
159 mv -f adir/afileNEW adir/afile &&
160 echo "afile5" > adir/afile5 &&
161 rm t2 &&
162 cvs -f add adir/afile5 &&
163 cvs -f rm t2 &&
164 test_must_fail cvs -f diff -N -u >"$WORKDIR/cvswork3edit.diff"
165 )
166'
167
168test_expect_success 'setup v1.2 on b1' '
169 git checkout b1 &&
170 echo "new v1.2" > t3 &&
171 rm t2 &&
172 sed -e "s/line3/line3 - more data/" adir/afile >adir/afileNEW &&
173 mv -f adir/afileNEW adir/afile &&
174 rm adir/a2file &&
175 echo "a3file" >> adir/a3file &&
176 echo "bfile line 3" >> adir/bdir/bfile &&
177 rm adir/bdir/b2file &&
178 echo "b3file" > adir/bdir/b3file &&
179 mkdir cdir &&
180 echo "cdir/cfile" > cdir/cfile &&
181 git add -A cdir adir t3 t2 &&
182 git commit -q -m 'v1.2' &&
183 git tag v1.2 &&
184 git push --tags gitcvs.git b1:b1
185'
186
187test_expect_success 'cvs -f up (on b1 adir)' '
188 ( cd cvswork/adir &&
189 cvs -f up -d ) >cvs.log 2>&1 &&
190 check_start_tree cvswork &&
191 check_file cvswork textfile.c v1 &&
192 check_file cvswork t2 v1 &&
193 check_file cvswork adir/afile v1.2 &&
194 check_file cvswork adir/a3file v1.2 &&
195 check_file cvswork adir/bdir/bfile v1.2 &&
196 check_file cvswork adir/bdir/b3file v1.2 &&
197 check_end_tree cvswork
198'
199
200test_expect_success 'cvs up (on b1 /)' '
201 ( cd cvswork &&
202 cvs -f up -d ) >cvs.log 2>&1 &&
203 check_start_tree cvswork &&
204 check_file cvswork textfile.c v1.2 &&
205 check_file cvswork t3 v1.2 &&
206 check_file cvswork adir/afile v1.2 &&
207 check_file cvswork adir/a3file v1.2 &&
208 check_file cvswork adir/bdir/bfile v1.2 &&
209 check_file cvswork adir/bdir/b3file v1.2 &&
210 check_file cvswork cdir/cfile v1.2 &&
211 check_end_tree cvswork
212'
213
214# Make sure "CVS/Tag" files didn't get messed up:
215test_expect_success 'cvs up (on b1 /) (again; check CVS/Tag files)' '
216 ( cd cvswork &&
217 cvs -f up -d ) >cvs.log 2>&1 &&
218 check_start_tree cvswork &&
219 check_file cvswork textfile.c v1.2 &&
220 check_file cvswork t3 v1.2 &&
221 check_file cvswork adir/afile v1.2 &&
222 check_file cvswork adir/a3file v1.2 &&
223 check_file cvswork adir/bdir/bfile v1.2 &&
224 check_file cvswork adir/bdir/b3file v1.2 &&
225 check_file cvswork cdir/cfile v1.2 &&
226 check_end_tree cvswork
227'
228
229# update to another version:
230test_expect_success 'cvs up -r v1' '
231 ( cd cvswork &&
232 cvs -f up -r v1 ) >cvs.log 2>&1 &&
233 check_start_tree cvswork &&
234 check_file cvswork textfile.c v1 &&
235 check_file cvswork t2 v1 &&
236 check_file cvswork adir/afile v1 &&
237 check_file cvswork adir/a2file v1 &&
238 check_file cvswork adir/bdir/bfile v1 &&
239 check_file cvswork adir/bdir/b2file v1 &&
240 check_end_tree cvswork
241'
242
243test_expect_success 'cvs up' '
244 ( cd cvswork &&
245 cvs -f up ) >cvs.log 2>&1 &&
246 check_start_tree cvswork &&
247 check_file cvswork textfile.c v1 &&
248 check_file cvswork t2 v1 &&
249 check_file cvswork adir/afile v1 &&
250 check_file cvswork adir/a2file v1 &&
251 check_file cvswork adir/bdir/bfile v1 &&
252 check_file cvswork adir/bdir/b2file v1 &&
253 check_end_tree cvswork
254'
255
256test_expect_success 'cvs up (again; check CVS/Tag files)' '
257 ( cd cvswork &&
258 cvs -f up -d ) >cvs.log 2>&1 &&
259 check_start_tree cvswork &&
260 check_file cvswork textfile.c v1 &&
261 check_file cvswork t2 v1 &&
262 check_file cvswork adir/afile v1 &&
263 check_file cvswork adir/a2file v1 &&
264 check_file cvswork adir/bdir/bfile v1 &&
265 check_file cvswork adir/bdir/b2file v1 &&
266 check_end_tree cvswork
267'
268
269test_expect_success 'setup simple b2' '
270 git branch b2 v1 &&
271 git push --tags gitcvs.git b2:b2
272'
273
274test_expect_success 'cvs co b2 [into cvswork2]' '
275 cvs -f co -r b2 -d cvswork2 master >cvs.log 2>&1 &&
276 check_start_tree cvswork &&
277 check_file cvswork textfile.c v1 &&
278 check_file cvswork t2 v1 &&
279 check_file cvswork adir/afile v1 &&
280 check_file cvswork adir/a2file v1 &&
281 check_file cvswork adir/bdir/bfile v1 &&
282 check_file cvswork adir/bdir/b2file v1 &&
283 check_end_tree cvswork
284'
285
286test_expect_success 'root dir edit [cvswork2]' '
287 ( cd cvswork2 &&
288 echo "Line 2" >> textfile.c &&
289 test_must_fail cvs -f diff -u >"$WORKDIR/cvsEdit1.diff" &&
290 cvs -f commit -m "edit textfile.c" textfile.c
291 ) >cvsEdit1.log 2>&1
292'
293
294test_expect_success 'root dir rm file [cvswork2]' '
295 ( cd cvswork2 &&
296 cvs -f rm -f t2 &&
297 cvs -f diff -u > ../cvsEdit2-empty.diff &&
298 test_must_fail cvs -f diff -N -u >"$WORKDIR/cvsEdit2-N.diff" &&
299 cvs -f commit -m "rm t2"
300 ) > cvsEdit2.log 2>&1
301'
302
303test_expect_success 'subdir edit/add/rm files [cvswork2' '
304 ( cd cvswork2 &&
305 sed -e "s/line 1/line 1 (v2)/" adir/bdir/bfile >adir/bdir/bfileNEW &&
306 mv -f adir/bdir/bfileNEW adir/bdir/bfile &&
307 rm adir/bdir/b2file &&
308 cd adir &&
309 cvs -f rm bdir/b2file &&
310 echo "4th file" > bdir/b4file &&
311 cvs -f add bdir/b4file &&
312 test_must_fail cvs -f diff -N -u >"$WORKDIR/cvsEdit3.diff" &&
313 git fetch gitcvs.git b2:b2 &&
314 ( cd .. &&
315 test_must_fail cvs -f diff -u -N -r v1.2 >"$WORKDIR/cvsEdit3-v1.2.diff" &&
316 test_must_fail cvs -f diff -u -N -r v1.2 -r v1 >"$WORKDIR/cvsEdit3-v1.2-v1.diff"
317 ) &&
318 cvs -f commit -m "various add/rm/edit"
319 ) >cvs.log 2>&1
320'
321
322test_expect_success 'validate result of edits [cvswork2]' '
323 git fetch gitcvs.git b2:b2 &&
324 git tag v2 b2 &&
325 git push --tags gitcvs.git b2:b2 &&
326 check_start_tree cvswork2 &&
327 check_file cvswork2 textfile.c v2 &&
328 check_file cvswork2 adir/afile v2 &&
329 check_file cvswork2 adir/a2file v2 &&
330 check_file cvswork2 adir/bdir/bfile v2 &&
331 check_file cvswork2 adir/bdir/b4file v2 &&
332 check_end_full_tree cvswork2 v2
333'
334
335test_expect_success 'validate basic diffs saved during above cvswork2 edits' '
336 test $(grep Index: cvsEdit1.diff | wc -l) = 1 &&
337 test ! -s cvsEdit2-empty.diff &&
338 test $(grep Index: cvsEdit2-N.diff | wc -l) = 1 &&
339 test $(grep Index: cvsEdit3.diff | wc -l) = 3 &&
340 rm -rf diffSandbox &&
341 git clone -q -n . diffSandbox &&
342 ( cd diffSandbox &&
343 git checkout v1 &&
344 git apply -p0 --index <"$WORKDIR/cvsEdit1.diff" &&
345 git apply -p0 --index <"$WORKDIR/cvsEdit2-N.diff" &&
346 git apply -p0 --directory=adir --index <"$WORKDIR/cvsEdit3.diff" &&
347 git diff --exit-code v2 ) >"check_diff_apply.out" 2>&1
348'
349
350test_expect_success 'validate v1.2 diff saved during last cvswork2 edit' '
351 test $(grep Index: cvsEdit3-v1.2.diff | wc -l) = 9 &&
352 check_diff cvsEdit3-v1.2.diff v1.2 v2
353'
354
355test_expect_success 'validate v1.2 v1 diff saved during last cvswork2 edit' '
356 test $(grep Index: cvsEdit3-v1.2-v1.diff | wc -l) = 9 &&
357 check_diff cvsEdit3-v1.2-v1.diff v1.2 v1
358'
359
360test_expect_success 'cvs up [cvswork2]' '
361 ( cd cvswork2 &&
362 cvs -f up ) >cvs.log 2>&1 &&
363 check_start_tree cvswork2 &&
364 check_file cvswork2 textfile.c v2 &&
365 check_file cvswork2 adir/afile v2 &&
366 check_file cvswork2 adir/a2file v2 &&
367 check_file cvswork2 adir/bdir/bfile v2 &&
368 check_file cvswork2 adir/bdir/b4file v2 &&
369 check_end_full_tree cvswork2 v2
370'
371
372test_expect_success 'cvs up -r b2 [back to cvswork]' '
373 ( cd cvswork &&
374 cvs -f up -r b2 ) >cvs.log 2>&1 &&
375 check_start_tree cvswork &&
376 check_file cvswork textfile.c v2 &&
377 check_file cvswork adir/afile v2 &&
378 check_file cvswork adir/a2file v2 &&
379 check_file cvswork adir/bdir/bfile v2 &&
380 check_file cvswork adir/bdir/b4file v2 &&
381 check_end_full_tree cvswork v2
382'
383
384test_expect_success 'cvs up -r b1' '
385 ( cd cvswork &&
386 cvs -f up -r b1 ) >cvs.log 2>&1 &&
387 check_start_tree cvswork &&
388 check_file cvswork textfile.c v1.2 &&
389 check_file cvswork t3 v1.2 &&
390 check_file cvswork adir/afile v1.2 &&
391 check_file cvswork adir/a3file v1.2 &&
392 check_file cvswork adir/bdir/bfile v1.2 &&
393 check_file cvswork adir/bdir/b3file v1.2 &&
394 check_file cvswork cdir/cfile v1.2 &&
395 check_end_full_tree cvswork v1.2
396'
397
398test_expect_success 'cvs up -A' '
399 ( cd cvswork &&
400 cvs -f up -A ) >cvs.log 2>&1 &&
401 check_start_tree cvswork &&
402 check_file cvswork textfile.c v1 &&
403 check_file cvswork t2 v1 &&
404 check_file cvswork adir/afile v1 &&
405 check_file cvswork adir/a2file v1 &&
406 check_file cvswork adir/bdir/bfile v1 &&
407 check_file cvswork adir/bdir/b2file v1 &&
408 check_end_full_tree cvswork v1
409'
410
411test_expect_success 'cvs up (check CVS/Tag files)' '
412 ( cd cvswork &&
413 cvs -f up ) >cvs.log 2>&1 &&
414 check_start_tree cvswork &&
415 check_file cvswork textfile.c v1 &&
416 check_file cvswork t2 v1 &&
417 check_file cvswork adir/afile v1 &&
418 check_file cvswork adir/a2file v1 &&
419 check_file cvswork adir/bdir/bfile v1 &&
420 check_file cvswork adir/bdir/b2file v1 &&
421 check_end_full_tree cvswork v1
422'
423
424# This is not really legal CVS, but it seems to work anyway:
425test_expect_success 'cvs up -r heads/b1' '
426 ( cd cvswork &&
427 cvs -f up -r heads/b1 ) >cvs.log 2>&1 &&
428 check_start_tree cvswork &&
429 check_file cvswork textfile.c v1.2 &&
430 check_file cvswork t3 v1.2 &&
431 check_file cvswork adir/afile v1.2 &&
432 check_file cvswork adir/a3file v1.2 &&
433 check_file cvswork adir/bdir/bfile v1.2 &&
434 check_file cvswork adir/bdir/b3file v1.2 &&
435 check_file cvswork cdir/cfile v1.2 &&
436 check_end_full_tree cvswork v1.2
437'
438
439# But this should work even if CVS client checks -r more carefully:
440test_expect_success 'cvs up -r heads_-s-b2 (cvsserver escape mechanism)' '
441 ( cd cvswork &&
442 cvs -f up -r heads_-s-b2 ) >cvs.log 2>&1 &&
443 check_start_tree cvswork &&
444 check_file cvswork textfile.c v2 &&
445 check_file cvswork adir/afile v2 &&
446 check_file cvswork adir/a2file v2 &&
447 check_file cvswork adir/bdir/bfile v2 &&
448 check_file cvswork adir/bdir/b4file v2 &&
449 check_end_full_tree cvswork v2
450'
451
452v1hash=$(git rev-parse v1)
453test_expect_success 'cvs up -r $(git rev-parse v1)' '
454 test -n "$v1hash" &&
455 ( cd cvswork &&
456 cvs -f up -r "$v1hash" ) >cvs.log 2>&1 &&
457 check_start_tree cvswork &&
458 check_file cvswork textfile.c v1 &&
459 check_file cvswork t2 v1 &&
460 check_file cvswork adir/afile v1 &&
461 check_file cvswork adir/a2file v1 &&
462 check_file cvswork adir/bdir/bfile v1 &&
463 check_file cvswork adir/bdir/b2file v1 &&
464 check_end_full_tree cvswork v1
465'
466
467test_expect_success 'cvs diff -r v1 -u' '
468 ( cd cvswork &&
469 cvs -f diff -r v1 -u ) >cvsDiff.out 2>cvs.log &&
470 test ! -s cvsDiff.out &&
471 test ! -s cvs.log
472'
473
474test_expect_success 'cvs diff -N -r v2 -u' '
475 ( cd cvswork &&
476 test_must_fail cvs -f diff -N -r v2 -u ) >cvsDiff.out 2>cvs.log &&
477 test ! -s cvs.log &&
478 test -s cvsDiff.out &&
479 check_diff cvsDiff.out v2 v1 > check_diff.out 2>&1
480'
481
482test_expect_success 'cvs diff -N -r v2 -r v1.2' '
483 ( cd cvswork &&
484 test_must_fail cvs -f diff -N -r v2 -r v1.2 -u ) >cvsDiff.out 2>cvs.log &&
485 test ! -s cvs.log &&
486 test -s cvsDiff.out &&
487 check_diff cvsDiff.out v2 v1.2 > check_diff.out 2>&1
488'
489
490test_expect_success 'apply early [cvswork3] diff to b3' '
491 git clone -q . gitwork3 &&
492 ( cd gitwork3 &&
493 git checkout -b b3 v1 &&
494 git apply -p0 --index <"$WORKDIR/cvswork3edit.diff" &&
495 git commit -m "cvswork3 edits applied" ) &&
496 git fetch gitwork3 b3:b3 &&
497 git tag v3 b3
498'
499
500test_expect_success 'check [cvswork3] diff' '
501 ( cd cvswork3 &&
502 test_must_fail cvs -f diff -N -u ) >"$WORKDIR/cvsDiff.out" 2>cvs.log &&
503 test ! -s cvs.log &&
504 test -s cvsDiff.out &&
505 test $(grep Index: cvsDiff.out | wc -l) = 3 &&
506 test_cmp cvsDiff.out cvswork3edit.diff &&
507 check_diff cvsDiff.out v1 v3 > check_diff.out 2>&1
508'
509
510test_expect_success 'merge early [cvswork3] b3 with b1' '
511 ( cd gitwork3 &&
512 git merge "message" HEAD b1 )
513 git fetch gitwork3 b3:b3 &&
514 git tag v3merged b3 &&
515 git push --tags gitcvs.git b3:b3
516'
517
518# This test would fail if cvsserver properly created a ".#afile"* file
519# for the merge.
520# TODO: Validate that the .# file was saved properly, and then
521# delete/ignore it when checking the tree.
522test_expect_success 'cvs up dirty [cvswork3]' '
523 ( cd cvswork3 &&
524 cvs -f up &&
525 test_must_fail cvs -f diff -N -u >"$WORKDIR/cvsDiff.out" ) >cvs.log 2>&1 &&
526 test -s cvsDiff.out &&
527 test $(grep Index: cvsDiff.out | wc -l) = 2
528 check_start_tree cvswork3 &&
529 check_file cvswork3 textfile.c v3merged &&
530 check_file cvswork3 t3 v3merged &&
531 check_file cvswork3 adir/afile v3merged &&
532 check_file cvswork3 adir/a3file v3merged &&
533 check_file cvswork3 adir/afile5 v3merged &&
534 check_file cvswork3 adir/bdir/bfile v3merged &&
535 check_file cvswork3 adir/bdir/b3file v3merged &&
536 check_file cvswork3 cdir/cfile v3merged &&
537 check_end_full_tree cvswork3 v3merged
538'
539
540# TODO: test cvs status
541
542test_expect_success 'cvs commit [cvswork3' '
543 ( cd cvswork3 &&
544 cvs -f commit -m "dirty sandbox after auto-merge"
545 ) > cvs.log 2>&1 &&
546 check_start_tree cvswork3 &&
547 check_file cvswork3 textfile.c v3merged &&
548 check_file cvswork3 t3 v3merged &&
549 check_file cvswork3 adir/afile v3merged &&
550 check_file cvswork3 adir/a3file v3merged &&
551 check_file cvswork3 adir/afile5 v3merged &&
552 check_file cvswork3 adir/bdir/bfile v3merged &&
553 check_file cvswork3 adir/bdir/b3file v3merged &&
554 check_file cvswork3 cdir/cfile v3merged &&
555 check_end_full_tree cvswork3 v3merged &&
556 git fetch gitcvs.git b3:b4 &&
557 git tag v4.1 b4 &&
558 git diff --exit-code v4.1 v3merged > check_diff_apply.out 2>&1
559'
560
561test_done