Browse Source

git-svn: check_cherry_pick should exclude commits already in our history

The merge-base between @$parents and $merge_tip may have been reached
through a merge commit.  This means that some commits that are ancestors
of @$parents will not be ancestors of $merge_base.  The mergeinfo
property will not list commits that are ancestors of @$parents, so we
need to explicitly exclude them.

[ew: squashed and cleaned up test case from Steven]

Signed-off-by: Steven Walter <stevenrwalter@gmail.com>
Acked-by: Eric Wong <normalperson@yhbt.net>
maint
Steven Walter 15 years ago committed by Eric Wong
parent
commit
a3c75056dc
  1. 4
      git-svn.perl
  2. 50
      t/t9157-git-svn-fetch-merge.sh

4
git-svn.perl

@ -3118,9 +3118,10 @@ sub _rev_list { @@ -3118,9 +3118,10 @@ sub _rev_list {
sub check_cherry_pick {
my $base = shift;
my $tip = shift;
my $parents = shift;
my @ranges = @_;
my %commits = map { $_ => 1 }
_rev_list("--no-merges", $tip, "--not", $base);
_rev_list("--no-merges", $tip, "--not", $base, @$parents);
for my $range ( @ranges ) {
delete @commits{_rev_list($range)};
}
@ -3296,6 +3297,7 @@ sub find_extra_svn_parents { @@ -3296,6 +3297,7 @@ sub find_extra_svn_parents {
# double check that there are no missing non-merge commits
my (@incomplete) = check_cherry_pick(
$merge_base, $merge_tip,
$parents,
@$ranges,
);


50
t/t9157-git-svn-fetch-merge.sh

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
#!/bin/sh
#
# Copyright (c) 2010 Steven Walter
#

test_description='git svn merge detection'
. ./lib-git-svn.sh

test_expect_success 'initialize source svn repo' '
svn_cmd mkdir -m x "$svnrepo"/trunk &&
svn_cmd mkdir -m x "$svnrepo"/branches &&
svn_cmd co "$svnrepo"/trunk "$SVN_TREE" &&
(
cd "$SVN_TREE" &&
touch foo &&
svn add foo &&
svn commit -m "initial commit" &&
svn cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch1 &&
touch bar &&
svn add bar &&
svn commit -m x &&
svn cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch2 &&
svn switch "$svnrepo"/branches/branch1 &&
touch baz &&
svn add baz &&
svn commit -m x &&
svn switch "$svnrepo"/trunk &&
svn merge "$svnrepo"/branches/branch1 &&
svn commit -m "merge" &&
svn switch "$svnrepo"/branches/branch1 &&
svn commit -m x &&
svn switch "$svnrepo"/branches/branch2 &&
svn merge "$svnrepo"/branches/branch1 &&
svn commit -m "merge branch1" &&
svn switch "$svnrepo"/trunk &&
svn merge "$svnrepo"/branches/branch2 &&
svn resolved baz &&
svn commit -m "merge branch2"
) &&
rm -rf "$SVN_TREE"
'

test_expect_success 'clone svn repo' '
git svn init -s "$svnrepo" &&
git svn fetch
'

test_expect_success 'verify merge commit' 'git rev-parse HEAD^2'

test_done
Loading…
Cancel
Save