From b9dffd8cad737a07d6a05503318c6746ac593f9c Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Fri, 9 Feb 2007 01:28:30 -0800
Subject: [PATCH] git-svn: --follow-parent tracks multi-parent paths

We can have a branch that was deleted, then re-added under the
same name but copied from another path, in which case we'll have
multiple parents (we don't want to break the original ref, nor
lose copypath info).

Add a test for this, too, of course.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 git-svn.perl                     | 14 +++++++++++---
 t/t9104-git-svn-follow-parent.sh |  7 +++++++
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/git-svn.perl b/git-svn.perl
index 21d53054f6..cd35efec7e 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -1266,11 +1266,19 @@ sub do_fetch {
 	my ($self, $paths, $rev) = @_;
 	my $ed;
 	my ($last_rev, @parents);
-	if ($self->last_commit) {
+	if (my $lc = $self->last_commit) {
+		# we can have a branch that was deleted, then re-added
+		# under the same name but copied from another path, in
+		# which case we'll have multiple parents (we don't
+		# want to break the original ref, nor lose copypath info):
+		if (my $log_entry = $self->find_parent_branch($paths, $rev)) {
+			push @{$log_entry->{parents}}, $lc;
+			return $log_entry;
+		}
 		$ed = SVN::Git::Fetcher->new($self);
 		$last_rev = $self->{last_rev};
-		$ed->{c} = $self->{last_commit};
-		@parents = ($self->{last_commit});
+		$ed->{c} = $lc;
+		@parents = ($lc);
 	} else {
 		$last_rev = $rev;
 		if (my $log_entry = $self->find_parent_branch($paths, $rev)) {
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index eebb84974c..f5b7e5efe0 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -146,6 +146,13 @@ test_expect_success "track initial change if it was only made to parent" "
 	     \"\`git rev-parse r9270-d~1\`\"
 	"
 
+test_expect_success "track multi-parent paths" "
+	svn cp -m 'resurrect /glob' $svnrepo/r9270 $svnrepo/glob &&
+	git-svn multi-fetch --follow-parent &&
+	test \`git cat-file commit refs/remotes/glob | \
+	       grep '^parent ' | wc -l\` -eq 2
+	"
+
 test_expect_success "multi-fetch continues to work" "
 	git-svn multi-fetch --follow-parent
 	"
-- 
2.40.0