[PATCH] git-svn: follow revisions of svm-mirrored repositories
From: João Abecasis <hidden>
Date: 2016-06-15 22:44:50
Subsystem:
the rest · Maintainer:
Linus Torvalds
From a4cd092cd1aeae954378038d24f93af930610cc8 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Jo=C3=A3o=20Abecasis?= <redacted> Date: Fri, 13 Jun 2008 20:32:57 -0500 Subject: [PATCH] git-svn: follow revisions of svm-mirrored repositories MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Although git-svn keeps track of source revisions in svm-mirrored repositories, it doesn't use that information in all places. This fixes working_head_info and Git::SVN::find_by_url to work with mirrored repositories when useSvmProps is set. At least the commands find-rev and rebase, which didn't work for me with svm-mirrored repositories, are now working. Signed-off-by: João Abecasis <redacted> --- git-svn.perl | 36 ++++++++++++++++++++++++++++++++---- t/t9110-git-svn-use-svm-props.sh | 9 +++++++++ 2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index 4c9c59b..4df6c71 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;
@@ -1160,7 +1160,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);
@@ -1414,11 +1414,16 @@ sub fetch_all { sub read_all_remotes { my $r = {}; + my $usesvmprops = eval { + command_oneline(qw/config --bool svn.useSvmProps/) } eq 'true'; 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)=
@@ -1435,6 +1440,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; }
@@ -1568,13 +1588,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.sh
index 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.5.1