X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-compact;h=9f332657e3d3946989940e9d250d61f416ffaade;hb=3348ad4b3b1a0865ee58a902953165ea0f4aa4bd;hp=79cd039b38b9b7ea50f2fdfdea549d98e9036882;hpb=c4aa293b2320feb805c5afeaa373f608e5bc8618;p=public-inbox.git diff --git a/script/public-inbox-compact b/script/public-inbox-compact index 79cd039b..9f332657 100755 --- a/script/public-inbox-compact +++ b/script/public-inbox-compact @@ -4,13 +4,12 @@ use strict; use warnings; use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev); -use PublicInbox::V2Writable; use PublicInbox::Search; use PublicInbox::Config; +use PublicInbox::InboxWritable; use Cwd 'abs_path'; use File::Temp qw(tempdir); use File::Path qw(remove_tree); -use PublicInbox::Spawn qw(spawn); my $usage = "Usage: public-inbox-compact REPO_DIR\n"; my $dir = shift or die $usage; my $config = PublicInbox::Config->new; @@ -36,13 +35,20 @@ $ibx->umask_prepare; sub commit_changes ($$$) { my ($im, $old, $new) = @_; my @st = stat($old) or die "failed to stat($old): $!\n"; + + my $over = "$old/over.sqlite3"; + if (-f $over) { + require PublicInbox::Over; + $over = PublicInbox::Over->new($over); + $over->connect->sqlite_backup_to_file("$new/over.sqlite3"); + } rename($old, "$new/old") or die "rename $old => $new/old: $!\n"; chmod($st[2] & 07777, $new) or die "chmod $old: $!\n"; rename($new, $old) or die "rename $new => $old: $!\n"; $im->lock_release; remove_tree("$old/old") or die "failed to remove $old/old: $!\n"; } - +my @compact = qw(xapian-compact --no-renumber); if ($v == 2) { require PublicInbox::V2Writable; my $v2w = PublicInbox::V2Writable->new($ibx); @@ -53,41 +59,19 @@ if ($v == 2) { $ibx->with_umask(sub { $v2w->lock_acquire; my @parts; - my $skel; while (defined(my $dn = readdir($dh))) { if ($dn =~ /\A\d+\z/) { push @parts, "$old/$dn"; - } elsif ($dn eq 'skel') { - $skel = "$old/$dn"; } elsif ($dn eq '.' || $dn eq '..') { + } elsif ($dn =~ /\Aover\.sqlite3/) { } else { warn "W: skipping unknown Xapian DB: $old/$dn\n" } } close $dh; - my %pids; - - if (@parts) { - my $pid = spawn(['xapian-compact', @parts, "$new/0" ]); - defined $pid or die "compact failed: $?\n"; - $pids{$pid} = 'xapian-compact (parts)'; - } else { - warn "No parts found in $old\n"; - } - if (defined $skel) { - my $pid = spawn(['xapian-compact', $skel, "$new/skel"]); - defined $pid or die "compact failed: $?\n"; - $pids{$pid} = 'xapian-compact (skel)'; - } else { - warn "$old/skel missing\n"; - } - scalar keys %pids or - die "No xapian-compact processes running\n"; - while (scalar keys %pids) { - my $pid = waitpid(-1, 0); - my $desc = delete $pids{$pid}; - die "$desc failed: $?\n" if $?; - } + die "No Xapian parts found in $old\n" unless @parts; + my $cmd = [@compact, @parts, "$new/0" ]; + PublicInbox::Import::run_die($cmd); commit_changes($v2w, $old, $new); }); } elsif ($v == 1) { @@ -100,7 +84,7 @@ if ($v == 2) { my $new = tempdir('compact-XXXXXXXX', CLEANUP => 1, DIR => $v1_root); $ibx->with_umask(sub { $im->lock_acquire; - PublicInbox::Import::run_die(['xapian-compact', $old, $new]); + PublicInbox::Import::run_die([@compact, $old, $new]); commit_changes($im, $old, $new); }); } else {