[PATCH] git-svn: find-rev and rebase for SVN::Mirror repositories

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



find-rev and rebase error out on svm because git-svn doesn't trace the originalsvn revision numbers back to git commits. The updated test case, included in thepatch, shows the issue and passes with the rest of the patch applied.
This fixes Git::SVN::find_by_url to find branches based on the svm:source URL,where useSvmProps is set. Also makes sure cmd_find_rev and working_head_info usethe information they have to correctly track the source repository. This isenough to get find-rev and rebase working.
Signed-off-by: João Abecasis <joao@xxxxxxxxxxxxx>---Incidentally, I've tried submitting these fixes before, but failed toget much attention, so I could be doing something wrong... Any inputon the patch or my approach to this list is appreciated. This time Ireworded the commit message and added Eric Wong to the CC list, sincehe seems to be Ack'ing git-svn patches.
Anyway, the patch does get things working for me.
Cheers,

João
 git-svn.perl                     |   37 +++++++++++++++++++++++++++++++++---- t/t9110-git-svn-use-svm-props.sh |    9 +++++++++ 2 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/git-svn.perl b/git-svn.perlindex a366c89..f5baec1 100755--- a/git-svn.perl+++ b/git-svn.perl@@ -537,13 +537,13 @@ sub cmd_find_rev { 		my $head = shift; 		$head ||= 'HEAD'; 		my @refs;-		my (undef, undef, undef, $gs) = working_head_info($head, \@refs);+		my (undef, undef, $uuid, $gs) = working_head_info($head, \@refs); 		unless ($gs) { 			die "Unable to determine upstream SVN information from ", 			    "$head history\n"; 		} 		my $desired_revision = substr($revision_or_hash, 1);-		$result = $gs->rev_map_get($desired_revision);+		$result = $gs->rev_map_get($desired_revision, $uuid); 	} else { 		my (undef, $rev, undef) = cmt_metadata($revision_or_hash); 		$result = $rev;@@ -1162,7 +1162,7 @@ sub working_head_info { 		if (defined $url && defined $rev) { 			next if $max{$url} and $max{$url} < $rev; 			if (my $gs = Git::SVN->find_by_url($url)) {-				my $c = $gs->rev_map_get($rev);+				my $c = $gs->rev_map_get($rev, $uuid); 				if ($c && $c eq $hash) { 					close $fh; # break the pipe 					return ($url, $rev, $uuid, $gs);@@ -1416,11 +1416,17 @@ sub fetch_all {
 sub read_all_remotes { 	my $r = {};+        my $usesvmprops = eval { command_oneline(qw/config --bool+            svn.useSvmProps/) };+        $usesvmprops = $usesvmprops eq 'true' if $usesvmprops; 	foreach (grep { s/^svn-remote\.// } command(qw/config -l/)) { 		if (m!^(.+)\.fetch=\s*(.*)\s*:\s*refs/remotes/(.+)\s*$!) { 			my ($remote, $local_ref, $remote_ref) = ($1, $2, $3); 			$local_ref =~ s{^/}{}; 			$r->{$remote}->{fetch}->{$local_ref} = $remote_ref;+			$r->{$remote}->{svm} = {} if $usesvmprops;+		} elsif (m!^(.+)\.usesvmprops=\s*(.*)\s*$!) {+			$r->{$1}->{svm} = {}; 		} elsif (m!^(.+)\.url=\s*(.*)\s*$!) { 			$r->{$1}->{url} = $2; 		} elsif (m!^(.+)\.(branches|tags)=@@ -1437,6 +1443,21 @@ sub read_all_remotes { 			} 		} 	}++	map {+		if (defined $r->{$_}->{svm}) {+			my $svm;+			eval {+				my $section = "svn-remote.$_";+				$svm = {+					source => tmp_config('--get', "$section.svm-source"),+					replace => tmp_config('--get', "$section.svm-replace"),+				}+			};+			$r->{$_}->{svm} = $svm;+		}+	} keys %$r;+ 	$r; }
@@ -1563,13 +1584,21 @@ sub find_by_url { # repos_root and, path are optional 		} 		my $p = $path; 		my $rwr = rewrite_root({repo_id => $repo_id});+		my $svm = $remotes->{$repo_id}->{svm}+			if defined $remotes->{$repo_id}->{svm}; 		unless (defined $p) { 			$p = $full_url; 			my $z = $u;+			my $prefix = ''; 			if ($rwr) { 				$z = $rwr;+			} elsif (defined $svm) {+				$z = $svm->{source};+				$prefix = $svm->{replace};+				$prefix =~ s#^\Q$u\E(?:/|$)##;+				$prefix =~ s#/$##; 			}-			$p =~ s#^\Q$z\E(?:/|$)## or next;+			$p =~ s#^\Q$z\E(?=/|$)#$prefix# or next; 		} 		foreach my $f (keys %$fetch) { 			next if $f ne $p;diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.shindex 047659f..04d2a65 100755--- a/t/t9110-git-svn-use-svm-props.sh+++ b/t/t9110-git-svn-use-svm-props.sh@@ -49,4 +49,13 @@ test_expect_success 'verify metadata for /dir' " 	   grep '^git-svn-id: $dir_url@1 $uuid$' 	"
+test_expect_success 'find commit based on SVN revision number' "+        git-svn find-rev r12 |+	    grep `git rev-parse HEAD`+        "++test_expect_success 'empty rebase' "+	git-svn rebase+	"+ test_done-- 1.5.6��.n��������+%������w��{.n��������n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�m


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux