1
-#!/bin/sh
2
-
3
-test_description='check svn dumpfile importer'
4
-
5
-. ./test-lib.sh
6
-
7
-if test_have_prereq !PIPE
8
-then
9
- skip_all="svn dumpfile importer testing requires the PIPE prerequisite"
10
- test_done
11
-fi
12
-
13
-reinit_git () {
14
- rm -fr .git &&
15
- rm -f stream backflow &&
16
- git init &&
17
- mkfifo stream backflow
18
-}
19
-
20
-try_dump () {
21
- input=$1 &&
22
- maybe_fail_svnfe=${2:+test_$2} &&
23
- maybe_fail_fi=${3:+test_$3} &&
24
-
25
- {
26
- $maybe_fail_svnfe test-svn-fe "$input" >stream 3<backflow &
27
- } &&
28
- $maybe_fail_fi git fast-import --cat-blob-fd=3 <stream 3>backflow &&
29
- wait $!
30
-}
31
-
32
-properties () {
33
- while test "$#" -ne 0
34
- do
35
- property="$1" &&
36
- value="$2" &&
37
- printf "%s\n" "K ${#property}" &&
38
- printf "%s\n" "$property" &&
39
- printf "%s\n" "V ${#value}" &&
40
- printf "%s\n" "$value" &&
41
- shift 2 ||
42
- return 1
43
- done
44
-}
45
-
46
-text_no_props () {
47
- text="$1
48
-" &&
49
- printf "%s\n" "Prop-content-length: 10" &&
50
- printf "%s\n" "Text-content-length: ${#text}" &&
51
- printf "%s\n" "Content-length: $((${#text} + 10))" &&
52
- printf "%s\n" "" "PROPS-END" &&
53
- printf "%s\n" "$text"
54
-}
55
-
56
-test_expect_success 'empty dump' '
57
- reinit_git &&
58
- echo "SVN-fs-dump-format-version: 2" >input &&
59
- try_dump input
60
-'
61
-
62
-test_expect_success 'v4 dumps not supported' '
63
- reinit_git &&
64
- echo "SVN-fs-dump-format-version: 4" >v4.dump &&
65
- try_dump v4.dump must_fail
66
-'
67
-
68
-test_expect_failure 'empty revision' '
69
- reinit_git &&
70
- printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
71
- cat >emptyrev.dump <<-\EOF &&
72
- SVN-fs-dump-format-version: 3
73
-
74
- Revision-number: 1
75
- Prop-content-length: 0
76
- Content-length: 0
77
-
78
- Revision-number: 2
79
- Prop-content-length: 0
80
- Content-length: 0
81
-
82
- EOF
83
- try_dump emptyrev.dump &&
84
- git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
85
- test_cmp expect actual
86
-'
87
-
88
-test_expect_success 'empty properties' '
89
- reinit_git &&
90
- printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
91
- cat >emptyprop.dump <<-\EOF &&
92
- SVN-fs-dump-format-version: 3
93
-
94
- Revision-number: 1
95
- Prop-content-length: 10
96
- Content-length: 10
97
-
98
- PROPS-END
99
-
100
- Revision-number: 2
101
- Prop-content-length: 10
102
- Content-length: 10
103
-
104
- PROPS-END
105
- EOF
106
- try_dump emptyprop.dump &&
107
- git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
108
- test_cmp expect actual
109
-'
110
-
111
-test_expect_success 'author name and commit message' '
112
- reinit_git &&
113
- echo "<author@example.com, author@example.com@local>" >expect.author &&
114
- cat >message <<-\EOF &&
115
- A concise summary of the change
116
-
117
- A detailed description of the change, why it is needed, what
118
- was broken and why applying this is the best course of action.
119
-
120
- * file.c
121
- Details pertaining to an individual file.
122
- EOF
123
- {
124
- properties \
125
- svn:author author@example.com \
126
- svn:log "$(cat message)" &&
127
- echo PROPS-END
128
- } >props &&
129
- {
130
- echo "SVN-fs-dump-format-version: 3" &&
131
- echo &&
132
- echo "Revision-number: 1" &&
133
- echo Prop-content-length: $(wc -c <props) &&
134
- echo Content-length: $(wc -c <props) &&
135
- echo &&
136
- cat props
137
- } >log.dump &&
138
- try_dump log.dump &&
139
- git log -p --format="%B" HEAD >actual.log &&
140
- git log --format="<%an, %ae>" >actual.author &&
141
- test_cmp message actual.log &&
142
- test_cmp expect.author actual.author
143
-'
144
-
145
-test_expect_success 'unsupported properties are ignored' '
146
- reinit_git &&
147
- echo author >expect &&
148
- cat >extraprop.dump <<-\EOF &&
149
- SVN-fs-dump-format-version: 3
150
-
151
- Revision-number: 1
152
- Prop-content-length: 56
153
- Content-length: 56
154
-
155
- K 8
156
- nonsense
157
- V 1
158
- y
159
- K 10
160
- svn:author
161
- V 6
162
- author
163
- PROPS-END
164
- EOF
165
- try_dump extraprop.dump &&
166
- git log -p --format=%an HEAD >actual &&
167
- test_cmp expect actual
168
-'
169
-
170
-test_expect_failure 'timestamp and empty file' '
171
- echo author@example.com >expect.author &&
172
- echo 1999-01-01 >expect.date &&
173
- echo file >expect.files &&
174
- reinit_git &&
175
- {
176
- properties \
177
- svn:author author@example.com \
178
- svn:date "1999-01-01T00:01:002.000000Z" \
179
- svn:log "add empty file" &&
180
- echo PROPS-END
181
- } >props &&
182
- {
183
- cat <<-EOF &&
184
- SVN-fs-dump-format-version: 3
185
-
186
- Revision-number: 1
187
- EOF
188
- echo Prop-content-length: $(wc -c <props) &&
189
- echo Content-length: $(wc -c <props) &&
190
- echo &&
191
- cat props &&
192
- cat <<-\EOF
193
-
194
- Node-path: empty-file
195
- Node-kind: file
196
- Node-action: add
197
- Content-length: 0
198
-
199
- EOF
200
- } >emptyfile.dump &&
201
- try_dump emptyfile.dump &&
202
- git log --format=%an HEAD >actual.author &&
203
- git log --date=short --format=%ad HEAD >actual.date &&
204
- git ls-tree -r --name-only HEAD >actual.files &&
205
- test_cmp expect.author actual.author &&
206
- test_cmp expect.date actual.date &&
207
- test_cmp expect.files actual.files &&
208
- git checkout HEAD empty-file &&
209
- test_must_be_empty file
210
-'
211
-
212
-test_expect_success 'directory with files' '
213
- reinit_git &&
214
- printf "%s\n" directory/file1 directory/file2 >expect.files &&
215
- echo hi >hi &&
216
- echo hello >hello &&
217
- {
218
- properties \
219
- svn:author author@example.com \
220
- svn:date "1999-02-01T00:01:002.000000Z" \
221
- svn:log "add directory with some files in it" &&
222
- echo PROPS-END
223
- } >props &&
224
- {
225
- cat <<-EOF &&
226
- SVN-fs-dump-format-version: 3
227
-
228
- Revision-number: 1
229
- EOF
230
- echo Prop-content-length: $(wc -c <props) &&
231
- echo Content-length: $(wc -c <props) &&
232
- echo &&
233
- cat props &&
234
- cat <<-\EOF &&
235
-
236
- Node-path: directory
237
- Node-kind: dir
238
- Node-action: add
239
- Prop-content-length: 10
240
- Content-length: 10
241
-
242
- PROPS-END
243
-
244
- Node-path: directory/file1
245
- Node-kind: file
246
- Node-action: add
247
- EOF
248
- text_no_props hello &&
249
- cat <<-\EOF &&
250
- Node-path: directory/file2
251
- Node-kind: file
252
- Node-action: add
253
- EOF
254
- text_no_props hi
255
- } >directory.dump &&
256
- try_dump directory.dump &&
257
-
258
- git ls-tree -r --name-only HEAD >actual.files &&
259
- git checkout HEAD directory &&
260
- test_cmp expect.files actual.files &&
261
- test_cmp hello directory/file1 &&
262
- test_cmp hi directory/file2
263
-'
264
-
265
-test_expect_success 'branch name with backslash' '
266
- reinit_git &&
267
- sort <<-\EOF >expect.branch-files &&
268
- trunk/file1
269
- trunk/file2
270
- "branches/UpdateFOPto094\\/file1"
271
- "branches/UpdateFOPto094\\/file2"
272
- EOF
273
-
274
- echo hi >hi &&
275
- echo hello >hello &&
276
- {
277
- properties \
278
- svn:author author@example.com \
279
- svn:date "1999-02-02T00:01:02.000000Z" \
280
- svn:log "add directory with some files in it" &&
281
- echo PROPS-END
282
- } >props.setup &&
283
- {
284
- properties \
285
- svn:author brancher@example.com \
286
- svn:date "2007-12-06T21:38:34.000000Z" \
287
- svn:log "Updating fop to .94 and adjust fo-stylesheets" &&
288
- echo PROPS-END
289
- } >props.branch &&
290
- {
291
- cat <<-EOF &&
292
- SVN-fs-dump-format-version: 3
293
-
294
- Revision-number: 1
295
- EOF
296
- echo Prop-content-length: $(wc -c <props.setup) &&
297
- echo Content-length: $(wc -c <props.setup) &&
298
- echo &&
299
- cat props.setup &&
300
- cat <<-\EOF &&
301
-
302
- Node-path: trunk
303
- Node-kind: dir
304
- Node-action: add
305
- Prop-content-length: 10
306
- Content-length: 10
307
-
308
- PROPS-END
309
-
310
- Node-path: branches
311
- Node-kind: dir
312
- Node-action: add
313
- Prop-content-length: 10
314
- Content-length: 10
315
-
316
- PROPS-END
317
-
318
- Node-path: trunk/file1
319
- Node-kind: file
320
- Node-action: add
321
- EOF
322
- text_no_props hello &&
323
- cat <<-\EOF &&
324
- Node-path: trunk/file2
325
- Node-kind: file
326
- Node-action: add
327
- EOF
328
- text_no_props hi &&
329
- cat <<-\EOF &&
330
-
331
- Revision-number: 2
332
- EOF
333
- echo Prop-content-length: $(wc -c <props.branch) &&
334
- echo Content-length: $(wc -c <props.branch) &&
335
- echo &&
336
- cat props.branch &&
337
- cat <<-\EOF
338
-
339
- Node-path: branches/UpdateFOPto094\
340
- Node-kind: dir
341
- Node-action: add
342
- Node-copyfrom-rev: 1
343
- Node-copyfrom-path: trunk
344
-
345
- Node-kind: dir
346
- Node-action: add
347
- Prop-content-length: 34
348
- Content-length: 34
349
-
350
- K 13
351
- svn:mergeinfo
352
- V 0
353
-
354
- PROPS-END
355
- EOF
356
- } >branch.dump &&
357
- try_dump branch.dump &&
358
-
359
- git ls-tree -r --name-only HEAD |
360
- sort >actual.branch-files &&
361
- test_cmp expect.branch-files actual.branch-files
362
-'
363
-
364
-test_expect_success 'node without action' '
365
- reinit_git &&
366
- cat >inaction.dump <<-\EOF &&
367
- SVN-fs-dump-format-version: 3
368
-
369
- Revision-number: 1
370
- Prop-content-length: 10
371
- Content-length: 10
372
-
373
- PROPS-END
374
-
375
- Node-path: directory
376
- Node-kind: dir
377
- Prop-content-length: 10
378
- Content-length: 10
379
-
380
- PROPS-END
381
- EOF
382
- try_dump inaction.dump must_fail
383
-'
384
-
385
-test_expect_success 'action: add node without text' '
386
- reinit_git &&
387
- cat >textless.dump <<-\EOF &&
388
- SVN-fs-dump-format-version: 3
389
-
390
- Revision-number: 1
391
- Prop-content-length: 10
392
- Content-length: 10
393
-
394
- PROPS-END
395
-
396
- Node-path: textless
397
- Node-kind: file
398
- Node-action: add
399
- Prop-content-length: 10
400
- Content-length: 10
401
-
402
- PROPS-END
403
- EOF
404
- try_dump textless.dump must_fail
405
-'
406
-
407
-test_expect_failure 'change file mode but keep old content' '
408
- reinit_git &&
409
- cat >expect <<-\EOF &&
410
- OBJID
411
- :120000 100644 OBJID OBJID T greeting
412
- OBJID
413
- :100644 120000 OBJID OBJID T greeting
414
- OBJID
415
- :000000 100644 OBJID OBJID A greeting
416
- EOF
417
- echo "link hello" >expect.blob &&
418
- echo hello >hello &&
419
- cat >filemode.dump <<-\EOF &&
420
- SVN-fs-dump-format-version: 3
421
-
422
- Revision-number: 1
423
- Prop-content-length: 10
424
- Content-length: 10
425
-
426
- PROPS-END
427
-
428
- Node-path: greeting
429
- Node-kind: file
430
- Node-action: add
431
- Prop-content-length: 10
432
- Text-content-length: 11
433
- Content-length: 21
434
-
435
- PROPS-END
436
- link hello
437
-
438
- Revision-number: 2
439
- Prop-content-length: 10
440
- Content-length: 10
441
-
442
- PROPS-END
443
-
444
- Node-path: greeting
445
- Node-kind: file
446
- Node-action: change
447
- Prop-content-length: 33
448
- Content-length: 33
449
-
450
- K 11
451
- svn:special
452
- V 1
453
- *
454
- PROPS-END
455
-
456
- Revision-number: 3
457
- Prop-content-length: 10
458
- Content-length: 10
459
-
460
- PROPS-END
461
-
462
- Node-path: greeting
463
- Node-kind: file
464
- Node-action: change
465
- Prop-content-length: 10
466
- Content-length: 10
467
-
468
- PROPS-END
469
- EOF
470
- try_dump filemode.dump &&
471
- {
472
- git rev-list HEAD |
473
- git diff-tree --root --stdin |
474
- sed "s/$OID_REGEX/OBJID/g"
475
- } >actual &&
476
- git show HEAD:greeting >actual.blob &&
477
- git show HEAD^:greeting >actual.target &&
478
- test_cmp expect actual &&
479
- test_cmp expect.blob actual.blob &&
480
- test_cmp hello actual.target
481
-'
482
-
483
-test_expect_success 'NUL in property value' '
484
- reinit_git &&
485
- echo "commit message" >expect.message &&
486
- {
487
- properties \
488
- unimportant "something with a NUL (Q)" \
489
- svn:log "commit message" &&
490
- echo PROPS-END
491
- } |
492
- q_to_nul >props &&
493
- {
494
- cat <<-\EOF &&
495
- SVN-fs-dump-format-version: 3
496
-
497
- Revision-number: 1
498
- EOF
499
- echo Prop-content-length: $(wc -c <props) &&
500
- echo Content-length: $(wc -c <props) &&
501
- echo &&
502
- cat props
503
- } >nulprop.dump &&
504
- try_dump nulprop.dump &&
505
- git diff-tree --always -s --format=%s HEAD >actual.message &&
506
- test_cmp expect.message actual.message
507
-'
508
-
509
-test_expect_success 'NUL in log message, file content, and property name' '
510
- # Caveat: svnadmin 1.6.16 (r1073529) truncates at \0 in the
511
- # svn:specialQnotreally example.
512
- reinit_git &&
513
- cat >expect <<-\EOF &&
514
- OBJID
515
- :100644 100644 OBJID OBJID M greeting
516
- OBJID
517
- :000000 100644 OBJID OBJID A greeting
518
- EOF
519
- printf "\n%s\n" "something with an ASCII NUL (Q)" >expect.message &&
520
- printf "%s\n" "helQo" >expect.hello1 &&
521
- printf "%s\n" "link hello" >expect.hello2 &&
522
- {
523
- properties svn:log "something with an ASCII NUL (Q)" &&
524
- echo PROPS-END
525
- } |
526
- q_to_nul >props &&
527
- {
528
- q_to_nul <<-\EOF &&
529
- SVN-fs-dump-format-version: 3
530
-
531
- Revision-number: 1
532
- Prop-content-length: 10
533
- Content-length: 10
534
-
535
- PROPS-END
536
-
537
- Node-path: greeting
538
- Node-kind: file
539
- Node-action: add
540
- Prop-content-length: 10
541
- Text-content-length: 6
542
- Content-length: 16
543
-
544
- PROPS-END
545
- helQo
546
-
547
- Revision-number: 2
548
- EOF
549
- echo Prop-content-length: $(wc -c <props) &&
550
- echo Content-length: $(wc -c <props) &&
551
- echo &&
552
- cat props &&
553
- q_to_nul <<-\EOF
554
-
555
- Node-path: greeting
556
- Node-kind: file
557
- Node-action: change
558
- Prop-content-length: 43
559
- Text-content-length: 11
560
- Content-length: 54
561
-
562
- K 21
563
- svn:specialQnotreally
564
- V 1
565
- *
566
- PROPS-END
567
- link hello
568
- EOF
569
- } >8bitclean.dump &&
570
- try_dump 8bitclean.dump &&
571
- {
572
- git rev-list HEAD |
573
- git diff-tree --root --stdin |
574
- sed "s/$OID_REGEX/OBJID/g"
575
- } >actual &&
576
- {
577
- git cat-file commit HEAD | nul_to_q &&
578
- echo
579
- } |
580
- sed -ne "/^\$/,\$ p" >actual.message &&
581
- git cat-file blob HEAD^:greeting | nul_to_q >actual.hello1 &&
582
- git cat-file blob HEAD:greeting | nul_to_q >actual.hello2 &&
583
- test_cmp expect actual &&
584
- test_cmp expect.message actual.message &&
585
- test_cmp expect.hello1 actual.hello1 &&
586
- test_cmp expect.hello2 actual.hello2
587
-'
588
-
589
-test_expect_success 'change file mode and reiterate content' '
590
- reinit_git &&
591
- cat >expect <<-\EOF &&
592
- OBJID
593
- :120000 100644 OBJID OBJID T greeting
594
- OBJID
595
- :100644 120000 OBJID OBJID T greeting
596
- OBJID
597
- :000000 100644 OBJID OBJID A greeting
598
- EOF
599
- echo "link hello" >expect.blob &&
600
- echo hello >hello &&
601
- cat >filemode2.dump <<-\EOF &&
602
- SVN-fs-dump-format-version: 3
603
-
604
- Revision-number: 1
605
- Prop-content-length: 10
606
- Content-length: 10
607
-
608
- PROPS-END
609
-
610
- Node-path: greeting
611
- Node-kind: file
612
- Node-action: add
613
- Prop-content-length: 10
614
- Text-content-length: 11
615
- Content-length: 21
616
-
617
- PROPS-END
618
- link hello
619
-
620
- Revision-number: 2
621
- Prop-content-length: 10
622
- Content-length: 10
623
-
624
- PROPS-END
625
-
626
- Node-path: greeting
627
- Node-kind: file
628
- Node-action: change
629
- Prop-content-length: 33
630
- Text-content-length: 11
631
- Content-length: 44
632
-
633
- K 11
634
- svn:special
635
- V 1
636
- *
637
- PROPS-END
638
- link hello
639
-
640
- Revision-number: 3
641
- Prop-content-length: 10
642
- Content-length: 10
643
-
644
- PROPS-END
645
-
646
- Node-path: greeting
647
- Node-kind: file
648
- Node-action: change
649
- Prop-content-length: 10
650
- Text-content-length: 11
651
- Content-length: 21
652
-
653
- PROPS-END
654
- link hello
655
- EOF
656
- try_dump filemode2.dump &&
657
- {
658
- git rev-list HEAD |
659
- git diff-tree --root --stdin |
660
- sed "s/$OID_REGEX/OBJID/g"
661
- } >actual &&
662
- git show HEAD:greeting >actual.blob &&
663
- git show HEAD^:greeting >actual.target &&
664
- test_cmp expect actual &&
665
- test_cmp expect.blob actual.blob &&
666
- test_cmp hello actual.target
667
-'
668
-
669
-test_expect_success 'deltas supported' '
670
- reinit_git &&
671
- {
672
- # (old) h + (inline) ello + (old) \n
673
- printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
674
- q_to_nul
675
- } >delta &&
676
- {
677
- properties \
678
- svn:author author@example.com \
679
- svn:date "1999-01-05T00:01:002.000000Z" \
680
- svn:log "add greeting" &&
681
- echo PROPS-END
682
- } >props &&
683
- {
684
- properties \
685
- svn:author author@example.com \
686
- svn:date "1999-01-06T00:01:002.000000Z" \
687
- svn:log "change it" &&
688
- echo PROPS-END
689
- } >props2 &&
690
- {
691
- echo SVN-fs-dump-format-version: 3 &&
692
- echo &&
693
- echo Revision-number: 1 &&
694
- echo Prop-content-length: $(wc -c <props) &&
695
- echo Content-length: $(wc -c <props) &&
696
- echo &&
697
- cat props &&
698
- cat <<-\EOF &&
699
-
700
- Node-path: hello
701
- Node-kind: file
702
- Node-action: add
703
- Prop-content-length: 10
704
- Text-content-length: 3
705
- Content-length: 13
706
-
707
- PROPS-END
708
- hi
709
-
710
- EOF
711
- echo Revision-number: 2 &&
712
- echo Prop-content-length: $(wc -c <props2) &&
713
- echo Content-length: $(wc -c <props2) &&
714
- echo &&
715
- cat props2 &&
716
- cat <<-\EOF &&
717
-
718
- Node-path: hello
719
- Node-kind: file
720
- Node-action: change
721
- Text-delta: true
722
- Prop-content-length: 10
723
- EOF
724
- echo Text-content-length: $(wc -c <delta) &&
725
- echo Content-length: $((10 + $(wc -c <delta))) &&
726
- echo &&
727
- echo PROPS-END &&
728
- cat delta
729
- } >delta.dump &&
730
- try_dump delta.dump
731
-'
732
-
733
-test_expect_success 'property deltas supported' '
734
- reinit_git &&
735
- cat >expect <<-\EOF &&
736
- OBJID
737
- :100755 100644 OBJID OBJID M script.sh
738
- EOF
739
- {
740
- properties \
741
- svn:author author@example.com \
742
- svn:date "1999-03-06T00:01:002.000000Z" \
743
- svn:log "make an executable, or chmod -x it" &&
744
- echo PROPS-END
745
- } >revprops &&
746
- {
747
- echo SVN-fs-dump-format-version: 3 &&
748
- echo &&
749
- echo Revision-number: 1 &&
750
- echo Prop-content-length: $(wc -c <revprops) &&
751
- echo Content-length: $(wc -c <revprops) &&
752
- echo &&
753
- cat revprops &&
754
- echo &&
755
- cat <<-\EOF &&
756
- Node-path: script.sh
757
- Node-kind: file
758
- Node-action: add
759
- Text-content-length: 0
760
- Prop-content-length: 39
761
- Content-length: 39
762
-
763
- K 14
764
- svn:executable
765
- V 4
766
- true
767
- PROPS-END
768
-
769
- EOF
770
- echo Revision-number: 2 &&
771
- echo Prop-content-length: $(wc -c <revprops) &&
772
- echo Content-length: $(wc -c <revprops) &&
773
- echo &&
774
- cat revprops &&
775
- echo &&
776
- cat <<-\EOF
777
- Node-path: script.sh
778
- Node-kind: file
779
- Node-action: change
780
- Prop-delta: true
781
- Prop-content-length: 30
782
- Content-length: 30
783
-
784
- D 14
785
- svn:executable
786
- PROPS-END
787
- EOF
788
- } >propdelta.dump &&
789
- try_dump propdelta.dump &&
790
- {
791
- git rev-list HEAD |
792
- git diff-tree --stdin |
793
- sed "s/$OID_REGEX/OBJID/g"
794
- } >actual &&
795
- test_cmp expect actual
796
-'
797
-
798
-test_expect_success 'properties on /' '
799
- reinit_git &&
800
- cat <<-\EOF >expect &&
801
- OBJID
802
- OBJID
803
- :000000 100644 OBJID OBJID A greeting
804
- EOF
805
- sed -e "s/X$//" <<-\EOF >changeroot.dump &&
806
- SVN-fs-dump-format-version: 3
807
-
808
- Revision-number: 1
809
- Prop-content-length: 10
810
- Content-length: 10
811
-
812
- PROPS-END
813
-
814
- Node-path: greeting
815
- Node-kind: file
816
- Node-action: add
817
- Text-content-length: 0
818
- Prop-content-length: 10
819
- Content-length: 10
820
-
821
- PROPS-END
822
-
823
- Revision-number: 2
824
- Prop-content-length: 10
825
- Content-length: 10
826
-
827
- PROPS-END
828
-
829
- Node-path: X
830
- Node-kind: dir
831
- Node-action: change
832
- Prop-delta: true
833
- Prop-content-length: 43
834
- Content-length: 43
835
-
836
- K 10
837
- svn:ignore
838
- V 11
839
- build-area
840
-
841
- PROPS-END
842
- EOF
843
- try_dump changeroot.dump &&
844
- {
845
- git rev-list HEAD |
846
- git diff-tree --root --always --stdin |
847
- sed "s/$OID_REGEX/OBJID/g"
848
- } >actual &&
849
- test_cmp expect actual
850
-'
851
-
852
-test_expect_success 'deltas for typechange' '
853
- reinit_git &&
854
- cat >expect <<-\EOF &&
855
- OBJID
856
- :120000 100644 OBJID OBJID T test-file
857
- OBJID
858
- :100755 120000 OBJID OBJID T test-file
859
- OBJID
860
- :000000 100755 OBJID OBJID A test-file
861
- EOF
862
- cat >deleteprop.dump <<-\EOF &&
863
- SVN-fs-dump-format-version: 3
864
-
865
- Revision-number: 1
866
- Prop-content-length: 10
867
- Content-length: 10
868
-
869
- PROPS-END
870
-
871
- Node-path: test-file
872
- Node-kind: file
873
- Node-action: add
874
- Prop-delta: true
875
- Prop-content-length: 35
876
- Text-content-length: 17
877
- Content-length: 52
878
-
879
- K 14
880
- svn:executable
881
- V 0
882
-
883
- PROPS-END
884
- link testing 123
885
-
886
- Revision-number: 2
887
- Prop-content-length: 10
888
- Content-length: 10
889
-
890
- PROPS-END
891
-
892
- Node-path: test-file
893
- Node-kind: file
894
- Node-action: change
895
- Prop-delta: true
896
- Prop-content-length: 53
897
- Text-content-length: 17
898
- Content-length: 70
899
-
900
- K 11
901
- svn:special
902
- V 1
903
- *
904
- D 14
905
- svn:executable
906
- PROPS-END
907
- link testing 231
908
-
909
- Revision-number: 3
910
- Prop-content-length: 10
911
- Content-length: 10
912
-
913
- PROPS-END
914
-
915
- Node-path: test-file
916
- Node-kind: file
917
- Node-action: change
918
- Prop-delta: true
919
- Prop-content-length: 27
920
- Text-content-length: 17
921
- Content-length: 44
922
-
923
- D 11
924
- svn:special
925
- PROPS-END
926
- link testing 321
927
- EOF
928
- try_dump deleteprop.dump &&
929
- {
930
- git rev-list HEAD |
931
- git diff-tree --root --stdin |
932
- sed "s/$OID_REGEX/OBJID/g"
933
- } >actual &&
934
- test_cmp expect actual
935
-'
936
-
937
-test_expect_success 'deltas need not consume the whole preimage' '
938
- reinit_git &&
939
- cat >expect <<-\EOF &&
940
- OBJID
941
- :120000 100644 OBJID OBJID T postimage
942
- OBJID
943
- :100644 120000 OBJID OBJID T postimage
944
- OBJID
945
- :000000 100644 OBJID OBJID A postimage
946
- EOF
947
- echo "first preimage" >expect.1 &&
948
- printf target >expect.2 &&
949
- printf lnk >expect.3 &&
950
- {
951
- printf "SVNQ%b%b%b" "QQ\017\001\017" "\0217" "first preimage\n" |
952
- q_to_nul
953
- } >delta.1 &&
954
- {
955
- properties svn:special "*" &&
956
- echo PROPS-END
957
- } >symlink.props &&
958
- {
959
- printf "SVNQ%b%b%b" "Q\002\013\004\012" "\0201\001\001\0211" "lnk target" |
960
- q_to_nul
961
- } >delta.2 &&
962
- {
963
- printf "SVNQ%b%b" "Q\004\003\004Q" "\001Q\002\002" |
964
- q_to_nul
965
- } >delta.3 &&
966
- {
967
- cat <<-\EOF &&
968
- SVN-fs-dump-format-version: 3
969
-
970
- Revision-number: 1
971
- Prop-content-length: 10
972
- Content-length: 10
973
-
974
- PROPS-END
975
-
976
- Node-path: postimage
977
- Node-kind: file
978
- Node-action: add
979
- Text-delta: true
980
- Prop-content-length: 10
981
- EOF
982
- echo Text-content-length: $(wc -c <delta.1) &&
983
- echo Content-length: $((10 + $(wc -c <delta.1))) &&
984
- echo &&
985
- echo PROPS-END &&
986
- cat delta.1 &&
987
- cat <<-\EOF &&
988
-
989
- Revision-number: 2
990
- Prop-content-length: 10
991
- Content-length: 10
992
-
993
- PROPS-END
994
-
995
- Node-path: postimage
996
- Node-kind: file
997
- Node-action: change
998
- Text-delta: true
999
- EOF
1000
- echo Prop-content-length: $(wc -c <symlink.props) &&
1001
- echo Text-content-length: $(wc -c <delta.2) &&
1002
- echo Content-length: $(($(wc -c <symlink.props) + $(wc -c <delta.2))) &&
1003
- echo &&
1004
- cat symlink.props &&
1005
- cat delta.2 &&
1006
- cat <<-\EOF &&
1007
-
1008
- Revision-number: 3
1009
- Prop-content-length: 10
1010
- Content-length: 10
1011
-
1012
- PROPS-END
1013
-
1014
- Node-path: postimage
1015
- Node-kind: file
1016
- Node-action: change
1017
- Text-delta: true
1018
- Prop-content-length: 10
1019
- EOF
1020
- echo Text-content-length: $(wc -c <delta.3) &&
1021
- echo Content-length: $((10 + $(wc -c <delta.3))) &&
1022
- echo &&
1023
- echo PROPS-END &&
1024
- cat delta.3 &&
1025
- echo
1026
- } >deltapartial.dump &&
1027
- try_dump deltapartial.dump &&
1028
- {
1029
- git rev-list HEAD |
1030
- git diff-tree --root --stdin |
1031
- sed "s/$OID_REGEX/OBJID/g"
1032
- } >actual &&
1033
- test_cmp expect actual &&
1034
- git show HEAD:postimage >actual.3 &&
1035
- git show HEAD^:postimage >actual.2 &&
1036
- git show HEAD^^:postimage >actual.1 &&
1037
- test_cmp expect.1 actual.1 &&
1038
- test_cmp expect.2 actual.2 &&
1039
- test_cmp expect.3 actual.3
1040
-'
1041
-
1042
-test_expect_success 'no hang for delta trying to read past end of preimage' '
1043
- reinit_git &&
1044
- {
1045
- # COPY 1
1046
- printf "SVNQ%b%b" "Q\001\001\002Q" "\001Q" |
1047
- q_to_nul
1048
- } >greedy.delta &&
1049
- {
1050
- cat <<-\EOF &&
1051
- SVN-fs-dump-format-version: 3
1052
-
1053
- Revision-number: 1
1054
- Prop-content-length: 10
1055
- Content-length: 10
1056
-
1057
- PROPS-END
1058
-
1059
- Node-path: bootstrap
1060
- Node-kind: file
1061
- Node-action: add
1062
- Text-delta: true
1063
- Prop-content-length: 10
1064
- EOF
1065
- echo Text-content-length: $(wc -c <greedy.delta) &&
1066
- echo Content-length: $((10 + $(wc -c <greedy.delta))) &&
1067
- echo &&
1068
- echo PROPS-END &&
1069
- cat greedy.delta &&
1070
- echo
1071
- } >greedydelta.dump &&
1072
- try_dump greedydelta.dump must_fail might_fail
1073
-'
1074
-
1075
-test_expect_success 'set up svn repo' '
1076
- svnconf=$PWD/svnconf &&
1077
- mkdir -p "$svnconf" &&
1078
-
1079
- if
1080
- svnadmin -h >/dev/null 2>&1 &&
1081
- svnadmin create simple-svn &&
1082
- svnadmin load simple-svn <"$TEST_DIRECTORY/t9135/svn.dump" &&
1083
- svn export --config-dir "$svnconf" "file://$PWD/simple-svn" simple-svnco
1084
- then
1085
- test_set_prereq SVNREPO
1086
- fi
1087
-'
1088
-
1089
-test_expect_success SVNREPO 't9135/svn.dump' '
1090
- mkdir -p simple-git &&
1091
- (
1092
- cd simple-git &&
1093
- reinit_git &&
1094
- try_dump "$TEST_DIRECTORY/t9135/svn.dump"
1095
- ) &&
1096
- (
1097
- cd simple-svnco &&
1098
- git init &&
1099
- git add . &&
1100
- git fetch ../simple-git master &&
1101
- git diff --exit-code FETCH_HEAD
1102
- )
1103
-'
1104
-
1105
-test_done