Git fork

git-svn: fix useSvmProps, hopefully for the last time

svm:mirror is not useful at all for us. Parts of the old unit
test were broken and based on my misunderstanding of the
svm:mirror property.

When we read svm:source; make sure we correctly handle the '!'
in it: it is used to separate the path of the repository root
from the virtual path within the repository. We don't need
to make that distinction, honestly!

We also ensure that subdirectories are also mirrored with the
correct URL if we're using useSvmProps.

We have a new test that uses dumped repo that was really
created using SVN::Mirror to avoid ambiguities and
mis-understandings about the svm: properties.

Note: trailing whitespace in the svm.dump file is unfortunately
a reality and required by SVN; so please ignore it when applying
this patch.

Also, ensure that the -R/--remote/--svn-remote flag is always
in effect if explicitly passed via the command-line. This
allows us to track logically different mirrors sharing the
same URL (probably common with SVN::Mirror/SVK users).

Signed-off-by: Eric Wong <normalperson@yhbt.net>

Eric Wong befc9adc 62e349d2

+619 -140
+57 -34
git-svn.perl
··· 164 my $rv = GetOptions(%opts, 'help|H|h' => \$_help, 'version|V' => \$_version, 165 'minimize-connections' => \$Git::SVN::Migration::_minimize, 166 'id|i=s' => \$Git::SVN::default_ref_id, 167 - 'svn-remote|remote|R=s' => \$Git::SVN::default_repo_id); 168 exit 1 if (!$rv && $cmd ne 'log'); 169 170 usage(0) if $_help; ··· 749 use warnings; 750 use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent 751 $_repack $_repack_flags $_use_svm_props $_head 752 - $_use_svnsync_props/; 753 use Carp qw/croak/; 754 use File::Path qw/mkpath/; 755 use File::Copy qw/copy/; ··· 944 945 sub find_existing_remote { 946 my ($url, $remotes) = @_; 947 my $existing; 948 foreach my $repo_id (keys %$remotes) { 949 my $u = $remotes->{$repo_id}->{url} or next; ··· 1116 $svm = { 1117 source => tmp_config('--get', "$section.svm-source"), 1118 uuid => tmp_config('--get', "$section.svm-uuid"), 1119 } 1120 }; 1121 - $self->{svm} = $svm if ($svm && $svm->{source} && $svm->{uuid}); 1122 $self->{svm}; 1123 } 1124 ··· 1127 return $ra if $self->svm; 1128 1129 my @err = ( "useSvmProps set, but failed to read SVM properties\n", 1130 - "(svm:source, svm:mirror, svm:mirror) ", 1131 "from the following URLs:\n" ); 1132 sub read_svm_props { 1133 - my ($self, $props) = @_; 1134 my $src = $props->{'svm:source'}; 1135 - my $mirror = $props->{'svm:mirror'}; 1136 my $uuid = $props->{'svm:uuid'}; 1137 - return undef if (!$src || !$mirror || !$uuid); 1138 1139 - chomp($src, $mirror, $uuid); 1140 1141 $uuid =~ m{^[0-9a-f\-]{30,}$} 1142 or die "doesn't look right - svm:uuid is '$uuid'\n"; 1143 - # don't know what a '!' is there for, also the 1144 - # username is of no interest 1145 - $src =~ s{/?!$}{$mirror}; 1146 $src =~ s{/+$}{}; # no trailing slashes please 1147 $src =~ s{(^[a-z\+]*://)[^/@]*@}{$1}; 1148 1149 my $section = "svn-remote.$self->{repo_id}"; 1150 - tmp_config('--add', "$section.svm-source", $src); 1151 - tmp_config('--add', "$section.svm-uuid", $uuid); 1152 - $self->{svm} = { source => $src , uuid => $uuid }; 1153 - return 1; 1154 } 1155 1156 my $r = $ra->get_latest_revnum; 1157 my $path = $self->{path}; 1158 - my @tried_a = ($path); 1159 while (length $path) { 1160 - if ($self->read_svm_props(($ra->get_dir($path, $r))[2])) { 1161 - return $ra; 1162 } 1163 - $path =~ s#/?[^/]+$## && push @tried_a, $path; 1164 - } 1165 - if ($self->read_svm_props(($ra->get_dir('', $r))[2])) { 1166 - return $ra; 1167 } 1168 1169 if ($ra->{repos_root} eq $self->{url}) { 1170 - die @err, map { " $self->{url}/$_\n" } @tried_a, "\n"; 1171 } 1172 1173 # nope, make sure we're connected to the repository root: 1174 my $ok; 1175 my @tried_b; 1176 $path = $ra->{svn_path}; 1177 - $path =~ s#/?[^/]+$##; # we already tried this one above 1178 $ra = Git::SVN::Ra->new($ra->{repos_root}); 1179 while (length $path) { 1180 - $ok = $self->read_svm_props(($ra->get_dir($path, $r))[2]); 1181 - last if $ok; 1182 - $path =~ s#/?[^/]+$## && push @tried_b, $path; 1183 } 1184 - $ok = $self->read_svm_props(($ra->get_dir('', $r))[2]) unless $ok; 1185 if (!$ok) { 1186 - die @err, map { " $self->{url}/$_\n" } @tried_a, "\n", 1187 - map { " $ra->{url}/$_\n" } @tried_b, "\n" 1188 } 1189 Git::SVN::Ra->new($self->{url}); 1190 } ··· 1779 "options set!\n"; 1780 } 1781 my ($uuid, $r) = $headrev =~ m{^([a-f\d\-]{30,}):(\d+)$}; 1782 - if ($uuid ne $self->{svm}->{uuid}) { 1783 die "UUID mismatch on SVM path:\n", 1784 - "expected: $self->{svm}->{uuid}\n", 1785 " got: $uuid\n"; 1786 } 1787 - my $full_url = $self->{svm}->{source}; 1788 - $full_url .= "/$self->{path}" if length $self->{path}; 1789 $log_entry{metadata} = "$full_url\@$r $uuid"; 1790 $log_entry{svm_revision} = $r; 1791 $email ||= "$author\@$uuid"
··· 164 my $rv = GetOptions(%opts, 'help|H|h' => \$_help, 'version|V' => \$_version, 165 'minimize-connections' => \$Git::SVN::Migration::_minimize, 166 'id|i=s' => \$Git::SVN::default_ref_id, 167 + 'svn-remote|remote|R=s' => sub { 168 + $Git::SVN::no_reuse_existing = 1; 169 + $Git::SVN::default_repo_id = $_[1] }); 170 exit 1 if (!$rv && $cmd ne 'log'); 171 172 usage(0) if $_help; ··· 751 use warnings; 752 use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent 753 $_repack $_repack_flags $_use_svm_props $_head 754 + $_use_svnsync_props $no_reuse_existing/; 755 use Carp qw/croak/; 756 use File::Path qw/mkpath/; 757 use File::Copy qw/copy/; ··· 946 947 sub find_existing_remote { 948 my ($url, $remotes) = @_; 949 + return undef if $no_reuse_existing; 950 my $existing; 951 foreach my $repo_id (keys %$remotes) { 952 my $u = $remotes->{$repo_id}->{url} or next; ··· 1119 $svm = { 1120 source => tmp_config('--get', "$section.svm-source"), 1121 uuid => tmp_config('--get', "$section.svm-uuid"), 1122 + replace => tmp_config('--get', "$section.svm-replace"), 1123 } 1124 }; 1125 + if ($svm && $svm->{source} && $svm->{uuid} && $svm->{replace}) { 1126 + $self->{svm} = $svm; 1127 + } 1128 $self->{svm}; 1129 } 1130 ··· 1133 return $ra if $self->svm; 1134 1135 my @err = ( "useSvmProps set, but failed to read SVM properties\n", 1136 + "(svm:source, svm:uuid) ", 1137 "from the following URLs:\n" ); 1138 sub read_svm_props { 1139 + my ($self, $ra, $path, $r) = @_; 1140 + my $props = ($ra->get_dir($path, $r))[2]; 1141 my $src = $props->{'svm:source'}; 1142 my $uuid = $props->{'svm:uuid'}; 1143 + return undef if (!$src || !$uuid); 1144 1145 + chomp($src, $uuid); 1146 1147 $uuid =~ m{^[0-9a-f\-]{30,}$} 1148 or die "doesn't look right - svm:uuid is '$uuid'\n"; 1149 + 1150 + # the '!' is used to mark the repos_root!/relative/path 1151 + $src =~ s{/?!/?}{/}; 1152 $src =~ s{/+$}{}; # no trailing slashes please 1153 + # username is of no interest 1154 $src =~ s{(^[a-z\+]*://)[^/@]*@}{$1}; 1155 1156 + my $replace = $ra->{url}; 1157 + $replace .= "/$path" if length $path; 1158 + 1159 my $section = "svn-remote.$self->{repo_id}"; 1160 + tmp_config("$section.svm-source", $src); 1161 + tmp_config("$section.svm-replace", $replace); 1162 + tmp_config("$section.svm-uuid", $uuid); 1163 + $self->{svm} = { 1164 + source => $src, 1165 + uuid => $uuid, 1166 + replace => $replace 1167 + }; 1168 } 1169 1170 my $r = $ra->get_latest_revnum; 1171 my $path = $self->{path}; 1172 + my %tried; 1173 while (length $path) { 1174 + unless ($tried{"$self->{url}/$path"}) { 1175 + return $ra if $self->read_svm_props($ra, $path, $r); 1176 + $tried{"$self->{url}/$path"} = 1; 1177 } 1178 + $path =~ s#/?[^/]+$##; 1179 } 1180 + die "Path: '$path' should be ''\n" if $path ne ''; 1181 + return $ra if $self->read_svm_props($ra, $path, $r); 1182 + $tried{"$self->{url}/$path"} = 1; 1183 1184 if ($ra->{repos_root} eq $self->{url}) { 1185 + die @err, (map { " $_\n" } keys %tried), "\n"; 1186 } 1187 1188 # nope, make sure we're connected to the repository root: 1189 my $ok; 1190 my @tried_b; 1191 $path = $ra->{svn_path}; 1192 $ra = Git::SVN::Ra->new($ra->{repos_root}); 1193 while (length $path) { 1194 + unless ($tried{"$ra->{url}/$path"}) { 1195 + $ok = $self->read_svm_props($ra, $path, $r); 1196 + last if $ok; 1197 + $tried{"$ra->{url}/$path"} = 1; 1198 + } 1199 + $path =~ s#/?[^/]+$##; 1200 } 1201 + die "Path: '$path' should be ''\n" if $path ne ''; 1202 + $ok ||= $self->read_svm_props($ra, $path, $r); 1203 + $tried{"$ra->{url}/$path"} = 1; 1204 if (!$ok) { 1205 + die @err, (map { " $_\n" } keys %tried), "\n"; 1206 } 1207 Git::SVN::Ra->new($self->{url}); 1208 } ··· 1797 "options set!\n"; 1798 } 1799 my ($uuid, $r) = $headrev =~ m{^([a-f\d\-]{30,}):(\d+)$}; 1800 + # we don't want "SVM: initializing mirror for junk" ... 1801 + return undef if $r == 0; 1802 + my $svm = $self->svm; 1803 + if ($uuid ne $svm->{uuid}) { 1804 die "UUID mismatch on SVM path:\n", 1805 + "expected: $svm->{uuid}\n", 1806 " got: $uuid\n"; 1807 } 1808 + my $full_url = $self->full_url; 1809 + $full_url =~ s#^\Q$svm->{replace}\E(/|$)#$svm->{source}$1# or 1810 + die "Failed to replace '$svm->{replace}' with ", 1811 + "'$svm->{source}' in $full_url\n"; 1812 $log_entry{metadata} = "$full_url\@$r $uuid"; 1813 $log_entry{svm_revision} = $r; 1814 $email ||= "$author\@$uuid"
-106
t/t9109-git-svn-svk-mirrorpaths.sh
··· 1 - #!/bin/sh 2 - # 3 - # Copyright (c) 2006 Sam Vilian 4 - # 5 - 6 - test_description='git-svn on SVK mirror paths' 7 - . ./lib-git-svn.sh 8 - 9 - # ok, people who don't have SVK installed probably don't care about 10 - # this test. 11 - 12 - # we set up the repository manually, because even if SVK is installed 13 - # it is difficult to use it in a way that is idempotent. 14 - 15 - # we are not yet testing merge tickets.. 16 - 17 - uuid=b00bface-b1ff-c0ff-f0ff-b0bafe775e1e 18 - url=https://really.slow.server.com/foobar 19 - 20 - test_expect_success 'initialize repo' " 21 - git config svn-remote.svn.useSvmProps true && 22 - 23 - echo '#!/bin/sh' > $rawsvnrepo/hooks/pre-revprop-change && 24 - echo 'exit 0' >> $rawsvnrepo/hooks/pre-revprop-change && 25 - chmod +x $rawsvnrepo/hooks/pre-revprop-change && 26 - 27 - mkdir import && 28 - cd import && 29 - mkdir local && 30 - echo hello > local/readme && 31 - svn import -m 'random local work' . $svnrepo && 32 - cd .. && 33 - 34 - svn co $svnrepo wc && 35 - cd wc && 36 - mkdir -p mirror/foobar && 37 - svn add mirror && 38 - svn ps svm:source $url mirror/foobar && 39 - svn ps svm:uuid $uuid mirror/foobar && 40 - svn ps svm:mirror / mirror/foobar && 41 - svn commit -m 'setup mirror/foobar as mirror of upstream' && 42 - svn ps -r 2 --revprop svm:headrev $uuid:0 $svnrepo && 43 - 44 - mkdir mirror/foobar/trunk 45 - echo hello, world > mirror/foobar/trunk/readme && 46 - svn add mirror/foobar/trunk && 47 - svn commit -m 'first upstream revision' && 48 - svn ps -r 3 --revprop svm:headrev $uuid:1 $svnrepo && 49 - 50 - svn up && 51 - svn mkdir mirror/foobar/branches && 52 - svn cp mirror/foobar/trunk mirror/foobar/branches/silly && 53 - svn commit -m 'make branch for silliness' && 54 - svn ps -r 4 --revprop svm:headrev $uuid:2 $svnrepo && 55 - 56 - svn up && 57 - echo random untested feature >> mirror/foobar/trunk/readme && 58 - poke mirror/foobar/trunk/readme && 59 - svn commit -m 'add a c00l feature to trunk' && 60 - svn ps -r 5 --revprop svm:headrev $uuid:3 $svnrepo && 61 - 62 - svn up && 63 - echo bug fix >> mirror/foobar/branches/silly/readme && 64 - poke mirror/foobar/branches/silly/readme && 65 - svn commit -m 'fix a bug' && 66 - svn ps -r 6 --revprop svm:headrev $uuid:4 $svnrepo && 67 - 68 - svn mkdir mirror/foobar/tags && 69 - svn cp mirror/foobar/branches/silly mirror/foobar/tags/blah-1.0 && 70 - svn commit -m 'make a release' && 71 - svn ps -r 7 --revprop svm:headrev $uuid:5 $svnrepo && 72 - 73 - cd .. 74 - " 75 - 76 - test_expect_success 'init an SVK mirror path' " 77 - git-svn init -T trunk -t tags -b branches $svnrepo/mirror/foobar 78 - " 79 - 80 - test_expect_success 'multi-fetch an SVK mirror path' "git-svn multi-fetch" 81 - 82 - test_expect_success 'got tag history OK' " 83 - test \`git-log --pretty=oneline remotes/tags/blah-1.0 | wc -l\` -eq 3 84 - " 85 - 86 - test_expect_success 're-wrote git-svn-id URL, revision and UUID' " 87 - git cat-file commit refs/remotes/trunk | \ 88 - fgrep 'git-svn-id: $url/mirror/foobar/trunk@3 $uuid' && 89 - git cat-file commit refs/remotes/tags/blah-1.0 | \ 90 - fgrep 'git-svn-id: $url/mirror/foobar/tags/blah-1.0@5 $uuid' 91 - git cat-file commit refs/remotes/silly | \ 92 - fgrep 'git-svn-id: $url/mirror/foobar/branches/silly@4 $uuid' 93 - " 94 - 95 - test_expect_success 're-wrote author e-mail domain UUID' " 96 - test \`git log --pretty=fuller trunk | \ 97 - grep '<.*@.*>' | fgrep '@$uuid>' | wc -l\` -eq 4 && 98 - test \`git log --pretty=fuller remotes/silly | \ 99 - grep '<.*@.*>' | fgrep '@$uuid>' | wc -l\` -eq 6 && 100 - test \`git log --pretty=fuller remotes/tags/blah-1.0 | \ 101 - grep '<.*@.*>' | fgrep '@$uuid>' | wc -l\` -eq 6 102 - " 103 - 104 - test_debug 'gitk --all &' 105 - 106 - test_done
···
+51
t/t9110-git-svn-use-svm-props.sh
···
··· 1 + #!/bin/sh 2 + # 3 + # Copyright (c) 2007 Eric Wong 4 + # 5 + 6 + test_description='git-svn useSvmProps test' 7 + 8 + . ./lib-git-svn.sh 9 + 10 + test_expect_success 'load svm repo' " 11 + svnadmin load -q $rawsvnrepo < ../t9110/svm.dump && 12 + git-svn init -R arr -i bar $svnrepo/mirror/arr && 13 + git-svn init -R argh -i dir $svnrepo/mirror/argh && 14 + git-svn init -R argh -i e $svnrepo/mirror/argh/a/b/c/d/e && 15 + git-config svn.useSvmProps true && 16 + git-svn fetch --all 17 + " 18 + 19 + uuid=161ce429-a9dd-4828-af4a-52023f968c89 20 + 21 + bar_url=http://mayonaise/svnrepo/bar 22 + test_expect_success 'verify metadata for /bar' " 23 + git-cat-file commit refs/remotes/bar | \ 24 + grep '^git-svn-id: $bar_url@12 $uuid$' && 25 + git-cat-file commit refs/remotes/bar~1 | \ 26 + grep '^git-svn-id: $bar_url@11 $uuid$' && 27 + git-cat-file commit refs/remotes/bar~2 | \ 28 + grep '^git-svn-id: $bar_url@10 $uuid$' && 29 + git-cat-file commit refs/remotes/bar~3 | \ 30 + grep '^git-svn-id: $bar_url@9 $uuid$' && 31 + git-cat-file commit refs/remotes/bar~4 | \ 32 + grep '^git-svn-id: $bar_url@6 $uuid$' && 33 + git-cat-file commit refs/remotes/bar~5 | \ 34 + grep '^git-svn-id: $bar_url@1 $uuid$' 35 + " 36 + 37 + e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e 38 + test_expect_success 'verify metadata for /dir/a/b/c/d/e' " 39 + git-cat-file commit refs/remotes/e | \ 40 + grep '^git-svn-id: $e_url@1 $uuid$' 41 + " 42 + 43 + dir_url=http://mayonaise/svnrepo/dir 44 + test_expect_success 'verify metadata for /dir' " 45 + git-cat-file commit refs/remotes/dir | \ 46 + grep '^git-svn-id: $dir_url@2 $uuid$' && 47 + git-cat-file commit refs/remotes/dir~1 | \ 48 + grep '^git-svn-id: $dir_url@1 $uuid$' 49 + " 50 + 51 + test_done
+511
t/t9110/svm.dump
···
··· 1 + SVN-fs-dump-format-version: 2 2 + 3 + UUID: de5973c6-545d-41da-aded-c265f9039e74 4 + 5 + Revision-number: 0 6 + Prop-content-length: 56 7 + Content-length: 56 8 + 9 + K 8 10 + svn:date 11 + V 27 12 + 2007-02-17T06:54:59.793104Z 13 + PROPS-END 14 + 15 + Revision-number: 1 16 + Prop-content-length: 200 17 + Content-length: 200 18 + 19 + K 7 20 + svn:log 21 + V 40 22 + SVM: initializing mirror for /mirror/arr 23 + K 10 24 + svn:author 25 + V 3 26 + svm 27 + K 11 28 + svm:headrev 29 + V 39 30 + 161ce429-a9dd-4828-af4a-52023f968c89:0 31 + 32 + K 8 33 + svn:date 34 + V 27 35 + 2007-02-17T06:55:00.121647Z 36 + PROPS-END 37 + 38 + Node-path: 39 + Node-kind: dir 40 + Node-action: change 41 + Prop-content-length: 44 42 + Content-length: 44 43 + 44 + K 10 45 + svm:mirror 46 + V 12 47 + /mirror/arr 48 + 49 + PROPS-END 50 + 51 + 52 + Node-path: mirror 53 + Node-kind: dir 54 + Node-action: add 55 + Prop-content-length: 10 56 + Content-length: 10 57 + 58 + PROPS-END 59 + 60 + 61 + Node-path: mirror/arr 62 + Node-kind: dir 63 + Node-action: add 64 + Prop-content-length: 116 65 + Content-length: 116 66 + 67 + K 10 68 + svm:source 69 + V 29 70 + http://mayonaise/svnrepo!/bar 71 + K 8 72 + svm:uuid 73 + V 36 74 + 161ce429-a9dd-4828-af4a-52023f968c89 75 + PROPS-END 76 + 77 + 78 + Revision-number: 2 79 + Prop-content-length: 182 80 + Content-length: 182 81 + 82 + K 7 83 + svn:log 84 + V 18 85 + import for git-svn 86 + K 10 87 + svn:author 88 + V 7 89 + svnsync 90 + K 11 91 + svm:headrev 92 + V 39 93 + 161ce429-a9dd-4828-af4a-52023f968c89:1 94 + 95 + K 8 96 + svn:date 97 + V 27 98 + 2007-02-17T05:10:52.108847Z 99 + PROPS-END 100 + 101 + Node-path: mirror/arr 102 + Node-kind: dir 103 + Node-action: change 104 + Prop-content-length: 116 105 + Content-length: 116 106 + 107 + K 10 108 + svm:source 109 + V 29 110 + http://mayonaise/svnrepo!/bar 111 + K 8 112 + svm:uuid 113 + V 36 114 + 161ce429-a9dd-4828-af4a-52023f968c89 115 + PROPS-END 116 + 117 + 118 + Node-path: mirror/arr/zzz 119 + Node-kind: file 120 + Node-action: add 121 + Prop-content-length: 10 122 + Text-content-length: 4 123 + Text-content-md5: 33b02bc15ce9557d2dd8484d58f95ac4 124 + Content-length: 14 125 + 126 + PROPS-END 127 + zzz 128 + 129 + 130 + Revision-number: 3 131 + Prop-content-length: 230 132 + Content-length: 230 133 + 134 + K 7 135 + svn:log 136 + V 66 137 + new symlink is added to a file that was also just made executable 138 + 139 + K 10 140 + svn:author 141 + V 7 142 + svnsync 143 + K 11 144 + svm:headrev 145 + V 39 146 + 161ce429-a9dd-4828-af4a-52023f968c89:6 147 + 148 + K 8 149 + svn:date 150 + V 27 151 + 2007-02-17T05:11:01.686891Z 152 + PROPS-END 153 + 154 + Node-path: mirror/arr/zzz 155 + Node-kind: file 156 + Node-action: change 157 + Prop-content-length: 36 158 + Text-content-length: 4 159 + Text-content-md5: 33b02bc15ce9557d2dd8484d58f95ac4 160 + Content-length: 40 161 + 162 + K 14 163 + svn:executable 164 + V 1 165 + * 166 + PROPS-END 167 + zzz 168 + 169 + 170 + Revision-number: 4 171 + Prop-content-length: 192 172 + Content-length: 192 173 + 174 + K 7 175 + svn:log 176 + V 28 177 + /bar/d should be in the log 178 + 179 + K 10 180 + svn:author 181 + V 7 182 + svnsync 183 + K 11 184 + svm:headrev 185 + V 39 186 + 161ce429-a9dd-4828-af4a-52023f968c89:9 187 + 188 + K 8 189 + svn:date 190 + V 27 191 + 2007-02-17T05:11:07.686552Z 192 + PROPS-END 193 + 194 + Node-path: mirror/arr/d 195 + Node-kind: file 196 + Node-action: add 197 + Prop-content-length: 10 198 + Text-content-length: 4 199 + Text-content-md5: 0bee89b07a248e27c83fc3d5951213c1 200 + Content-length: 14 201 + 202 + PROPS-END 203 + abc 204 + 205 + 206 + Revision-number: 5 207 + Prop-content-length: 185 208 + Content-length: 185 209 + 210 + K 7 211 + svn:log 212 + V 20 213 + add a new directory 214 + 215 + K 10 216 + svn:author 217 + V 7 218 + svnsync 219 + K 11 220 + svm:headrev 221 + V 40 222 + 161ce429-a9dd-4828-af4a-52023f968c89:10 223 + 224 + K 8 225 + svn:date 226 + V 27 227 + 2007-02-17T05:11:08.405953Z 228 + PROPS-END 229 + 230 + Node-path: mirror/arr/newdir 231 + Node-kind: dir 232 + Node-action: add 233 + Prop-content-length: 10 234 + Content-length: 10 235 + 236 + PROPS-END 237 + 238 + 239 + Node-path: mirror/arr/newdir/dir 240 + Node-kind: file 241 + Node-action: add 242 + Prop-content-length: 10 243 + Text-content-length: 4 244 + Text-content-md5: 9cd599a3523898e6a12e13ec787da50a 245 + Content-length: 14 246 + 247 + PROPS-END 248 + new 249 + 250 + 251 + Revision-number: 6 252 + Prop-content-length: 196 253 + Content-length: 196 254 + 255 + K 7 256 + svn:log 257 + V 31 258 + modify a file in new directory 259 + 260 + K 10 261 + svn:author 262 + V 7 263 + svnsync 264 + K 11 265 + svm:headrev 266 + V 40 267 + 161ce429-a9dd-4828-af4a-52023f968c89:11 268 + 269 + K 8 270 + svn:date 271 + V 27 272 + 2007-02-17T05:11:09.126645Z 273 + PROPS-END 274 + 275 + Node-path: mirror/arr/newdir/dir 276 + Node-kind: file 277 + Node-action: change 278 + Text-content-length: 8 279 + Text-content-md5: a950e20332358e523a5e9d571e47fa64 280 + Content-length: 8 281 + 282 + new 283 + foo 284 + 285 + 286 + Revision-number: 7 287 + Prop-content-length: 179 288 + Content-length: 179 289 + 290 + K 7 291 + svn:log 292 + V 14 293 + update /bar/d 294 + 295 + K 10 296 + svn:author 297 + V 7 298 + svnsync 299 + K 11 300 + svm:headrev 301 + V 40 302 + 161ce429-a9dd-4828-af4a-52023f968c89:12 303 + 304 + K 8 305 + svn:date 306 + V 27 307 + 2007-02-17T05:11:09.846221Z 308 + PROPS-END 309 + 310 + Node-path: mirror/arr/d 311 + Node-kind: file 312 + Node-action: change 313 + Text-content-length: 4 314 + Text-content-md5: 7abb78de7f2756ca8b511cbc879fd5e7 315 + Content-length: 4 316 + 317 + cba 318 + 319 + 320 + Revision-number: 8 321 + Prop-content-length: 201 322 + Content-length: 201 323 + 324 + K 7 325 + svn:log 326 + V 41 327 + SVM: initializing mirror for /mirror/argh 328 + K 10 329 + svn:author 330 + V 3 331 + svm 332 + K 11 333 + svm:headrev 334 + V 39 335 + 161ce429-a9dd-4828-af4a-52023f968c89:0 336 + 337 + K 8 338 + svn:date 339 + V 27 340 + 2007-02-17T06:56:03.703677Z 341 + PROPS-END 342 + 343 + Node-path: 344 + Node-kind: dir 345 + Node-action: change 346 + Prop-content-length: 57 347 + Content-length: 57 348 + 349 + K 10 350 + svm:mirror 351 + V 25 352 + /mirror/argh 353 + /mirror/arr 354 + 355 + PROPS-END 356 + 357 + 358 + Node-path: mirror/argh 359 + Node-kind: dir 360 + Node-action: add 361 + Prop-content-length: 116 362 + Content-length: 116 363 + 364 + K 10 365 + svm:source 366 + V 29 367 + http://mayonaise/svnrepo!/dir 368 + K 8 369 + svm:uuid 370 + V 36 371 + 161ce429-a9dd-4828-af4a-52023f968c89 372 + PROPS-END 373 + 374 + 375 + Revision-number: 9 376 + Prop-content-length: 182 377 + Content-length: 182 378 + 379 + K 7 380 + svn:log 381 + V 18 382 + import for git-svn 383 + K 10 384 + svn:author 385 + V 7 386 + svnsync 387 + K 11 388 + svm:headrev 389 + V 39 390 + 161ce429-a9dd-4828-af4a-52023f968c89:1 391 + 392 + K 8 393 + svn:date 394 + V 27 395 + 2007-02-17T05:10:52.108847Z 396 + PROPS-END 397 + 398 + Node-path: mirror/argh 399 + Node-kind: dir 400 + Node-action: change 401 + Prop-content-length: 116 402 + Content-length: 116 403 + 404 + K 10 405 + svm:source 406 + V 29 407 + http://mayonaise/svnrepo!/dir 408 + K 8 409 + svm:uuid 410 + V 36 411 + 161ce429-a9dd-4828-af4a-52023f968c89 412 + PROPS-END 413 + 414 + 415 + Node-path: mirror/argh/a 416 + Node-kind: dir 417 + Node-action: add 418 + Prop-content-length: 10 419 + Content-length: 10 420 + 421 + PROPS-END 422 + 423 + 424 + Node-path: mirror/argh/a/b 425 + Node-kind: dir 426 + Node-action: add 427 + Prop-content-length: 10 428 + Content-length: 10 429 + 430 + PROPS-END 431 + 432 + 433 + Node-path: mirror/argh/a/b/c 434 + Node-kind: dir 435 + Node-action: add 436 + Prop-content-length: 10 437 + Content-length: 10 438 + 439 + PROPS-END 440 + 441 + 442 + Node-path: mirror/argh/a/b/c/d 443 + Node-kind: dir 444 + Node-action: add 445 + Prop-content-length: 10 446 + Content-length: 10 447 + 448 + PROPS-END 449 + 450 + 451 + Node-path: mirror/argh/a/b/c/d/e 452 + Node-kind: dir 453 + Node-action: add 454 + Prop-content-length: 10 455 + Content-length: 10 456 + 457 + PROPS-END 458 + 459 + 460 + Node-path: mirror/argh/a/b/c/d/e/file 461 + Node-kind: file 462 + Node-action: add 463 + Prop-content-length: 10 464 + Text-content-length: 9 465 + Text-content-md5: 3fd46fe46fcdcf062c802ca60dc826d5 466 + Content-length: 19 467 + 468 + PROPS-END 469 + deep dir 470 + 471 + 472 + Revision-number: 10 473 + Prop-content-length: 197 474 + Content-length: 197 475 + 476 + K 7 477 + svn:log 478 + V 33 479 + try a deep --rmdir with a commit 480 + 481 + K 10 482 + svn:author 483 + V 7 484 + svnsync 485 + K 11 486 + svm:headrev 487 + V 39 488 + 161ce429-a9dd-4828-af4a-52023f968c89:2 489 + 490 + K 8 491 + svn:date 492 + V 27 493 + 2007-02-17T05:10:54.847015Z 494 + PROPS-END 495 + 496 + Node-path: mirror/argh/file 497 + Node-kind: file 498 + Node-action: add 499 + Node-copyfrom-rev: 9 500 + Node-copyfrom-path: mirror/argh/a/b/c/d/e/file 501 + Text-content-length: 9 502 + Text-content-md5: 3fd46fe46fcdcf062c802ca60dc826d5 503 + Content-length: 9 504 + 505 + deep dir 506 + 507 + 508 + Node-path: mirror/argh/a 509 + Node-action: delete 510 + 511 +