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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to