From ce2a0f2f9d9fd8eee8eaa1f24a60bdafade80c24 Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Sun, 28 Jan 2007 21:34:23 -0800
Subject: [PATCH] git-svn: stop using path names as refnames with
 --follow-parent

Using path names as refnames breaks horribly if a user is
tracking one large, toplevel directory, and a lower-level
directory is followed from another project is a parent
of another ref, as it will cause refnames such as:
'refs/remotes/trunk/path/to/stuff', which will conflict
with a refname of 'refs/remotes/trunk'.

Now we just append @$revno to the end of it the current
refname.  And if we have followed back to a grandparent, then
we'll strip any existing '@$parent_revno' strings before
appending our own '@$revno' string to it.

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

diff --git a/git-svn.perl b/git-svn.perl
index dcc7fd4603..4f7938ab7e 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -1135,10 +1135,12 @@ sub find_parent_branch {
 		last if $gs;
 	}
 	unless ($gs) {
-		my $ref_id = $branch_from;
-		$ref_id .= "\@$r" if find_ref($ref_id);
+		my $ref_id = $self->{ref_id};
+		$ref_id =~ s/\@\d+$//;
+		$ref_id .= "\@$r";
 		# just grow a tail if we're not unique enough :x
 		$ref_id .= '-' while find_ref($ref_id);
+		print STDERR "Initializing parent: $ref_id\n";
 		$gs = Git::SVN->init($new_url, '', $ref_id, $ref_id);
 	}
 	my ($r0, $parent) = $gs->find_rev_before($r, 1);
diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh
index 6d243f8488..0f4e736271 100755
--- a/t/t9104-git-svn-follow-parent.sh
+++ b/t/t9104-git-svn-follow-parent.sh
@@ -30,10 +30,12 @@ test_expect_success 'initialize repo' "
 test_expect_success 'init and fetch --follow-parent a moved directory' "
 	git-svn init -i thunk $svnrepo/thunk &&
 	git-svn fetch --follow-parent -i thunk &&
-	test \"\`git-rev-parse --verify refs/remotes/trunk\`\" \
+	test \"\`git-rev-parse --verify refs/remotes/thunk@2\`\" \
            = \"\`git-rev-parse --verify refs/remotes/thunk~1\`\" &&
         test \"\`git-cat-file blob refs/remotes/thunk:readme |\
-                 sed -n -e '3p'\`\" = goodbye
+                 sed -n -e '3p'\`\" = goodbye &&
+	test -n \"\`git-config --get svn-remote.git-svn.fetch \
+	         '^trunk:refs/remotes/thunk@2$'\`\"
 	"
 
 test_expect_success 'init and fetch from one svn-remote' "
-- 
2.40.0