@matheusbsbs / matheus-bagliano / commits / f1264bd654
Fork 0

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>

Sam Vilain committed Oct 20, 2009 at 15:42 UTC f1264bd65451a68e87e0f99c9601cfa1b3244db6
2 files changed +74 -1
git-svn.perl
+51 -1
@@ -2878,14 +2878,64 @@ sub check_author {
2878 $author;
2879 }
2880
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 +
2921 sub make_log_entry {
2922 my ($self, $rev, $parents, $ed) = @_;
2923 my $untracked = $self->get_untracked($ed);
2924
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 +
2935 open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
2936 print $un "r$rev\n" or croak $!;
2937 print $un $_, "\n" foreach @$untracked;
2888 - my %log_entry = ( parents => $parents || [], revision => $rev,
2938 + my %log_entry = ( parents => \@parents, revision => $rev,
2939 log => '');
2940
2941 my $headrev;
t/t9150-svk-mergetickets.sh new
+23
@@ -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