3 test_description
='check svn dumpfile importer'
8 if ! test_declared_prereq PIPE
10 echo >&4 "reinit_git: need to declare PIPE prerequisite"
14 rm -f stream backflow
&&
16 mkfifo stream backflow
21 maybe_fail
=${2:+test_$2} &&
24 $maybe_fail test-svn-fe
"$input" >stream
3<backflow
&
26 git fast-import
--cat-blob-fd=3 <stream
3>backflow
&&
35 printf "%s\n" "K ${#property}" &&
36 printf "%s\n" "$property" &&
37 printf "%s\n" "V ${#value}" &&
38 printf "%s\n" "$value" &&
47 printf "%s\n" "Prop-content-length: 10" &&
48 printf "%s\n" "Text-content-length: ${#text}" &&
49 printf "%s\n" "Content-length: $((${#text} + 10))" &&
50 printf "%s\n" "" "PROPS-END" &&
56 test_expect_success
'setup: have pipes?' '
64 test_expect_success PIPE
'empty dump' '
66 echo "SVN-fs-dump-format-version: 2" >input &&
70 test_expect_success PIPE
'v4 dumps not supported' '
72 echo "SVN-fs-dump-format-version: 4" >v4.dump &&
73 try_dump v4.dump must_fail
76 test_expect_failure PIPE
'empty revision' '
78 printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
79 cat >emptyrev.dump <<-\EOF &&
80 SVN-fs-dump-format-version: 3
83 Prop-content-length: 0
87 Prop-content-length: 0
91 try_dump emptyrev.dump &&
92 git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
93 test_cmp expect actual
96 test_expect_success PIPE
'empty properties' '
98 printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
99 cat >emptyprop.dump <<-\EOF &&
100 SVN-fs-dump-format-version: 3
103 Prop-content-length: 10
109 Prop-content-length: 10
114 try_dump emptyprop.dump &&
115 git log -p --format="rev <%an, %ae>: %s" HEAD >actual &&
116 test_cmp expect actual
119 test_expect_success PIPE
'author name and commit message' '
121 echo "<author@example.com, author@example.com@local>" >expect.author &&
122 cat >message <<-\EOF &&
123 A concise summary of the change
125 A detailed description of the change, why it is needed, what
126 was broken and why applying this is the best course of action.
129 Details pertaining to an individual file.
133 svn:author author@example.com \
134 svn:log "$(cat message)" &&
138 echo "SVN-fs-dump-format-version: 3" &&
140 echo "Revision-number: 1" &&
141 echo Prop-content-length: $(wc -c <props) &&
142 echo Content-length: $(wc -c <props) &&
147 git log -p --format="%B" HEAD >actual.log &&
148 git log --format="<%an, %ae>" >actual.author &&
149 test_cmp message actual.log &&
150 test_cmp expect.author actual.author
153 test_expect_success PIPE
'unsupported properties are ignored' '
155 echo author >expect &&
156 cat >extraprop.dump <<-\EOF &&
157 SVN-fs-dump-format-version: 3
160 Prop-content-length: 56
173 try_dump extraprop.dump &&
174 git log -p --format=%an HEAD >actual &&
175 test_cmp expect actual
178 test_expect_failure PIPE
'timestamp and empty file' '
179 echo author@example.com >expect.author &&
180 echo 1999-01-01 >expect.date &&
181 echo file >expect.files &&
185 svn:author author@example.com \
186 svn:date "1999-01-01T00:01:002.000000Z" \
187 svn:log "add empty file" &&
192 SVN-fs-dump-format-version: 3
196 echo Prop-content-length: $(wc -c <props) &&
197 echo Content-length: $(wc -c <props) &&
202 Node-path: empty-file
209 try_dump emptyfile.dump &&
210 git log --format=%an HEAD >actual.author &&
211 git log --date=short --format=%ad HEAD >actual.date &&
212 git ls-tree -r --name-only HEAD >actual.files &&
213 test_cmp expect.author actual.author &&
214 test_cmp expect.date actual.date &&
215 test_cmp expect.files actual.files &&
216 git checkout HEAD empty-file &&
220 test_expect_success PIPE
'directory with files' '
222 printf "%s\n" directory/file1 directory/file2 >expect.files &&
227 svn:author author@example.com \
228 svn:date "1999-02-01T00:01:002.000000Z" \
229 svn:log "add directory with some files in it" &&
234 SVN-fs-dump-format-version: 3
238 echo Prop-content-length: $(wc -c <props) &&
239 echo Content-length: $(wc -c <props) &&
247 Prop-content-length: 10
252 Node-path: directory/file1
256 text_no_props hello &&
258 Node-path: directory/file2
264 try_dump directory.dump &&
266 git ls-tree -r --name-only HEAD >actual.files &&
267 git checkout HEAD directory &&
268 test_cmp expect.files actual.files &&
269 test_cmp hello directory/file1 &&
270 test_cmp hi directory/file2
273 test_expect_success PIPE
'branch name with backslash' '
275 sort <<-\EOF >expect.branch-files &&
278 "branches/UpdateFOPto094\\/file1"
279 "branches/UpdateFOPto094\\/file2"
286 svn:author author@example.com \
287 svn:date "1999-02-02T00:01:02.000000Z" \
288 svn:log "add directory with some files in it" &&
293 svn:author brancher@example.com \
294 svn:date "2007-12-06T21:38:34.000000Z" \
295 svn:log "Updating fop to .94 and adjust fo-stylesheets" &&
300 SVN-fs-dump-format-version: 3
304 echo Prop-content-length: $(wc -c <props.setup) &&
305 echo Content-length: $(wc -c <props.setup) &&
313 Prop-content-length: 10
321 Prop-content-length: 10
326 Node-path: trunk/file1
330 text_no_props hello &&
332 Node-path: trunk/file2
341 echo Prop-content-length: $(wc -c <props.branch) &&
342 echo Content-length: $(wc -c <props.branch) &&
347 Node-path: branches/UpdateFOPto094\
351 Node-copyfrom-path: trunk
355 Prop-content-length: 34
365 try_dump branch.dump &&
367 git ls-tree -r --name-only HEAD |
368 sort >actual.branch-files &&
369 test_cmp expect.branch-files actual.branch-files
372 test_expect_success PIPE
'node without action' '
374 cat >inaction.dump <<-\EOF &&
375 SVN-fs-dump-format-version: 3
378 Prop-content-length: 10
385 Prop-content-length: 10
390 try_dump inaction.dump must_fail
393 test_expect_success PIPE
'action: add node without text' '
395 cat >textless.dump <<-\EOF &&
396 SVN-fs-dump-format-version: 3
399 Prop-content-length: 10
407 Prop-content-length: 10
412 try_dump textless.dump must_fail
415 test_expect_failure PIPE
'change file mode but keep old content' '
417 cat >expect <<-\EOF &&
419 :120000 100644 OBJID OBJID T greeting
421 :100644 120000 OBJID OBJID T greeting
423 :000000 100644 OBJID OBJID A greeting
425 echo "link hello" >expect.blob &&
427 cat >filemode.dump <<-\EOF &&
428 SVN-fs-dump-format-version: 3
431 Prop-content-length: 10
439 Prop-content-length: 10
440 Text-content-length: 11
447 Prop-content-length: 10
455 Prop-content-length: 33
465 Prop-content-length: 10
473 Prop-content-length: 10
478 try_dump filemode.dump &&
481 git diff-tree --root --stdin |
482 sed "s/$_x40/OBJID/g"
484 git show HEAD:greeting >actual.blob &&
485 git show HEAD^:greeting >actual.target &&
486 test_cmp expect actual &&
487 test_cmp expect.blob actual.blob &&
488 test_cmp hello actual.target
491 test_expect_success PIPE
'change file mode and reiterate content' '
493 cat >expect <<-\EOF &&
495 :120000 100644 OBJID OBJID T greeting
497 :100644 120000 OBJID OBJID T greeting
499 :000000 100644 OBJID OBJID A greeting
501 echo "link hello" >expect.blob &&
503 cat >filemode2.dump <<-\EOF &&
504 SVN-fs-dump-format-version: 3
507 Prop-content-length: 10
515 Prop-content-length: 10
516 Text-content-length: 11
523 Prop-content-length: 10
531 Prop-content-length: 33
532 Text-content-length: 11
543 Prop-content-length: 10
551 Prop-content-length: 10
552 Text-content-length: 11
558 try_dump filemode2.dump &&
561 git diff-tree --root --stdin |
562 sed "s/$_x40/OBJID/g"
564 git show HEAD:greeting >actual.blob &&
565 git show HEAD^:greeting >actual.target &&
566 test_cmp expect actual &&
567 test_cmp expect.blob actual.blob &&
568 test_cmp hello actual.target
571 test_expect_success PIPE
'deltas not supported' '
574 # (old) h + (inline) ello + (old) \n
575 printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
580 svn:author author@example.com \
581 svn:date "1999-01-05T00:01:002.000000Z" \
582 svn:log "add greeting" &&
587 svn:author author@example.com \
588 svn:date "1999-01-06T00:01:002.000000Z" \
589 svn:log "change it" &&
593 echo SVN-fs-dump-format-version: 3 &&
595 echo Revision-number: 1 &&
596 echo Prop-content-length: $(wc -c <props) &&
597 echo Content-length: $(wc -c <props) &&
605 Prop-content-length: 10
606 Text-content-length: 3
613 echo Revision-number: 2 &&
614 echo Prop-content-length: $(wc -c <props2) &&
615 echo Content-length: $(wc -c <props2) &&
624 Prop-content-length: 10
626 echo Text-content-length: $(wc -c <delta) &&
627 echo Content-length: $((10 + $(wc -c <delta))) &&
632 test_must_fail try_dump delta.dump
635 test_expect_success PIPE
'property deltas supported' '
637 cat >expect <<-\EOF &&
639 :100755 100644 OBJID OBJID M script.sh
643 svn:author author@example.com \
644 svn:date "1999-03-06T00:01:002.000000Z" \
645 svn:log "make an executable, or chmod -x it" &&
649 echo SVN-fs-dump-format-version: 3 &&
651 echo Revision-number: 1 &&
652 echo Prop-content-length: $(wc -c <revprops) &&
653 echo Content-length: $(wc -c <revprops) &&
661 Text-content-length: 0
662 Prop-content-length: 39
672 echo Revision-number: 2 &&
673 echo Prop-content-length: $(wc -c <revprops) &&
674 echo Content-length: $(wc -c <revprops) &&
683 Prop-content-length: 30
691 try_dump propdelta.dump &&
694 git diff-tree --stdin |
695 sed "s/$_x40/OBJID/g"
697 test_cmp expect actual
700 test_expect_success PIPE
'properties on /' '
702 cat <<-\EOF >expect &&
705 :000000 100644 OBJID OBJID A greeting
707 sed -e "s/X$//" <<-\EOF >changeroot.dump &&
708 SVN-fs-dump-format-version: 3
711 Prop-content-length: 10
719 Text-content-length: 0
720 Prop-content-length: 10
726 Prop-content-length: 10
735 Prop-content-length: 43
745 try_dump changeroot.dump &&
748 git diff-tree --root --always --stdin |
749 sed "s/$_x40/OBJID/g"
751 test_cmp expect actual
754 test_expect_success PIPE
'deltas for typechange' '
756 cat >expect <<-\EOF &&
758 :120000 100644 OBJID OBJID T test-file
760 :100755 120000 OBJID OBJID T test-file
762 :000000 100755 OBJID OBJID A test-file
764 cat >deleteprop.dump <<-\EOF &&
765 SVN-fs-dump-format-version: 3
768 Prop-content-length: 10
777 Prop-content-length: 35
778 Text-content-length: 17
789 Prop-content-length: 10
798 Prop-content-length: 53
799 Text-content-length: 17
812 Prop-content-length: 10
821 Prop-content-length: 27
822 Text-content-length: 17
830 try_dump deleteprop.dump &&
833 git diff-tree --root --stdin |
834 sed "s/$_x40/OBJID/g"
836 test_cmp expect actual
840 test_expect_success
'set up svn repo' '
841 svnconf=$PWD/svnconf &&
842 mkdir -p "$svnconf" &&
845 svnadmin -h >/dev/null 2>&1 &&
846 svnadmin create simple-svn &&
847 svnadmin load simple-svn <"$TEST_DIRECTORY/t9135/svn.dump" &&
848 svn export --config-dir "$svnconf" "file://$PWD/simple-svn" simple-svnco
850 test_set_prereq SVNREPO
854 test_expect_success SVNREPO
,PIPE
't9135/svn.dump' '
855 mkdir -p simple-git &&
859 try_dump "$TEST_DIRECTORY/t9135/svn.dump"
865 git fetch ../simple-git master &&
866 git diff --exit-code FETCH_HEAD