Skip to content

Commit

Permalink
git svn: make empty directory creation gc-aware
Browse files Browse the repository at this point in the history
The "git svn gc" command creates and appends to unhandled.log.gz
files which should be parsed before the uncompressed
unhandled.log files.

Reported-by: Robert Zeh
Signed-off-by: Eric Wong <normalperson@yhbt.net>
  • Loading branch information
Eric Wong committed Dec 19, 2009
1 parent 94058a9 commit a5b80d9
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 11 deletions.
45 changes: 34 additions & 11 deletions git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -2740,21 +2740,44 @@ sub do_fetch {

sub mkemptydirs {
my ($self, $r) = @_;

sub scan {
my ($r, $empty_dirs, $line) = @_;
if (defined $r && $line =~ /^r(\d+)$/) {
return 0 if $1 > $r;
} elsif ($line =~ /^ \+empty_dir: (.+)$/) {
$empty_dirs->{$1} = 1;
} elsif ($line =~ /^ \-empty_dir: (.+)$/) {
my @d = grep {m[^\Q$1\E(/|$)]} (keys %$empty_dirs);
delete @$empty_dirs{@d};
}
1; # continue
};
my %empty_dirs = ();
my $gz_file = "$self->{dir}/unhandled.log.gz";
if (-f $gz_file) {
if (!$can_compress) {
warn "Compress::Zlib could not be found; ",
"empty directories in $gz_file will not be read\n";
} else {
my $gz = Compress::Zlib::gzopen($gz_file, "rb") or
die "Unable to open $gz_file: $!\n";
my $line;
while ($gz->gzreadline($line) > 0) {
scan($r, \%empty_dirs, $line) or last;
}
$gz->gzclose;
}
}
open my $fh, '<', "$self->{dir}/unhandled.log" or return;
binmode $fh or croak "binmode: $!";
while (<$fh>) {
if (defined $r && /^r(\d+)$/) {
last if $1 > $r;
} elsif (/^ \+empty_dir: (.+)$/) {
$empty_dirs{$1} = 1;
} elsif (/^ \-empty_dir: (.+)$/) {
my @d = grep {m[^\Q$1\E(/|$)]} (keys %empty_dirs);
delete @empty_dirs{@d};
if (open my $fh, '<', "$self->{dir}/unhandled.log") {
binmode $fh or croak "binmode: $!";
while (<$fh>) {
scan($r, \%empty_dirs, $_) or last;
}
close $fh;
}
close $fh;
my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/;
foreach my $d (sort keys %empty_dirs) {
Expand Down
24 changes: 24 additions & 0 deletions t/t9146-git-svn-empty-dirs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -114,5 +114,29 @@ test_expect_success 'removed top-level directory does not exist' '
test ! -e removed/d
'
unhandled=.git/svn/refs/remotes/git-svn/unhandled.log
test_expect_success 'git svn gc-ed files work' '
(
cd removed &&
git svn gc &&
: Compress::Zlib may not be available &&
if test -f "$unhandled".gz
then
svn mkdir -m gz "$svnrepo"/gz &&
git reset --hard $(git rev-list HEAD | tail -1) &&
git svn rebase &&
test -f "$unhandled".gz &&
test -f "$unhandled" &&
for i in a b c "weird file name" gz "! !"
do
if ! test -d "$i"
then
echo >&2 "$i does not exist"
exit 1
fi
done
fi
)
'

test_done

0 comments on commit a5b80d9

Please sign in to comment.