Detect a cherry-pick merge if there's only one parent and the git-svn-id
metadata exists. Then, get the parent's mergeinfo and merge this commit's
mergeinfo.
---
git-svn.perl | 52 +++++++++++++++++++++++++++++++++++++--
t/t9161-git-svn-mergeinfo-push.sh | 30 ++++++++++++++++++++++
2 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index 9ddeaf4..b04cac7 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -698,12 +698,14 @@ sub populate_merge_info {
my %parentshash;
read_commit_parents(\%parentshash, $d);
my @parents = @{$parentshash{$d}};
+
+ my $rooturl = $gs->repos_root;
+ my ($target_branch) = $gs->full_pushurl =~ /^\Q$rooturl\E(.*)/;
+
if ($#parents > 0) {
# Merge commit
my $all_parents_ok = 1;
my $aggregate_mergeinfo = '';
- my $rooturl = $gs->repos_root;
- my ($target_branch) = $gs->full_pushurl =~ /^\Q$rooturl\E(.*)/;
if (defined($rewritten_parent)) {
# Replace first parent with newly-rewritten version
@@ -785,6 +787,52 @@ sub populate_merge_info {
if ($all_parents_ok and $aggregate_mergeinfo) {
return $aggregate_mergeinfo;
}
+ } elsif ($#parents == 0) {
+ # cherry-pick merge
+ my ($cherry_branchurl, $cherry_svnrev, $cherry_paruuid) =
+ cmt_metadata($d);
+
+ if(defined $cherry_branchurl && defined $cherry_svnrev &&
defined $cherry_paruuid)
+ {
+ if (defined($rewritten_parent)) {
+ # Replace first parent with newly-rewritten
version
+ shift @parents;
+ unshift @parents, $rewritten_parent;
+ }
+
+ my $aggregate_mergeinfo = '';
+
+ # parent mergeinfo
+ my ($branchurl, $svnrev, $paruuid) =
+ cmt_metadata($parents[0]);
+
+ my $ra = Git::SVN::Ra->new($branchurl);
+ my (undef, undef, $props) =
+ $ra->get_dir(canonicalize_path("."), $svnrev);
+ my $parent_mergeinfo = $props->{'svn:mergeinfo'};
+ unless (defined $parent_mergeinfo) {
+ $parent_mergeinfo = '';
+ }
+
+ $aggregate_mergeinfo =
merge_merge_info($aggregate_mergeinfo,
+ $parent_mergeinfo,
+ $target_branch);
+
+ # cherry-pick mergeinfo
+ unless ($cherry_branchurl =~ /^\Q$rooturl\E(.*)/) {
+ fatal "commit $d git-svn metadata changed
mid-run!";
+ }
+ my $cherry_branchpath = $1;
+
+ my $cherry_pick_mergeinfo =
canonicalize_path("$cherry_branchpath")
+ . ":$cherry_svnrev";
+
+ $aggregate_mergeinfo =
merge_merge_info($aggregate_mergeinfo,
+ $cherry_pick_mergeinfo,
+ $target_branch);
+
+ return $aggregate_mergeinfo;
+ }
}
return undef;
diff --git a/t/t9161-git-svn-mergeinfo-push.sh
b/t/t9161-git-svn-mergeinfo-push.sh
index 1eab701..f348392 100755
--- a/t/t9161-git-svn-mergeinfo-push.sh
+++ b/t/t9161-git-svn-mergeinfo-push.sh
@@ -91,6 +91,36 @@ test_expect_success 'check reintegration mergeinfo' '
/branches/svnb5:6,11"
'
+test_expect_success 'make further commits to branch' '
+ git checkout svnb2 &&
+ touch newb2file-3 &&
+ git add newb2file-3 &&
+ git commit -m "later b2 commit 3" &&
+ touch newb2file-4 &&
+ git add newb2file-4 &&
+ git commit -m "later b2 commit 4" &&
+ touch newb2file-5 &&
+ git add newb2file-5 &&
+ git commit -m "later b2 commit 5" &&
+ git svn dcommit
+ '
+
+test_expect_success 'cherry-pick merge' '
+ git checkout svnb1 &&
+ git cherry-pick svnb2 &&
+ git cherry-pick svnb2^ &&
+ git cherry-pick svnb2^^ &&
+ git svn dcommit
+ '
+
+test_expect_success 'check cherry-pick mergeinfo' '
+ mergeinfo=$(svn_cmd propget svn:mergeinfo "$svnrepo"/branches/svnb1)
+ test "$mergeinfo" = "/branches/svnb2:3,8,16-17,20-22
+/branches/svnb3:4,9
+/branches/svnb4:5-6,10-12
+/branches/svnb5:6,11"
+ '
+
test_expect_success 'dcommit a merge at the top of a stack' '
git checkout svnb1 &&
touch anotherfile &&
--
1.8.5.rc3.5.g96ccada
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html