diff options
| author | Sam Vilain <sam.vilain@catalyst.net.nz> | 2009-10-20 15:42:01 +1300 | 
|---|---|---|
| committer | Eric Wong <normalperson@yhbt.net> | 2009-10-26 23:51:31 -0700 | 
| commit | f1264bd65451a68e87e0f99c9601cfa1b3244db6 (patch) | |
| tree | 4703c7293c10dacfdf731058f8fd0caebc61484f /git-svn.perl | |
| parent | a5e9c7dfe4732b560ab5dfc75e718bfda2027990 (diff) | |
| download | git-f1264bd65451a68e87e0f99c9601cfa1b3244db6.tar.gz | |
git-svn: convert SVK merge tickets to extra parents
SVK is a simple case to start with, as its idea of merge parents
matches git's one.  When a svk:merge ticket is encountered, check each
of the listed merged revisions to see if they are in the history of
this commit; if not, then we have encountered a merge - record it.
[ew: minor formatting cleanups]
Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Diffstat (limited to 'git-svn.perl')
| -rwxr-xr-x | git-svn.perl | 52 | 
1 files changed, 51 insertions, 1 deletions
| diff --git a/git-svn.perl b/git-svn.perl index 56af2216a9..1b918aef71 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -2878,14 +2878,64 @@ sub check_author {  	$author;  } +sub find_extra_svk_parents { +	my ($self, $ed, $tickets, $parents) = @_; +	# aha!  svk:merge property changed... +	my @tickets = split "\n", $tickets; +	my @known_parents; +	for my $ticket ( @tickets ) { +		my ($uuid, $path, $rev) = split /:/, $ticket; +		if ( $uuid eq $self->ra_uuid ) { +			my $url = $self->rewrite_root || $self->{url}; +			my $repos_root = $url; +			my $branch_from = $path; +			$branch_from =~ s{^/}{}; +			my $gs = $self->other_gs($repos_root."/".$branch_from, +			                         $url, +			                         $branch_from, +			                         $rev, +			                         $self->{ref_id}); +			if ( my $commit = $gs->rev_map_get($rev, $uuid) ) { +				# wahey!  we found it, but it might be +				# an old one (!) +				push @known_parents, $commit; +			} +		} +	} +	for my $parent ( @known_parents ) { +		my @cmd = ('rev-list', $parent, map { "^$_" } @$parents ); +		my ($msg_fh, $ctx) = command_output_pipe(@cmd); +		my $new; +		while ( <$msg_fh> ) { +			$new=1;last; +		} +		command_close_pipe($msg_fh, $ctx); +		if ( $new ) { +			print STDERR +			    "Found merge parent (svk:merge ticket): $parent\n"; +			push @$parents, $parent; +		} +	} +} +  sub make_log_entry {  	my ($self, $rev, $parents, $ed) = @_;  	my $untracked = $self->get_untracked($ed); +	my @parents = @$parents; +	my $ps = $ed->{path_strip} || ""; +	for my $path ( grep { m/$ps/ } %{$ed->{dir_prop}} ) { +		my $props = $ed->{dir_prop}{$path}; +		if ( $props->{"svk:merge"} ) { +			$self->find_extra_svk_parents +				($ed, $props->{"svk:merge"}, \@parents); +		} +	} +  	open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;  	print $un "r$rev\n" or croak $!;  	print $un $_, "\n" foreach @$untracked; -	my %log_entry = ( parents => $parents || [], revision => $rev, +	my %log_entry = ( parents => \@parents, revision => $rev,  	                  log => '');  	my $headrev; | 
