about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-04 21:24:58 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-04 21:54:42 +0000
commitb4d127cb83230fe5cee0dcecb573107ad96a7c4c (patch)
tree764d61dc4043e368248165d75dd3dbd4312c2ce4 /lib
parent89537db2ca4b506a7b7500dcd7b7c5430a0a6dc7 (diff)
downloadpublic-inbox-b4d127cb83230fe5cee0dcecb573107ad96a7c4c.tar.gz
We do not need to rewrite old commits unaffected by the object_id
purge, only newer commits.  This was a state management bug :x

We will also return the new commit ID of rewritten history to
aid in incremental indexing of mirrors for the next change.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Import.pm25
-rw-r--r--lib/PublicInbox/V2Writable.pm6
2 files changed, 22 insertions, 9 deletions
diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm
index b2aae9a7..73290eed 100644
--- a/lib/PublicInbox/Import.pm
+++ b/lib/PublicInbox/Import.pm
@@ -476,6 +476,7 @@ sub purge_oids {
         my @buf;
         my $npurge = 0;
         my @oids;
+        my ($done, $mark);
         my $tree = $self->{-tree};
         while (<$rd>) {
                 if (/^reset (?:.+)/) {
@@ -506,14 +507,20 @@ sub purge_oids {
                         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, $_;
                 }
@@ -521,7 +528,9 @@ sub purge_oids {
         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}");
 
@@ -540,7 +549,9 @@ sub purge_oids {
                         $err++;
                 }
         }
+        _update_git_info($self, 0);
         die "Failed to purge $err object(s)\n" if $err;
+        $cmt;
 }
 
 1;
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index 479e2b5d..b6532ac5 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -224,11 +224,13 @@ sub purge_oids {
         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 {
@@ -285,7 +287,7 @@ sub remove_internal {
                 $self->barrier;
         }
         if ($purge && scalar keys %$purge) {
-                purge_oids($self, $purge);
+                return purge_oids($self, $purge);
         }
         $removed;
 }