threads / patch / 17707

patchtest case for regression caused by git-svn empty symlink fix

Subject: [PATCH] test case for regression caused by git-svn empty symlink fix

## tl;dr

4 messages between Feb 10, 2009 and Feb 11, 2009. Diffs are folded; open one to read it.

replies: 3people: 3as markdown or json

Anton Gyllenberg· Feb 10, 2009, 22:38 UTC · lore

Commit dbc6c74d0858d77e61e092a48d467e725211f8e9 "git-svn: handle empty files marked as symlinks in SVN" caused a regression in an unusual case where a branch has been created in SVN, later deleted and then created again from another branch point and the original branch point had empty files not in the new branch. In some cases git svn fetch will then fail while trying to fetch the empty file from the wrong SVN revision.

This adds a test case that reproduces the issue.
Signed-off-by: Anton Gyllenberg <anton@iki.fi>
---
 t/t9135-git-svn-moved-branch-empty-file.sh |   11 ++
 t/t9135/svn.dump                           |  192 ++++++++++++++++++++++++++++
 2 files changed, 203 insertions(+), 0 deletions(-)
 create mode 100755 t/t9135-git-svn-moved-branch-empty-file.sh
 create mode 100644 t/t9135/svn.dump
Show changes to 2 files +203 −0

t/t9135-git-svn-moved-branch-empty-file.sh, t/t9135/svn.dump

diff --git a/t/t9135-git-svn-moved-branch-empty-file.sh
b/t/t9135-git-svn-moved-branch-empty-file.sh
new file mode 100755
index 0000000..903575a
--- /dev/null
+++ b/t/t9135-git-svn-moved-branch-empty-file.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+test_description='test moved svn branch with missing empty files'
+
+. ./lib-git-svn.sh
+test_expect_success 'load svn dumpfile'  '
+	svnadmin load "$rawsvnrepo" < "${TEST_DIRECTORY}/t9135/svn.dump"
+	'
+
+test_expect_success 'clone using git svn' 'git svn clone -s "$svnrepo" x'
+test_done
diff --git a/t/t9135/svn.dump b/t/t9135/svn.dump
new file mode 100644
index 0000000..b51c0cc
--- /dev/null
+++ b/t/t9135/svn.dump
@@ -0,0 +1,192 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 1f80e919-e9e3-4d80-a3ae-d9f21095e27b
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2009-02-10T19:23:16.424027Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 123
+Content-length: 123
+
+K 7
+svn:log
+V 20
+init standard layout
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:17.195072Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 121
+Content-length: 121
+
+K 7
+svn:log
+V 18
+branch-b off trunk
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:19.160095Z
+PROPS-END
+
+Node-path: branches/branch-b
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 1
+Node-copyfrom-path: trunk
+Prop-content-length: 34
+Content-length: 34
+
+K 13
+svn:mergeinfo
+V 0
+
+PROPS-END
+
+
+Revision-number: 3
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 17
+add empty file b1
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:20.194568Z
+PROPS-END
+
+Node-path: branches/branch-b/b1
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 0
+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 4
+Prop-content-length: 110
+Content-length: 110
+
+K 7
+svn:log
+V 8
+branch-c
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:21.169100Z
+PROPS-END
+
+Node-path: branches/branch-c
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 3
+Node-copyfrom-path: trunk
+
+
+Revision-number: 5
+Prop-content-length: 126
+Content-length: 126
+
+K 7
+svn:log
+V 23
+oops, wrong branchpoint
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:21.253557Z
+PROPS-END
+
+Node-path: branches/branch-c
+Node-action: delete
+
+
+Revision-number: 6
+Prop-content-length: 127
+Content-length: 127
+
+K 7
+svn:log
+V 24
+branch-c off of branch-b
+K 10
+svn:author
+V 8
+john.doe
+K 8
+svn:date
+V 27
+2009-02-10T19:23:21.314659Z
+PROPS-END
+
+Node-path: branches/branch-c
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: branches/branch-b
+Prop-content-length: 34
+Content-length: 34
+
+K 13
+svn:mergeinfo
+V 0
+
+PROPS-END
+
+
-- 
1.6.2.rc0
Eric Wong· Feb 11, 2009, 10:12 UTC · re: Anton Gyllenberg · lore

[PATCH] git-svn: fix broken symlink workaround when switching branches

