#!perl -w
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use v5.12;
use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev);
my $opt = { compact => 1, -coarse_lock => 1,
	-eidx_ok => 1, -cidx_ok => 1 };
my $help = <<EOF; # the following should fit w/o scrolling in 80x24 term:
usage: public-inbox-compact <INBOX_DIR|EXTINDEX_DIR|CINDEX_DIR>

  Compact Xapian DBs in an inbox

options:

  --all               index all configured inboxes
  --jobs=NUM          control parallelization

See public-inbox-compact(1) man page for full documentation.
EOF
GetOptions($opt, qw(all C=s@ help|h),
	# compact options:
	qw(jobs|j=i quiet|q blocksize|b=s no-full|n fuller|F),
) or die $help;
if ($opt->{help}) { print $help; exit 0 };

require PublicInbox::Admin;
PublicInbox::Admin::require_or_die('-index');
PublicInbox::Admin::do_chdir(delete $opt->{C});
PublicInbox::Admin::progress_prepare($opt);

require PublicInbox::InboxWritable;
require PublicInbox::Xapcmd;
my $cfg = PublicInbox::Config->new;
my ($ibxs, $eidxs, $cidxs) =
	PublicInbox::Admin::resolve_inboxes(\@ARGV, $opt, $cfg);
unless (@$ibxs || @$eidxs || @$cidxs) { print STDERR $help; exit 1 }
for my $ibx (@$ibxs) {
	$ibx = PublicInbox::InboxWritable->new($ibx);
	PublicInbox::Xapcmd::run($ibx, 'compact', $opt);
}
for my $ibxish (@$eidxs, @$cidxs) {
	my $restore = $ibxish->can('prep_umask') ? $ibxish->prep_umask : undef;
	PublicInbox::Xapcmd::run($ibxish, 'compact', $opt);
}
