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
'change file mode and reiterate content' '
375 cat >expect <<-\EOF &&
377 :120000 100644 OBJID OBJID T greeting
379 :100644 120000 OBJID OBJID T greeting
381 :000000 100644 OBJID OBJID A greeting
383 echo "link hello" >expect.blob &&
385 cat >filemode.dump <<-\EOF &&
386 SVN-fs-dump-format-version: 3
389 Prop-content-length: 10
397 Prop-content-length: 10
398 Text-content-length: 11
405 Prop-content-length: 10
413 Prop-content-length: 33
414 Text-content-length: 11
425 Prop-content-length: 10
433 Prop-content-length: 10
434 Text-content-length: 11
440 test-svn-fe filemode.dump >stream &&
441 git fast-import <stream &&
444 git diff-tree --root --stdin |
445 sed "s/$_x40/OBJID/g"
447 git show HEAD:greeting >actual.blob &&
448 git show HEAD^:greeting >actual.target &&
449 test_cmp expect actual &&
450 test_cmp expect.blob actual.blob &&
451 test_cmp hello actual.target
454 test_expect_success
'deltas not supported' '
456 # (old) h + (inline) ello + (old) \n
457 printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
462 svn:author author@example.com \
463 svn:date "1999-01-05T00:01:002.000000Z" \
464 svn:log "add greeting" &&
469 svn:author author@example.com \
470 svn:date "1999-01-06T00:01:002.000000Z" \
471 svn:log "change it" &&
475 echo SVN-fs-dump-format-version: 3 &&
477 echo Revision-number: 1 &&
478 echo Prop-content-length: $(wc -c <props) &&
479 echo Content-length: $(wc -c <props) &&
487 Prop-content-length: 10
488 Text-content-length: 3
495 echo Revision-number: 2 &&
496 echo Prop-content-length: $(wc -c <props2) &&
497 echo Content-length: $(wc -c <props2) &&
506 Prop-content-length: 10
508 echo Text-content-length: $(wc -c <delta) &&
509 echo Content-length: $((10 + $(wc -c <delta))) &&
514 test_must_fail test-svn-fe delta.dump
517 test_expect_success
'property deltas supported' '
519 cat >expect <<-\EOF &&
521 :100755 100644 OBJID OBJID M script.sh
525 svn:author author@example.com \
526 svn:date "1999-03-06T00:01:002.000000Z" \
527 svn:log "make an executable, or chmod -x it" &&
531 echo SVN-fs-dump-format-version: 3 &&
533 echo Revision-number: 1 &&
534 echo Prop-content-length: $(wc -c <revprops) &&
535 echo Content-length: $(wc -c <revprops) &&
543 Text-content-length: 0
544 Prop-content-length: 39
554 echo Revision-number: 2 &&
555 echo Prop-content-length: $(wc -c <revprops) &&
556 echo Content-length: $(wc -c <revprops) &&
565 Prop-content-length: 30
573 test-svn-fe propdelta.dump >stream &&
574 git fast-import <stream &&
577 git diff-tree --stdin |
578 sed "s/$_x40/OBJID/g"
580 test_cmp expect actual
583 test_expect_success
'properties on /' '
585 cat <<-\EOF >expect &&
588 :000000 100644 OBJID OBJID A greeting
590 sed -e "s/X$//" <<-\EOF >changeroot.dump &&
591 SVN-fs-dump-format-version: 3
594 Prop-content-length: 10
602 Text-content-length: 0
603 Prop-content-length: 10
609 Prop-content-length: 10
618 Prop-content-length: 43
628 test-svn-fe changeroot.dump >stream &&
629 git fast-import <stream &&
632 git diff-tree --root --always --stdin |
633 sed "s/$_x40/OBJID/g"
635 test_cmp expect actual
638 test_expect_success
'deltas for typechange' '
640 cat >expect <<-\EOF &&
642 :120000 100644 OBJID OBJID T test-file
644 :100755 120000 OBJID OBJID T test-file
646 :000000 100755 OBJID OBJID A test-file
648 cat >deleteprop.dump <<-\EOF &&
649 SVN-fs-dump-format-version: 3
652 Prop-content-length: 10
661 Prop-content-length: 35
662 Text-content-length: 17
673 Prop-content-length: 10
682 Prop-content-length: 53
683 Text-content-length: 17
696 Prop-content-length: 10
705 Prop-content-length: 27
706 Text-content-length: 17
714 test-svn-fe deleteprop.dump >stream &&
715 git fast-import <stream &&
718 git diff-tree --root --stdin |
719 sed "s/$_x40/OBJID/g"
721 test_cmp expect actual
725 test_expect_success
'set up svn repo' '
726 svnconf=$PWD/svnconf &&
727 mkdir -p "$svnconf" &&
730 svnadmin -h >/dev/null 2>&1 &&
731 svnadmin create simple-svn &&
732 svnadmin load simple-svn <"$TEST_DIRECTORY/t9135/svn.dump" &&
733 svn export --config-dir "$svnconf" "file://$PWD/simple-svn" simple-svnco
735 test_set_prereq SVNREPO
739 test_expect_success SVNREPO
't9135/svn.dump' '
740 git init simple-git &&
741 test-svn-fe "$TEST_DIRECTORY/t9135/svn.dump" >simple.fe &&
744 git fast-import <../simple.fe
750 git fetch ../simple-git master &&
751 git diff --exit-code FETCH_HEAD