Skip to content

Commit

Permalink
git-svn: fix --rmdir when using SVN:: libraries
Browse files Browse the repository at this point in the history
When tracking directories with nearly all of its files at
the most nested levels, --rmdir would accidentally go too
far when deleting.

Of course, we'll add a test for this condition, too.

Makefile: automatically run new tests as they appear in t/

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Eric Wong authored and Junio C Hamano committed Jun 20, 2006
1 parent d281786 commit c07eee1
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 6 deletions.
3 changes: 1 addition & 2 deletions contrib/git-svn/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ git-svn.html : git-svn.txt
asciidoc -b xhtml11 -d manpage \
-f ../../Documentation/asciidoc.conf $<
test: git-svn
cd t && $(SHELL) ./t0000-contrib-git-svn.sh $(TEST_FLAGS)
cd t && $(SHELL) ./t0001-contrib-git-svn-props.sh $(TEST_FLAGS)
cd t && for i in t????-*.sh; do $(SHELL) ./$$i $(TEST_FLAGS); done

# we can test NO_OPTIMIZE_COMMITS independently of LC_ALL
full-test:
Expand Down
15 changes: 11 additions & 4 deletions contrib/git-svn/git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -2841,13 +2841,20 @@ sub rmdirs {
exec qw/git-ls-tree --name-only -r -z/, $self->{c} or croak $!;
}
local $/ = "\0";
my @svn_path = split m#/#, $self->{svn_path};
while (<$fh>) {
chomp;
$_ = $self->{svn_path} . '/' . $_;
my ($dn) = ($_ =~ m#^(.*?)/?(?:[^/]+)$#);
delete $rm->{$dn};
last unless %$rm;
my @dn = (@svn_path, (split m#/#, $_));
while (pop @dn) {
delete $rm->{join '/', @dn};
}
unless (%$rm) {
close $fh;
return;
}
}
close $fh;

my ($r, $p, $bat) = ($self->{r}, $self->{pool}, $self->{bat});
foreach my $d (sort { $b =~ tr#/#/# <=> $a =~ tr#/#/# } keys %$rm) {
$self->close_directory($bat->{$d}, $p);
Expand Down
29 changes: 29 additions & 0 deletions contrib/git-svn/t/t0002-deep-rmdir.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
test_description='git-svn rmdir'
. ./lib-git-svn.sh

test_expect_success 'initialize repo' "
mkdir import &&
cd import &&
mkdir -p deeply/nested/directory/number/1 &&
mkdir -p deeply/nested/directory/number/2 &&
echo foo > deeply/nested/directory/number/1/file &&
echo foo > deeply/nested/directory/number/2/another &&
svn import -m 'import for git-svn' . $svnrepo &&
cd ..
"

test_expect_success 'mirror via git-svn' "
git-svn init $svnrepo &&
git-svn fetch &&
git checkout -f -b test-rmdir remotes/git-svn
"

test_expect_success 'Try a commit on rmdir' "
git rm -f deeply/nested/directory/number/2/another &&
git commit -a -m 'remove another' &&
git-svn commit --rmdir HEAD &&
svn ls -R $svnrepo | grep ^deeply/nested/directory/number/1
"


test_done

0 comments on commit c07eee1

Please sign in to comment.