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
'change file mode and reiterate content' '
402 cat >expect <<-\EOF &&
404 :120000 100644 OBJID OBJID T greeting
406 :100644 120000 OBJID OBJID T greeting
408 :000000 100644 OBJID OBJID A greeting
410 echo "link hello" >expect.blob &&
412 cat >filemode.dump <<-\EOF &&
413 SVN-fs-dump-format-version: 3
416 Prop-content-length: 10
424 Prop-content-length: 10
425 Text-content-length: 11
432 Prop-content-length: 10
440 Prop-content-length: 33
441 Text-content-length: 11
452 Prop-content-length: 10
460 Prop-content-length: 10
461 Text-content-length: 11
467 test-svn-fe filemode.dump >stream &&
468 git fast-import <stream &&
471 git diff-tree --root --stdin |
472 sed "s/$_x40/OBJID/g"
474 git show HEAD:greeting >actual.blob &&
475 git show HEAD^:greeting >actual.target &&
476 test_cmp expect actual &&
477 test_cmp expect.blob actual.blob &&
478 test_cmp hello actual.target
481 test_expect_success
'deltas not supported' '
483 # (old) h + (inline) ello + (old) \n
484 printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
489 svn:author author@example.com \
490 svn:date "1999-01-05T00:01:002.000000Z" \
491 svn:log "add greeting" &&
496 svn:author author@example.com \
497 svn:date "1999-01-06T00:01:002.000000Z" \
498 svn:log "change it" &&
502 echo SVN-fs-dump-format-version: 3 &&
504 echo Revision-number: 1 &&
505 echo Prop-content-length: $(wc -c <props) &&
506 echo Content-length: $(wc -c <props) &&
514 Prop-content-length: 10
515 Text-content-length: 3
522 echo Revision-number: 2 &&
523 echo Prop-content-length: $(wc -c <props2) &&
524 echo Content-length: $(wc -c <props2) &&
533 Prop-content-length: 10
535 echo Text-content-length: $(wc -c <delta) &&
536 echo Content-length: $((10 + $(wc -c <delta))) &&
541 test_must_fail test-svn-fe delta.dump
544 test_expect_success
'property deltas supported' '
546 cat >expect <<-\EOF &&
548 :100755 100644 OBJID OBJID M script.sh
552 svn:author author@example.com \
553 svn:date "1999-03-06T00:01:002.000000Z" \
554 svn:log "make an executable, or chmod -x it" &&
558 echo SVN-fs-dump-format-version: 3 &&
560 echo Revision-number: 1 &&
561 echo Prop-content-length: $(wc -c <revprops) &&
562 echo Content-length: $(wc -c <revprops) &&
570 Text-content-length: 0
571 Prop-content-length: 39
581 echo Revision-number: 2 &&
582 echo Prop-content-length: $(wc -c <revprops) &&
583 echo Content-length: $(wc -c <revprops) &&
592 Prop-content-length: 30
600 test-svn-fe propdelta.dump >stream &&
601 git fast-import <stream &&
604 git diff-tree --stdin |
605 sed "s/$_x40/OBJID/g"
607 test_cmp expect actual
610 test_expect_success
'properties on /' '
612 cat <<-\EOF >expect &&
615 :000000 100644 OBJID OBJID A greeting
617 sed -e "s/X$//" <<-\EOF >changeroot.dump &&
618 SVN-fs-dump-format-version: 3
621 Prop-content-length: 10
629 Text-content-length: 0
630 Prop-content-length: 10
636 Prop-content-length: 10
645 Prop-content-length: 43
655 test-svn-fe changeroot.dump >stream &&
656 git fast-import <stream &&
659 git diff-tree --root --always --stdin |
660 sed "s/$_x40/OBJID/g"
662 test_cmp expect actual
665 test_expect_success
'deltas for typechange' '
667 cat >expect <<-\EOF &&
669 :120000 100644 OBJID OBJID T test-file
671 :100755 120000 OBJID OBJID T test-file
673 :000000 100755 OBJID OBJID A test-file
675 cat >deleteprop.dump <<-\EOF &&
676 SVN-fs-dump-format-version: 3
679 Prop-content-length: 10
688 Prop-content-length: 35
689 Text-content-length: 17
700 Prop-content-length: 10
709 Prop-content-length: 53
710 Text-content-length: 17
723 Prop-content-length: 10
732 Prop-content-length: 27
733 Text-content-length: 17
741 test-svn-fe deleteprop.dump >stream &&
742 git fast-import <stream &&
745 git diff-tree --root --stdin |
746 sed "s/$_x40/OBJID/g"
748 test_cmp expect actual
752 test_expect_success
'set up svn repo' '
753 svnconf=$PWD/svnconf &&
754 mkdir -p "$svnconf" &&
757 svnadmin -h >/dev/null 2>&1 &&
758 svnadmin create simple-svn &&
759 svnadmin load simple-svn <"$TEST_DIRECTORY/t9135/svn.dump" &&
760 svn export --config-dir "$svnconf" "file://$PWD/simple-svn" simple-svnco
762 test_set_prereq SVNREPO
766 test_expect_success SVNREPO
't9135/svn.dump' '
767 git init simple-git &&
768 test-svn-fe "$TEST_DIRECTORY/t9135/svn.dump" >simple.fe &&
771 git fast-import <../simple.fe
777 git fetch ../simple-git master &&
778 git diff --exit-code FETCH_HEAD