git svn: make empty directory creation gc-aware
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>maint
parent
94058a90cf
commit
a5b80d9263
47
git-svn.perl
47
git-svn.perl
|
@ -2740,21 +2740,44 @@ sub do_fetch {
|
||||||
|
|
||||||
sub mkemptydirs {
|
sub mkemptydirs {
|
||||||
my ($self, $r) = @_;
|
my ($self, $r) = @_;
|
||||||
my %empty_dirs = ();
|
|
||||||
|
|
||||||
open my $fh, '<', "$self->{dir}/unhandled.log" or return;
|
sub scan {
|
||||||
binmode $fh or croak "binmode: $!";
|
my ($r, $empty_dirs, $line) = @_;
|
||||||
while (<$fh>) {
|
if (defined $r && $line =~ /^r(\d+)$/) {
|
||||||
if (defined $r && /^r(\d+)$/) {
|
return 0 if $1 > $r;
|
||||||
last if $1 > $r;
|
} elsif ($line =~ /^ \+empty_dir: (.+)$/) {
|
||||||
} elsif (/^ \+empty_dir: (.+)$/) {
|
$empty_dirs->{$1} = 1;
|
||||||
$empty_dirs{$1} = 1;
|
} elsif ($line =~ /^ \-empty_dir: (.+)$/) {
|
||||||
} elsif (/^ \-empty_dir: (.+)$/) {
|
my @d = grep {m[^\Q$1\E(/|$)]} (keys %$empty_dirs);
|
||||||
my @d = grep {m[^\Q$1\E(/|$)]} (keys %empty_dirs);
|
delete @$empty_dirs{@d};
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close $fh;
|
|
||||||
|
if (open my $fh, '<', "$self->{dir}/unhandled.log") {
|
||||||
|
binmode $fh or croak "binmode: $!";
|
||||||
|
while (<$fh>) {
|
||||||
|
scan($r, \%empty_dirs, $_) or last;
|
||||||
|
}
|
||||||
|
close $fh;
|
||||||
|
}
|
||||||
|
|
||||||
my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/;
|
my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/;
|
||||||
foreach my $d (sort keys %empty_dirs) {
|
foreach my $d (sort keys %empty_dirs) {
|
||||||
|
|
|
@ -114,5 +114,29 @@ test_expect_success 'removed top-level directory does not exist' '
|
||||||
test ! -e removed/d
|
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
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue