All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ilya Basin <basinilya@gmail.com>
To: Git mailing list <git@vger.kernel.org>
Cc: Eric Wong <normalperson@yhbt.net>
Subject: [PATCH 1/3] git-svn: fix occasional "Failed to strip path" error on fetch next commit, try #2
Date: Mon, 29 Apr 2013 00:10:35 +0400	[thread overview]
Message-ID: <188302397.20130429001035@gmail.com> (raw)

When --stdlayout and --preserve-empty-dirs flags are used and a
directory becomes empty, two things happen:

Sometimes find_empty_directories() returns empty list and no empty dir
placeholder file created. This happens, because find_empty_directories()
marks all directories as non-empty, if at least one updated directory is
non-empty.

Sometimes git-svn dies with "Failed to strip path" error. This happens,
because find_empty_directories() returns git paths and
add_placeholder_file() expects svn paths
---
 perl/Git/SVN/Fetcher.pm                | 12 ++++++++----
 t/t9160-git-svn-preserve-empty-dirs.sh | 18 +++++++++++++-----
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
index 046a7a2..4f96076 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/perl/Git/SVN/Fetcher.pm
@@ -129,6 +129,7 @@ sub is_path_ignored {
 
 sub set_path_strip {
 	my ($self, $path) = @_;
+	$self->{pathprefix_strip} = length $path ? ($path . "/") : "";
 	$self->{path_strip} = qr/^\Q$path\E(\/|$)/ if length $path;
 }
 
@@ -458,9 +459,12 @@ sub find_empty_directories {
 		my $skip_added = 0;
 		foreach my $t (qw/dir_prop file_prop/) {
 			foreach my $path (keys %{ $self->{$t} }) {
-				if (exists $self->{$t}->{dirname($path)}) {
-					$skip_added = 1;
-					last;
+				if (length $self->git_path($path)) {
+					$path = dirname($path);
+					if ($dir eq $self->git_path($path) && exists $self->{$t}->{$path}) {
+						$skip_added = 1;
+						last;
+					}
 				}
 			}
 			last if $skip_added;
@@ -477,7 +481,7 @@ sub find_empty_directories {
 		delete $files{$_} foreach (@deleted_gpath);
 
 		# Report the directory if there are no filenames left.
-		push @empty_dirs, $dir unless (scalar %files);
+		push @empty_dirs, ($self->{pathprefix_strip} . $dir) unless (scalar %files);
 	}
 	@empty_dirs;
 }
diff --git a/t/t9160-git-svn-preserve-empty-dirs.sh b/t/t9160-git-svn-preserve-empty-dirs.sh
index b4a4434..1b5a286 100755
--- a/t/t9160-git-svn-preserve-empty-dirs.sh
+++ b/t/t9160-git-svn-preserve-empty-dirs.sh
@@ -51,13 +51,21 @@ test_expect_success 'initialize source svn repo containing empty dirs' '
 		echo "Conflict file" > 5/.placeholder &&
 		mkdir 6/.placeholder &&
 		svn_cmd add 5/.placeholder 6/.placeholder &&
-		svn_cmd commit -m "Placeholder Namespace conflict"
+		svn_cmd commit -m "Placeholder Namespace conflict" &&
+
+		echo x > fil.txt &&
+		svn_cmd add fil.txt &&
+		svn_cmd commit -m "this commit should not kill git-svn"
 	) &&
 	rm -rf "$SVN_TREE"
 '
 
-test_expect_success 'clone svn repo with --preserve-empty-dirs' '
-	git svn clone "$svnrepo"/trunk --preserve-empty-dirs "$GIT_REPO"
+test_expect_success 'clone svn repo with --preserve-empty-dirs --stdlayout' '
+	git svn clone "$svnrepo" --preserve-empty-dirs --stdlayout "$GIT_REPO" || (
+		cd "$GIT_REPO"
+		git svn fetch # fetch the rest can succeed even if clone failed
+		false # this test still failed
+	)
 '
 
 # "$GIT_REPO"/1 should only contain the placeholder file.
@@ -81,11 +89,11 @@ test_expect_success 'add entry to previously empty directory' '
 	test -f "$GIT_REPO"/4/a/b/c/foo
 '
 
-# The HEAD~2 commit should not have introduced .gitignore placeholder files.
+# The HEAD~3 commit should not have introduced .gitignore placeholder files.
 test_expect_success 'remove non-last entry from directory' '
 	(
 		cd "$GIT_REPO" &&
-		git checkout HEAD~2
+		git checkout HEAD~3
 	) &&
 	test_must_fail test -f "$GIT_REPO"/2/.gitignore &&
 	test_must_fail test -f "$GIT_REPO"/3/.gitignore
-- 
1.8.1.5

                 reply	other threads:[~2013-04-28 20:12 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=188302397.20130429001035@gmail.com \
    --to=basinilya@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.