Skip to content

Commit f1264bd

Browse files
Sam VilainEric Wong
authored andcommitted
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>
1 parent a5e9c7d commit f1264bd

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

git-svn.perl

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2878,14 +2878,64 @@ sub check_author {
28782878
$author;
28792879
}
28802880

2881+
sub find_extra_svk_parents {
2882+
my ($self, $ed, $tickets, $parents) = @_;
2883+
# aha! svk:merge property changed...
2884+
my @tickets = split "\n", $tickets;
2885+
my @known_parents;
2886+
for my $ticket ( @tickets ) {
2887+
my ($uuid, $path, $rev) = split /:/, $ticket;
2888+
if ( $uuid eq $self->ra_uuid ) {
2889+
my $url = $self->rewrite_root || $self->{url};
2890+
my $repos_root = $url;
2891+
my $branch_from = $path;
2892+
$branch_from =~ s{^/}{};
2893+
my $gs = $self->other_gs($repos_root."/".$branch_from,
2894+
$url,
2895+
$branch_from,
2896+
$rev,
2897+
$self->{ref_id});
2898+
if ( my $commit = $gs->rev_map_get($rev, $uuid) ) {
2899+
# wahey! we found it, but it might be
2900+
# an old one (!)
2901+
push @known_parents, $commit;
2902+
}
2903+
}
2904+
}
2905+
for my $parent ( @known_parents ) {
2906+
my @cmd = ('rev-list', $parent, map { "^$_" } @$parents );
2907+
my ($msg_fh, $ctx) = command_output_pipe(@cmd);
2908+
my $new;
2909+
while ( <$msg_fh> ) {
2910+
$new=1;last;
2911+
}
2912+
command_close_pipe($msg_fh, $ctx);
2913+
if ( $new ) {
2914+
print STDERR
2915+
"Found merge parent (svk:merge ticket): $parent\n";
2916+
push @$parents, $parent;
2917+
}
2918+
}
2919+
}
2920+
28812921
sub make_log_entry {
28822922
my ($self, $rev, $parents, $ed) = @_;
28832923
my $untracked = $self->get_untracked($ed);
28842924

2925+
my @parents = @$parents;
2926+
my $ps = $ed->{path_strip} || "";
2927+
for my $path ( grep { m/$ps/ } %{$ed->{dir_prop}} ) {
2928+
my $props = $ed->{dir_prop}{$path};
2929+
if ( $props->{"svk:merge"} ) {
2930+
$self->find_extra_svk_parents
2931+
($ed, $props->{"svk:merge"}, \@parents);
2932+
}
2933+
}
2934+
28852935
open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
28862936
print $un "r$rev\n" or croak $!;
28872937
print $un $_, "\n" foreach @$untracked;
2888-
my %log_entry = ( parents => $parents || [], revision => $rev,
2938+
my %log_entry = ( parents => \@parents, revision => $rev,
28892939
log => '');
28902940

28912941
my $headrev;

t/t9150-svk-mergetickets.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/sh
2+
#
3+
# Copyright (c) 2007 Sam Vilain
4+
#
5+
6+
test_description='git-svn svk merge tickets'
7+
8+
. ./lib-git-svn.sh
9+
10+
test_expect_success 'load svk depot' "
11+
svnadmin load -q '$rawsvnrepo' < '../t9150/svk-merge.dump' &&
12+
git svn init --minimize-url -R svkmerge \
13+
-T trunk -b branches '$svnrepo' &&
14+
git svn fetch --all
15+
"
16+
17+
uuid=b48289b2-9c08-4d72-af37-0358a40b9c15
18+
19+
test_expect_success 'svk merges were represented coming in' "
20+
[ `git-cat-file commit HEAD | grep parent | wc -l` -eq 2 ]
21+
"
22+
23+
test_done

0 commit comments

Comments
 (0)