From: Alex Vandiver Date: Sun, 29 Nov 2009 07:46:49 GMT Subject: Re: git-svn: SVK merge commits can have >2 parents Message-ID: <1259480367-sup-6891@utwig> In-Reply-To: <1259479636-sup-573@utwig> At Sun Nov 29 02:28:39 -0500 2009, Alex Vandiver wrote: > While converting a mildly complicated svn repository that was managed > with SVK, I ran across the following oddness. `svk smerge` can only > merge between _two_ branches at once -- however, the way that svk > merge detection works, you can end up with erroneous extra parents > from long-dead branches. Upon a little more inspection, I now understand that the rev-parse lines in find_extra_svk_parents are attempting to deal with this exact circumstance -- but they fail to properly sort the merge tickets first, which leads to this incorrect behavior. Armed with this understanding, I'm more confident in the attached updated patch. I assume, however, that the logic allows for more than one extra parent only because such an occurrance could be constructed by hand-editing svk:merge, because AFAIK svk's command-line tools should be able to construct such a circumstance. - Alex -- Networking -- only one letter away from not working From 4d30e57e5da7c2e880908bc742cf80990d6f9f5d Mon Sep 17 00:00:00 2001 From: Alex Vandiver Date: Sun, 29 Nov 2009 02:20:21 -0500 Subject: [PATCH] git-svn: sort svk merge tickets to account for minimal parents When merging branches based on svk:merge properties, a single merge can have updated or added multiple svk:merge lines. Attempt to include the minimal set of parents by sorting the merge properties in order of revision, highest to lowest. Signed-off-by: Alex Vandiver --- git-svn.perl | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index 957d44e..51f03ad 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -2940,10 +2940,14 @@ sub find_extra_svk_parents { if ( my $commit = $gs->rev_map_get($rev, $uuid) ) { # wahey! we found it, but it might be # an old one (!) - push @known_parents, $commit; + push @known_parents, [ $rev, $commit ]; } } } + # Ordering matters; highest-numbered commit merge tickets + # first, as they may account for later merge ticket additions + # or changes. + @known_parents = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @known_parents; for my $parent ( @known_parents ) { my @cmd = ('rev-list', $parent, map { "^$_" } @$parents ); my ($msg_fh, $ctx) = command_output_pipe(@cmd); -- 1.6.6.rc0.254.g7352d