my @buf;
my $npurge = 0;
my @oids;
+ my ($done, $mark);
my $tree = $self->{-tree};
while (<$rd>) {
if (/^reset (?:.+)/) {
my $path = $1;
push @buf, $_ if $tree->{$path};
} elsif ($_ eq "\n") {
- my $out = join('', @buf);
- $out =~ s/^/# /sgm;
- warn "purge rewriting\n", $out, "\n";
- clean_purge_buffer(\@oids, \@buf);
- $out = join('', @buf);
+ if (@oids) {
+ my $out = join('', @buf);
+ $out =~ s/^/# /sgm;
+ warn "purge rewriting\n", $out, "\n";
+ clean_purge_buffer(\@oids, \@buf);
+ $npurge++;
+ }
$w->print(@buf, "\n") or wfail;
@buf = ();
- $npurge++;
+ } elsif ($_ eq "done\n") {
+ $done = 1;
+ } elsif (/^mark :(\d+)$/) {
+ push @buf, $_;
+ $mark = $1;
} else {
push @buf, $_;
}
if (@buf) {
$w->print(@buf) or wfail;
}
- $w = $r = undef;
+ die 'done\n not seen from fast-export' unless $done;
+ chomp(my $cmt = $self->get_mark(":$mark")) if $npurge;
+ $self->{nchg} = 0; # prevent _update_git_info until update-ref:
$self->done;
my @git = ('git', "--git-dir=$git->{git_dir}");
$err++;
}
}
+ _update_git_info($self, 0);
die "Failed to purge $err object(s)\n" if $err;
+ $cmt;
}
1;
my ($self, $purge) = @_; # $purge = { $object_id => 1, ... }
$self->done;
my $pfx = "$self->{-inbox}->{mainrepo}/git";
+ my $purges = [];
foreach my $i (0..$self->{max_git}) {
my $git = PublicInbox::Git->new("$pfx/$i.git");
my $im = $self->import_init($git, 0);
- $im->purge_oids($purge);
+ $purges->[$i] = $im->purge_oids($purge);
}
+ $purges;
}
sub remove_internal {
$self->barrier;
}
if ($purge && scalar keys %$purge) {
- purge_oids($self, $purge);
+ return purge_oids($self, $purge);
}
$removed;
}
{
ok($im->add($mime), 'add message to be purged');
local $SIG{__WARN__} = sub {};
- ok($im->purge($mime), 'purged message');
+ ok(my $cmts = $im->purge($mime), 'purged message');
+ like($cmts->[0], qr/\A[a-f0-9]{40}\z/, 'purge returned current commit');
$im->done;
}