3 test_description='check svn dumpfile importer'
17 printf "%s\n" "K ${#property}" &&
18 printf "%s\n" "$property" &&
19 printf "%s\n" "V ${#value}" &&
20 printf "%s\n" "$value" &&
29 printf "%s\n" "Prop-content-length: 10" &&
30 printf "%s\n" "Text-content-length: ${#text}" &&
31 printf "%s\n" "Content-length: $((${#text} + 10))" &&
32 printf "%s\n" "" "PROPS-END" &&
38 test_expect_success 'empty dump' '
40 echo "SVN-fs-dump-format-version: 2" >input &&
41 test-svn-fe input >stream &&
42 git fast-import <stream
45 test_expect_success 'v4 dumps not supported' '
47 echo "SVN-fs-dump-format-version: 4" >v4.dump &&
48 test_must_fail test-svn-fe v4.dump >stream &&
52 test_expect_failure 'empty revision' '
54 printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
55 cat >emptyrev.dump <<-\EOF &&
56 SVN-fs-dump-format-version: 3
59 Prop-content-length: 0
63 Prop-content-length: 0
67 test-svn-fe emptyrev.dump >stream &&
68 git fast-import <stream &&
69 git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
70 test_cmp expect actual
73 test_expect_success 'empty properties' '
75 printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
76 cat >emptyprop.dump <<-\EOF &&
77 SVN-fs-dump-format-version: 3
80 Prop-content-length: 10
86 Prop-content-length: 10
91 test-svn-fe emptyprop.dump >stream &&
92 git fast-import <stream &&
93 git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
94 test_cmp expect actual
97 test_expect_success 'author name and commit message' '
99 echo "<author@example.com, author@example.com@local>" >expect.author &&
100 cat >message <<-\EOF &&
101 A concise summary of the change
103 A detailed description of the change, why it is needed, what
104 was broken and why applying this is the best course of action.
107 Details pertaining to an individual file.
111 svn:author author@example.com \
112 svn:log "$(cat message)" &&
116 echo "SVN-fs-dump-format-version: 3" &&
118 echo "Revision-number: 1" &&
119 echo Prop-content-length: $(wc -c <props) &&
120 echo Content-length: $(wc -c <props) &&
124 test-svn-fe log.dump >stream &&
125 git fast-import <stream &&
126 git log -p --format="%B" HEAD >actual.log &&
127 git log --format="<%an, %ae>" >actual.author &&
128 test_cmp message actual.log &&
129 test_cmp expect.author actual.author
132 test_expect_success 'unsupported properties are ignored' '
134 echo author >expect &&
135 cat >extraprop.dump <<-\EOF &&
136 SVN-fs-dump-format-version: 3
139 Prop-content-length: 56
152 test-svn-fe extraprop.dump >stream &&
153 git fast-import <stream &&
154 git log -p --format=%an HEAD >actual &&
155 test_cmp expect actual
158 test_expect_failure 'timestamp and empty file' '
159 echo author@example.com >expect.author &&
160 echo 1999-01-01 >expect.date &&
161 echo file >expect.files &&
165 svn:author author@example.com \
166 svn:date "1999-01-01T00:01:002.000000Z" \
167 svn:log "add empty file" &&
172 SVN-fs-dump-format-version: 3
176 echo Prop-content-length: $(wc -c <props) &&
177 echo Content-length: $(wc -c <props) &&
182 Node-path: empty-file
189 test-svn-fe emptyfile.dump >stream &&
190 git fast-import <stream &&
191 git log --format=%an HEAD >actual.author &&
192 git log --date=short --format=%ad HEAD >actual.date &&
193 git ls-tree -r --name-only HEAD >actual.files &&
194 test_cmp expect.author actual.author &&
195 test_cmp expect.date actual.date &&
196 test_cmp expect.files actual.files &&
197 git checkout HEAD empty-file &&
201 test_expect_success 'directory with files' '
203 printf "%s\n" directory/file1 directory/file2 >expect.files &&
208 svn:author author@example.com \
209 svn:date "1999-02-01T00:01:002.000000Z" \
210 svn:log "add directory with some files in it" &&
215 SVN-fs-dump-format-version: 3
219 echo Prop-content-length: $(wc -c <props) &&
220 echo Content-length: $(wc -c <props) &&
228 Prop-content-length: 10
233 Node-path: directory/file1
237 text_no_props hello &&
239 Node-path: directory/file2
245 test-svn-fe directory.dump >stream &&
246 git fast-import <stream &&
248 git ls-tree -r --name-only HEAD >actual.files &&
249 git checkout HEAD directory &&
250 test_cmp expect.files actual.files &&
251 test_cmp hello directory/file1 &&
252 test_cmp hi directory/file2
255 test_expect_success 'node without action' '
256 cat >inaction.dump <<-\EOF &&
257 SVN-fs-dump-format-version: 3
260 Prop-content-length: 10
267 Prop-content-length: 10
272 test_must_fail test-svn-fe inaction.dump
275 test_expect_success 'action: add node without text' '
276 cat >textless.dump <<-\EOF &&
277 SVN-fs-dump-format-version: 3
280 Prop-content-length: 10
288 Prop-content-length: 10
293 test_must_fail test-svn-fe textless.dump
296 test_expect_failure 'change file mode but keep old content' '
298 cat >expect <<-\EOF &&
300 :120000 100644 OBJID OBJID T greeting
302 :100644 120000 OBJID OBJID T greeting
304 :000000 100644 OBJID OBJID A greeting
306 echo "link hello" >expect.blob &&
308 cat >filemode.dump <<-\EOF &&
309 SVN-fs-dump-format-version: 3
312 Prop-content-length: 10
320 Prop-content-length: 10
321 Text-content-length: 11
328 Prop-content-length: 10
336 Prop-content-length: 33
346 Prop-content-length: 10
354 Prop-content-length: 10
359 test-svn-fe filemode.dump >stream &&
360 git fast-import <stream &&
363 git diff-tree --root --stdin |
364 sed "s/$_x40/OBJID/g"
366 git show HEAD:greeting >actual.blob &&
367 git show HEAD^:greeting >actual.target &&
368 test_cmp expect actual &&
369 test_cmp expect.blob actual.blob &&
370 test_cmp hello actual.target
373 test_expect_success 'NUL in property value' '
375 echo "commit message" >expect.message &&
378 unimportant "something with a NUL (Q)" \
379 svn:log "commit message"&&
385 SVN-fs-dump-format-version: 3
389 echo Prop-content-length: $(wc -c <props) &&
390 echo Content-length: $(wc -c <props) &&
394 test-svn-fe nulprop.dump >stream &&
395 git fast-import <stream &&
396 git diff-tree --always -s --format=%s HEAD >actual.message &&
397 test_cmp expect.message actual.message
400 test_expect_success 'NUL in log message, file content, and property name' '
401 # Caveat: svnadmin 1.6.16 (r1073529) truncates at \0 in the
402 # svn:specialQnotreally example.
404 cat >expect <<-\EOF &&
406 :100644 100644 OBJID OBJID M greeting
408 :000000 100644 OBJID OBJID A greeting
410 printf "\n%s\n" "something with an ASCII NUL (Q)" >expect.message &&
411 printf "%s\n" "helQo" >expect.hello1 &&
412 printf "%s\n" "link hello" >expect.hello2 &&
414 properties svn:log "something with an ASCII NUL (Q)" &&
420 SVN-fs-dump-format-version: 3
423 Prop-content-length: 10
431 Prop-content-length: 10
432 Text-content-length: 6
440 echo Prop-content-length: $(wc -c <props) &&
441 echo Content-length: $(wc -c <props) &&
449 Prop-content-length: 43
450 Text-content-length: 11
454 svn:specialQnotreally
461 test-svn-fe 8bitclean.dump >stream &&
462 git fast-import <stream &&
465 git diff-tree --root --stdin |
466 sed "s/$_x40/OBJID/g"
469 git cat-file commit HEAD | nul_to_q &&
472 sed -ne "/^\$/,\$ p" >actual.message &&
473 git cat-file blob HEAD^:greeting | nul_to_q >actual.hello1 &&
474 git cat-file blob HEAD:greeting | nul_to_q >actual.hello2 &&
475 test_cmp expect actual &&
476 test_cmp expect.message actual.message &&
477 test_cmp expect.hello1 actual.hello1 &&
478 test_cmp expect.hello2 actual.hello2
481 test_expect_success 'change file mode and reiterate content' '
483 cat >expect <<-\EOF &&
485 :120000 100644 OBJID OBJID T greeting
487 :100644 120000 OBJID OBJID T greeting
489 :000000 100644 OBJID OBJID A greeting
491 echo "link hello" >expect.blob &&
493 cat >filemode.dump <<-\EOF &&
494 SVN-fs-dump-format-version: 3
497 Prop-content-length: 10
505 Prop-content-length: 10
506 Text-content-length: 11
513 Prop-content-length: 10
521 Prop-content-length: 33
522 Text-content-length: 11
533 Prop-content-length: 10
541 Prop-content-length: 10
542 Text-content-length: 11
548 test-svn-fe filemode.dump >stream &&
549 git fast-import <stream &&
552 git diff-tree --root --stdin |
553 sed "s/$_x40/OBJID/g"
555 git show HEAD:greeting >actual.blob &&
556 git show HEAD^:greeting >actual.target &&
557 test_cmp expect actual &&
558 test_cmp expect.blob actual.blob &&
559 test_cmp hello actual.target
562 test_expect_success 'deltas not supported' '
564 # (old) h + (inline) ello + (old) \n
565 printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
570 svn:author author@example.com \
571 svn:date "1999-01-05T00:01:002.000000Z" \
572 svn:log "add greeting" &&
577 svn:author author@example.com \
578 svn:date "1999-01-06T00:01:002.000000Z" \
579 svn:log "change it" &&
583 echo SVN-fs-dump-format-version: 3 &&
585 echo Revision-number: 1 &&
586 echo Prop-content-length: $(wc -c <props) &&
587 echo Content-length: $(wc -c <props) &&
595 Prop-content-length: 10
596 Text-content-length: 3
603 echo Revision-number: 2 &&
604 echo Prop-content-length: $(wc -c <props2) &&
605 echo Content-length: $(wc -c <props2) &&
614 Prop-content-length: 10
616 echo Text-content-length: $(wc -c <delta) &&
617 echo Content-length: $((10 + $(wc -c <delta))) &&
622 test_must_fail test-svn-fe delta.dump
625 test_expect_success 'property deltas supported' '
627 cat >expect <<-\EOF &&
629 :100755 100644 OBJID OBJID M script.sh
633 svn:author author@example.com \
634 svn:date "1999-03-06T00:01:002.000000Z" \
635 svn:log "make an executable, or chmod -x it" &&
639 echo SVN-fs-dump-format-version: 3 &&
641 echo Revision-number: 1 &&
642 echo Prop-content-length: $(wc -c <revprops) &&
643 echo Content-length: $(wc -c <revprops) &&
651 Text-content-length: 0
652 Prop-content-length: 39
662 echo Revision-number: 2 &&
663 echo Prop-content-length: $(wc -c <revprops) &&
664 echo Content-length: $(wc -c <revprops) &&
673 Prop-content-length: 30
681 test-svn-fe propdelta.dump >stream &&
682 git fast-import <stream &&
685 git diff-tree --stdin |
686 sed "s/$_x40/OBJID/g"
688 test_cmp expect actual
691 test_expect_success 'properties on /' '
693 cat <<-\EOF >expect &&
696 :000000 100644 OBJID OBJID A greeting
698 sed -e "s/X$//" <<-\EOF >changeroot.dump &&
699 SVN-fs-dump-format-version: 3
702 Prop-content-length: 10
710 Text-content-length: 0
711 Prop-content-length: 10
717 Prop-content-length: 10
726 Prop-content-length: 43
736 test-svn-fe changeroot.dump >stream &&
737 git fast-import <stream &&
740 git diff-tree --root --always --stdin |
741 sed "s/$_x40/OBJID/g"
743 test_cmp expect actual
746 test_expect_success 'deltas for typechange' '
748 cat >expect <<-\EOF &&
750 :120000 100644 OBJID OBJID T test-file
752 :100755 120000 OBJID OBJID T test-file
754 :000000 100755 OBJID OBJID A test-file
756 cat >deleteprop.dump <<-\EOF &&
757 SVN-fs-dump-format-version: 3
760 Prop-content-length: 10
769 Prop-content-length: 35
770 Text-content-length: 17
781 Prop-content-length: 10
790 Prop-content-length: 53
791 Text-content-length: 17
804 Prop-content-length: 10
813 Prop-content-length: 27
814 Text-content-length: 17
822 test-svn-fe deleteprop.dump >stream &&
823 git fast-import <stream &&
826 git diff-tree --root --stdin |
827 sed "s/$_x40/OBJID/g"
829 test_cmp expect actual
833 test_expect_success 'set up svn repo' '
834 svnconf=$PWD/svnconf &&
835 mkdir -p "$svnconf" &&
838 svnadmin -h >/dev/null 2>&1 &&
839 svnadmin create simple-svn &&
840 svnadmin load simple-svn <"$TEST_DIRECTORY/t9135/svn.dump" &&
841 svn export --config-dir "$svnconf" "file://$PWD/simple-svn" simple-svnco
843 test_set_prereq SVNREPO
847 test_expect_success SVNREPO 't9135/svn.dump' '
848 git init simple-git &&
849 test-svn-fe "$TEST_DIRECTORY/t9135/svn.dump" >simple.fe &&
852 git fast-import <../simple.fe
858 git fetch ../simple-git master &&
859 git diff --exit-code FETCH_HEAD