Thanks to Anton Gyllenberg <anton@iki.fi> for the bug report (and testcase in the following commit):

Show 8 quoted lines
> Commit dbc6c74d0858d77e61e092a48d467e725211f8e9 "git-svn:
> handle empty files marked as symlinks in SVN" caused a
> regression in an unusual case where a branch has been created
> in SVN, later deleted and then created again from another
> branch point and the original branch point had empty files not
> in the new branch. In some cases git svn fetch will then fail
> while trying to fetch the empty file from the wrong SVN
> revision.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 Thanks Anton, I've made the following patch along with your
 testcase and pushed to git://git.bogomips.org/git-svn
 Can you let me know if it works on a real repo (or breaks anything
 else)?  It's once again way past my bed time...
 git-svn.perl |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
Show changes to git-svn.perl +6 −5
diff --git a/git-svn.perl b/git-svn.perl
index 9baf822..001a1d8 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -2417,7 +2417,7 @@ sub find_parent_branch {
 			# is not included with SVN 1.4.3 (the latest version
 			# at the moment), so we can't rely on it
 			$self->{last_commit} = $parent;
-			$ed = SVN::Git::Fetcher->new($self);
+			$ed = SVN::Git::Fetcher->new($self, $gs->{path});
 			$gs->ra->gs_do_switch($r0, $rev, $gs,
 					      $self->full_url, $ed)
 			  or die "SVN connection failed somewhere...\n";
@@ -3258,12 +3258,13 @@ use vars qw/$_ignore_regex/;
 
 # file baton members: path, mode_a, mode_b, pool, fh, blob, base
 sub new {
-	my ($class, $git_svn) = @_;
+	my ($class, $git_svn, $switch_path) = @_;
 	my $self = SVN::Delta::Editor->new;
 	bless $self, $class;
 	if (exists $git_svn->{last_commit}) {
 		$self->{c} = $git_svn->{last_commit};
-		$self->{empty_symlinks} = _mark_empty_symlinks($git_svn);
+		$self->{empty_symlinks} =
+		                  _mark_empty_symlinks($git_svn, $switch_path);
 	}
 	$self->{empty} = {};
 	$self->{dir_prop} = {};
@@ -3278,7 +3279,7 @@ sub new {
 # not inside them (when the Git::SVN::Fetcher object is passed) to
 # do_{switch,update}
 sub _mark_empty_symlinks {
-	my ($git_svn) = @_;
+	my ($git_svn, $switch_path) = @_;
 	my $bool = Git::config_bool('svn.brokenSymlinkWorkaround');
 	return {} if (defined($bool) && ! $bool);
 
@@ -3294,7 +3295,7 @@ sub _mark_empty_symlinks {
 	chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`);
 	my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt);
 	local $/ = "\0";
-	my $pfx = $git_svn->{path};
+	my $pfx = defined($switch_path) ? $switch_path : $git_svn->{path};
 	$pfx .= '/' if length($pfx);
 	while (<$ls>) {
 		chomp;
-- 
Eric Wong
Anton Gyllenberg· Feb 11, 2009, 17:44 UTC · re: Eric Wong · lore

Re: [PATCH] git-svn: fix broken symlink workaround when switching branches

On Wed, Feb 11, 2009 at 12:12 PM, Eric Wong <normalperson@yhbt.net> wrote:
Show 8 quoted lines
>  Thanks Anton, I've made the following patch along with your
>  testcase and pushed to git://git.bogomips.org/git-svn
>
>  Can you let me know if it works on a real repo (or breaks anything
>  else)?  It's once again way past my bed time...
>
>  git-svn.perl |   11 ++++++-----
>  1 files changed, 6 insertions(+), 5 deletions(-)

I checked out that version and it works perfectly on the real repo I initially noticed the problem on. The end results are identical to git-svn from v1.6.0.4 (predates the symlink scan) when fetching 2000+ revisions spanning the problematic branch messup. Works and did not break anything for me.

Thank you for your work on git-svn! Anton

Junio C Hamano· Feb 11, 2009, 18:41 UTC · re: Eric Wong · lore

Re: [PATCH] git-svn: fix broken symlink workaround when switching branches

Eric Wong <normalperson@yhbt.net> writes:
>  Thanks Anton, I've made the following patch along with your
>  testcase and pushed to git://git.bogomips.org/git-svn
Thanks; I'll pull.

← back to recent threads