зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
a5e9c7dfe4
Коммит
f1264bd654
52
git-svn.perl
52
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;
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2007 Sam Vilain
|
||||
#
|
||||
|
||||
test_description='git-svn svk merge tickets'
|
||||
|
||||
. ./lib-git-svn.sh
|
||||
|
||||
test_expect_success 'load svk depot' "
|
||||
svnadmin load -q '$rawsvnrepo' < '../t9150/svk-merge.dump' &&
|
||||
git svn init --minimize-url -R svkmerge \
|
||||
-T trunk -b branches '$svnrepo' &&
|
||||
git svn fetch --all
|
||||
"
|
||||
|
||||
uuid=b48289b2-9c08-4d72-af37-0358a40b9c15
|
||||
|
||||
test_expect_success 'svk merges were represented coming in' "
|
||||
[ `git-cat-file commit HEAD | grep parent | wc -l` -eq 2 ]
|
||||
"
|
||||
|
||||
test_done
|
Загрузка…
Ссылка в новой задаче