Code

5e2b123080747a77f8004c6cfaef9fcb7eb9e26f
[git.git] / t / t9010-svn-fe.sh
1 #!/bin/sh
3 test_description='check svn dumpfile importer'
5 . ./test-lib.sh
7 reinit_git () {
8         rm -fr .git &&
9         git init
10 }
12 properties () {
13         while test "$#" -ne 0
14         do
15                 property="$1" &&
16                 value="$2" &&
17                 printf "%s\n" "K ${#property}" &&
18                 printf "%s\n" "$property" &&
19                 printf "%s\n" "V ${#value}" &&
20                 printf "%s\n" "$value" &&
21                 shift 2 ||
22                 return 1
23         done
24 }
26 text_no_props () {
27         text="$1
28 " &&
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" &&
33         printf "%s\n" "$text"
34 }
36 >empty
38 test_expect_success 'empty dump' '
39         reinit_git &&
40         echo "SVN-fs-dump-format-version: 2" >input &&
41         test-svn-fe input >stream &&
42         git fast-import <stream
43 '
45 test_expect_success 'v4 dumps not supported' '
46         reinit_git &&
47         echo "SVN-fs-dump-format-version: 4" >v4.dump &&
48         test_must_fail test-svn-fe v4.dump >stream &&
49         test_cmp empty stream
50 '
52 test_expect_failure 'empty revision' '
53         reinit_git &&
54         printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
55         cat >emptyrev.dump <<-\EOF &&
56         SVN-fs-dump-format-version: 3
58         Revision-number: 1
59         Prop-content-length: 0
60         Content-length: 0
62         Revision-number: 2
63         Prop-content-length: 0
64         Content-length: 0
66         EOF
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
71 '
73 test_expect_success 'empty properties' '
74         reinit_git &&
75         printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
76         cat >emptyprop.dump <<-\EOF &&
77         SVN-fs-dump-format-version: 3
79         Revision-number: 1
80         Prop-content-length: 10
81         Content-length: 10
83         PROPS-END
85         Revision-number: 2
86         Prop-content-length: 10
87         Content-length: 10
89         PROPS-END
90         EOF
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
95 '
97 test_expect_success 'author name and commit message' '
98         reinit_git &&
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.
106         * file.c
107             Details pertaining to an individual file.
108         EOF
109         {
110                 properties \
111                         svn:author author@example.com \
112                         svn:log "$(cat message)" &&
113                 echo PROPS-END
114         } >props &&
115         {
116                 echo "SVN-fs-dump-format-version: 3" &&
117                 echo &&
118                 echo "Revision-number: 1" &&
119                 echo Prop-content-length: $(wc -c <props) &&
120                 echo Content-length: $(wc -c <props) &&
121                 echo &&
122                 cat props
123         } >log.dump &&
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' '
133         reinit_git &&
134         echo author >expect &&
135         cat >extraprop.dump <<-\EOF &&
136         SVN-fs-dump-format-version: 3
138         Revision-number: 1
139         Prop-content-length: 56
140         Content-length: 56
142         K 8
143         nonsense
144         V 1
145         y
146         K 10
147         svn:author
148         V 6
149         author
150         PROPS-END
151         EOF
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 &&
162         reinit_git &&
163         {
164                 properties \
165                         svn:author author@example.com \
166                         svn:date "1999-01-01T00:01:002.000000Z" \
167                         svn:log "add empty file" &&
168                 echo PROPS-END
169         } >props &&
170         {
171                 cat <<-EOF &&
172                 SVN-fs-dump-format-version: 3
174                 Revision-number: 1
175                 EOF
176                 echo Prop-content-length: $(wc -c <props) &&
177                 echo Content-length: $(wc -c <props) &&
178                 echo &&
179                 cat props &&
180                 cat <<-\EOF
182                 Node-path: empty-file
183                 Node-kind: file
184                 Node-action: add
185                 Content-length: 0
187                 EOF
188         } >emptyfile.dump &&
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 &&
198         test_cmp empty file
201 test_expect_success 'directory with files' '
202         reinit_git &&
203         printf "%s\n" directory/file1 directory/file2 >expect.files &&
204         echo hi >hi &&
205         echo hello >hello &&
206         {
207                 properties \
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" &&
211                 echo PROPS-END
212         } >props &&
213         {
214                 cat <<-EOF &&
215                 SVN-fs-dump-format-version: 3
217                 Revision-number: 1
218                 EOF
219                 echo Prop-content-length: $(wc -c <props) &&
220                 echo Content-length: $(wc -c <props) &&
221                 echo &&
222                 cat props &&
223                 cat <<-\EOF &&
225                 Node-path: directory
226                 Node-kind: dir
227                 Node-action: add
228                 Prop-content-length: 10
229                 Content-length: 10
231                 PROPS-END
233                 Node-path: directory/file1
234                 Node-kind: file
235                 Node-action: add
236                 EOF
237                 text_no_props hello &&
238                 cat <<-\EOF &&
239                 Node-path: directory/file2
240                 Node-kind: file
241                 Node-action: add
242                 EOF
243                 text_no_props hi
244         } >directory.dump &&
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
259         Revision-number: 1
260         Prop-content-length: 10
261         Content-length: 10
263         PROPS-END
265         Node-path: directory
266         Node-kind: dir
267         Prop-content-length: 10
268         Content-length: 10
270         PROPS-END
271         EOF
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
279         Revision-number: 1
280         Prop-content-length: 10
281         Content-length: 10
283         PROPS-END
285         Node-path: textless
286         Node-kind: file
287         Node-action: add
288         Prop-content-length: 10
289         Content-length: 10
291         PROPS-END
292         EOF
293         test_must_fail test-svn-fe textless.dump
296 test_expect_failure 'change file mode but keep old content' '
297         reinit_git &&
298         cat >expect <<-\EOF &&
299         OBJID
300         :120000 100644 OBJID OBJID T    greeting
301         OBJID
302         :100644 120000 OBJID OBJID T    greeting
303         OBJID
304         :000000 100644 OBJID OBJID A    greeting
305         EOF
306         echo "link hello" >expect.blob &&
307         echo hello >hello &&
308         cat >filemode.dump <<-\EOF &&
309         SVN-fs-dump-format-version: 3
311         Revision-number: 1
312         Prop-content-length: 10
313         Content-length: 10
315         PROPS-END
317         Node-path: greeting
318         Node-kind: file
319         Node-action: add
320         Prop-content-length: 10
321         Text-content-length: 11
322         Content-length: 21
324         PROPS-END
325         link hello
327         Revision-number: 2
328         Prop-content-length: 10
329         Content-length: 10
331         PROPS-END
333         Node-path: greeting
334         Node-kind: file
335         Node-action: change
336         Prop-content-length: 33
337         Content-length: 33
339         K 11
340         svn:special
341         V 1
342         *
343         PROPS-END
345         Revision-number: 3
346         Prop-content-length: 10
347         Content-length: 10
349         PROPS-END
351         Node-path: greeting
352         Node-kind: file
353         Node-action: change
354         Prop-content-length: 10
355         Content-length: 10
357         PROPS-END
358         EOF
359         test-svn-fe filemode.dump >stream &&
360         git fast-import <stream &&
361         {
362                 git rev-list HEAD |
363                 git diff-tree --root --stdin |
364                 sed "s/$_x40/OBJID/g"
365         } >actual &&
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' '
374         reinit_git &&
375         echo "commit message" >expect.message &&
376         {
377                 properties \
378                         unimportant "something with a NUL (Q)" \
379                         svn:log "commit message"&&
380                 echo PROPS-END
381         } |
382         q_to_nul >props &&
383         {
384                 cat <<-\EOF &&
385                 SVN-fs-dump-format-version: 3
387                 Revision-number: 1
388                 EOF
389                 echo Prop-content-length: $(wc -c <props) &&
390                 echo Content-length: $(wc -c <props) &&
391                 echo &&
392                 cat props
393         } >nulprop.dump &&
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' '
401         reinit_git &&
402         cat >expect <<-\EOF &&
403         OBJID
404         :120000 100644 OBJID OBJID T    greeting
405         OBJID
406         :100644 120000 OBJID OBJID T    greeting
407         OBJID
408         :000000 100644 OBJID OBJID A    greeting
409         EOF
410         echo "link hello" >expect.blob &&
411         echo hello >hello &&
412         cat >filemode.dump <<-\EOF &&
413         SVN-fs-dump-format-version: 3
415         Revision-number: 1
416         Prop-content-length: 10
417         Content-length: 10
419         PROPS-END
421         Node-path: greeting
422         Node-kind: file
423         Node-action: add
424         Prop-content-length: 10
425         Text-content-length: 11
426         Content-length: 21
428         PROPS-END
429         link hello
431         Revision-number: 2
432         Prop-content-length: 10
433         Content-length: 10
435         PROPS-END
437         Node-path: greeting
438         Node-kind: file
439         Node-action: change
440         Prop-content-length: 33
441         Text-content-length: 11
442         Content-length: 44
444         K 11
445         svn:special
446         V 1
447         *
448         PROPS-END
449         link hello
451         Revision-number: 3
452         Prop-content-length: 10
453         Content-length: 10
455         PROPS-END
457         Node-path: greeting
458         Node-kind: file
459         Node-action: change
460         Prop-content-length: 10
461         Text-content-length: 11
462         Content-length: 21
464         PROPS-END
465         link hello
466         EOF
467         test-svn-fe filemode.dump >stream &&
468         git fast-import <stream &&
469         {
470                 git rev-list HEAD |
471                 git diff-tree --root --stdin |
472                 sed "s/$_x40/OBJID/g"
473         } >actual &&
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' '
482         {
483                 # (old) h + (inline) ello + (old) \n
484                 printf "SVNQ%b%b%s" "Q\003\006\005\004" "\001Q\0204\001\002" "ello" |
485                 q_to_nul
486         } >delta &&
487         {
488                 properties \
489                         svn:author author@example.com \
490                         svn:date "1999-01-05T00:01:002.000000Z" \
491                         svn:log "add greeting" &&
492                 echo PROPS-END
493         } >props &&
494         {
495                 properties \
496                         svn:author author@example.com \
497                         svn:date "1999-01-06T00:01:002.000000Z" \
498                         svn:log "change it" &&
499                 echo PROPS-END
500         } >props2 &&
501         {
502                 echo SVN-fs-dump-format-version: 3 &&
503                 echo &&
504                 echo Revision-number: 1 &&
505                 echo Prop-content-length: $(wc -c <props) &&
506                 echo Content-length: $(wc -c <props) &&
507                 echo &&
508                 cat props &&
509                 cat <<-\EOF &&
511                 Node-path: hello
512                 Node-kind: file
513                 Node-action: add
514                 Prop-content-length: 10
515                 Text-content-length: 3
516                 Content-length: 13
518                 PROPS-END
519                 hi
521                 EOF
522                 echo Revision-number: 2 &&
523                 echo Prop-content-length: $(wc -c <props2) &&
524                 echo Content-length: $(wc -c <props2) &&
525                 echo &&
526                 cat props2 &&
527                 cat <<-\EOF &&
529                 Node-path: hello
530                 Node-kind: file
531                 Node-action: change
532                 Text-delta: true
533                 Prop-content-length: 10
534                 EOF
535                 echo Text-content-length: $(wc -c <delta) &&
536                 echo Content-length: $((10 + $(wc -c <delta))) &&
537                 echo &&
538                 echo PROPS-END &&
539                 cat delta
540         } >delta.dump &&
541         test_must_fail test-svn-fe delta.dump
544 test_expect_success 'property deltas supported' '
545         reinit_git &&
546         cat >expect <<-\EOF &&
547         OBJID
548         :100755 100644 OBJID OBJID M    script.sh
549         EOF
550         {
551                 properties \
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" &&
555                 echo PROPS-END
556         } >revprops &&
557         {
558                 echo SVN-fs-dump-format-version: 3 &&
559                 echo &&
560                 echo Revision-number: 1 &&
561                 echo Prop-content-length: $(wc -c <revprops) &&
562                 echo Content-length: $(wc -c <revprops) &&
563                 echo &&
564                 cat revprops &&
565                 echo &&
566                 cat <<-\EOF &&
567                 Node-path: script.sh
568                 Node-kind: file
569                 Node-action: add
570                 Text-content-length: 0
571                 Prop-content-length: 39
572                 Content-length: 39
574                 K 14
575                 svn:executable
576                 V 4
577                 true
578                 PROPS-END
580                 EOF
581                 echo Revision-number: 2 &&
582                 echo Prop-content-length: $(wc -c <revprops) &&
583                 echo Content-length: $(wc -c <revprops) &&
584                 echo &&
585                 cat revprops &&
586                 echo &&
587                 cat <<-\EOF
588                 Node-path: script.sh
589                 Node-kind: file
590                 Node-action: change
591                 Prop-delta: true
592                 Prop-content-length: 30
593                 Content-length: 30
595                 D 14
596                 svn:executable
597                 PROPS-END
598                 EOF
599         } >propdelta.dump &&
600         test-svn-fe propdelta.dump >stream &&
601         git fast-import <stream &&
602         {
603                 git rev-list HEAD |
604                 git diff-tree --stdin |
605                 sed "s/$_x40/OBJID/g"
606         } >actual &&
607         test_cmp expect actual
610 test_expect_success 'properties on /' '
611         reinit_git &&
612         cat <<-\EOF >expect &&
613         OBJID
614         OBJID
615         :000000 100644 OBJID OBJID A    greeting
616         EOF
617         sed -e "s/X$//" <<-\EOF >changeroot.dump &&
618         SVN-fs-dump-format-version: 3
620         Revision-number: 1
621         Prop-content-length: 10
622         Content-length: 10
624         PROPS-END
626         Node-path: greeting
627         Node-kind: file
628         Node-action: add
629         Text-content-length: 0
630         Prop-content-length: 10
631         Content-length: 10
633         PROPS-END
635         Revision-number: 2
636         Prop-content-length: 10
637         Content-length: 10
639         PROPS-END
641         Node-path: X
642         Node-kind: dir
643         Node-action: change
644         Prop-delta: true
645         Prop-content-length: 43
646         Content-length: 43
648         K 10
649         svn:ignore
650         V 11
651         build-area
653         PROPS-END
654         EOF
655         test-svn-fe changeroot.dump >stream &&
656         git fast-import <stream &&
657         {
658                 git rev-list HEAD |
659                 git diff-tree --root --always --stdin |
660                 sed "s/$_x40/OBJID/g"
661         } >actual &&
662         test_cmp expect actual
665 test_expect_success 'deltas for typechange' '
666         reinit_git &&
667         cat >expect <<-\EOF &&
668         OBJID
669         :120000 100644 OBJID OBJID T    test-file
670         OBJID
671         :100755 120000 OBJID OBJID T    test-file
672         OBJID
673         :000000 100755 OBJID OBJID A    test-file
674         EOF
675         cat >deleteprop.dump <<-\EOF &&
676         SVN-fs-dump-format-version: 3
678         Revision-number: 1
679         Prop-content-length: 10
680         Content-length: 10
682         PROPS-END
684         Node-path: test-file
685         Node-kind: file
686         Node-action: add
687         Prop-delta: true
688         Prop-content-length: 35
689         Text-content-length: 17
690         Content-length: 52
692         K 14
693         svn:executable
694         V 0
696         PROPS-END
697         link testing 123
699         Revision-number: 2
700         Prop-content-length: 10
701         Content-length: 10
703         PROPS-END
705         Node-path: test-file
706         Node-kind: file
707         Node-action: change
708         Prop-delta: true
709         Prop-content-length: 53
710         Text-content-length: 17
711         Content-length: 70
713         K 11
714         svn:special
715         V 1
716         *
717         D 14
718         svn:executable
719         PROPS-END
720         link testing 231
722         Revision-number: 3
723         Prop-content-length: 10
724         Content-length: 10
726         PROPS-END
728         Node-path: test-file
729         Node-kind: file
730         Node-action: change
731         Prop-delta: true
732         Prop-content-length: 27
733         Text-content-length: 17
734         Content-length: 44
736         D 11
737         svn:special
738         PROPS-END
739         link testing 321
740         EOF
741         test-svn-fe deleteprop.dump >stream &&
742         git fast-import <stream &&
743         {
744                 git rev-list HEAD |
745                 git diff-tree --root --stdin |
746                 sed "s/$_x40/OBJID/g"
747         } >actual &&
748         test_cmp expect actual
752 test_expect_success 'set up svn repo' '
753         svnconf=$PWD/svnconf &&
754         mkdir -p "$svnconf" &&
756         if
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
761         then
762                 test_set_prereq SVNREPO
763         fi
766 test_expect_success SVNREPO 't9135/svn.dump' '
767         git init simple-git &&
768         test-svn-fe "$TEST_DIRECTORY/t9135/svn.dump" >simple.fe &&
769         (
770                 cd simple-git &&
771                 git fast-import <../simple.fe
772         ) &&
773         (
774                 cd simple-svnco &&
775                 git init &&
776                 git add . &&
777                 git fetch ../simple-git master &&
778                 git diff --exit-code FETCH_HEAD
779         )
782 test_done