Skip to content

Commit

Permalink
git-svn: ignore changeless commits when checking for a cherry-pick
Browse files Browse the repository at this point in the history
Update git-svn to ignore commits that do not change the tree when it is
deciding if an svn merge ticket represents a real branch merge or just a
cherry-pick.

Consider the following integration model in the svn repository:

   F---G  branch1
  /     \
 D  tag1 \   E  tag2
/         \ /
A---B      C  trunk

branch1 is merged to trunk in commit C.

With this patch, git-svn will correctly identify branch1 as a proper merge
parent, instead of incorrectly ignoring it as a cherry-pick.

Signed-off-by: Andrew Myrick <amyrick@apple.com>
Acked-by: Sam Vilain <sam@vilain.net>
Acked-by: Eric Wong <normalperson@yhbt.net>
  • Loading branch information
Andrew Myrick authored and Eric Wong committed Jan 23, 2010
1 parent aba7dea commit 1cef650
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -3052,12 +3052,36 @@ sub check_cherry_pick {
for my $range ( @ranges ) {
delete @commits{_rev_list($range)};
}
for my $commit (keys %commits) {
if (has_no_changes($commit)) {
delete $commits{$commit};
}
}
return (keys %commits);
}

sub has_no_changes {
my $commit = shift;

my @revs = split / /, command_oneline(
qw(rev-list --parents -1 -m), $commit);

# Commits with no parents, e.g. the start of a partial branch,
# have changes by definition.
return 1 if (@revs < 2);

# Commits with multiple parents, e.g a merge, have no changes
# by definition.
return 0 if (@revs > 2);

return (command_oneline("rev-parse", "$commit^{tree}") eq
command_oneline("rev-parse", "$commit~1^{tree}"));
}

BEGIN {
memoize 'lookup_svn_merge';
memoize 'check_cherry_pick';
memoize 'has_no_changes';
}

sub parents_exclude {
Expand Down

0 comments on commit 1cef650

Please sign in to comment.