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

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

 



João Abecasis <joao@xxxxxxxxxxxxx> wrote:
> find-rev and rebase error out on svm because git-svn doesn't trace the
> original svn revision numbers back to git commits. The updated test
> case, included in the patch, 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 use the information they have to correctly track
> the source repository. This is enough to get find-rev and rebase
> working.
> 
> Signed-off-by: João Abecasis <joao@xxxxxxxxxxxxx>

Thanks João,

Acked-by: Eric Wong <normalperson@xxxxxxxx>

> ---
>  git-svn.perl                     |   39 ++++++++++++++++++++++++++++++++++---
>  t/t9110-git-svn-use-svm-props.sh |    9 ++++++++
>  2 files changed, 44 insertions(+), 4 deletions(-)
> 
> diff --git a/git-svn.perl b/git-svn.perl
> index a366c89..0aa994a 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 $use_svm_props = eval { command_oneline(qw/config --bool
> +	    svn.useSvmProps/) };
> +	$use_svm_props = $use_svm_props eq 'true' if $use_svm_props;
>  	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 $use_svm_props;
> +		} elsif (m!^(.+)\.usesvmprops=\s*(.*)\s*$!) {
> +			$r->{$1}->{svm} = {};
>  		} elsif (m!^(.+)\.url=\s*(.*)\s*$!) {
>  			$r->{$1}->{url} = $2;
>  		} elsif (m!^(.+)\.(branches|tags)=
> @@ -1437,6 +1443,23 @@ 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 +1586,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.6
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[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