]> Sergey Matveev's repositories - public-inbox.git/blobdiff - script/public-inbox-init
lazy load Xapian and make it optional for v2
[public-inbox.git] / script / public-inbox-init
index fdad1366475a079120f064667719543d73450910..9f0bd1bddca8b1d773d6563a916c87b7f1697ec0 100755 (executable)
@@ -5,9 +5,10 @@
 # Initializes a public-inbox, basically a wrapper for git-init(1)
 use strict;
 use warnings;
-my $usage = "public-inbox-init NAME GIT_DIR HTTP_URL ADDRESS [ADDRESS..]";
+my $usage = "public-inbox-init NAME REPO_DIR HTTP_URL ADDRESS [ADDRESS..]";
 use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/;
 use PublicInbox::Config;
+use PublicInbox::Inbox;
 use File::Temp qw/tempfile/;
 use File::Basename qw/dirname/;
 use File::Path qw/mkpath/;
@@ -15,8 +16,13 @@ use Cwd qw/abs_path/;
 
 sub x { system(@_) and die join(' ', @_). " failed: $?\n" }
 sub usage { print STDERR "Usage: $usage\n"; exit 1 }
-my $version = 1;
-my %opts = ( 'V|version=i' => \$version );
+my $version = undef;
+my $indexlevel = undef;
+my $skip;
+my %opts = ( 'V|version=i' => \$version,
+            'L|indexlevel=s' => \$indexlevel,
+            'S|skip=i' => \$skip,
+);
 GetOptions(%opts) or usage();
 my $name = shift @ARGV or usage();
 my $mainrepo = shift @ARGV or usage();
@@ -64,6 +70,13 @@ if (-e $pi_config) {
        }
 
        exit(1) if $conflict;
+
+       my $ibx = $cfg->lookup_name($name);
+       if ($ibx) {
+               if (!defined($indexlevel) && $ibx->{indexlevel}) {
+                       $indexlevel = $ibx->{indexlevel};
+               }
+       }
 }
 close $fh or die "failed to close $pi_config_tmp: $!\n";
 
@@ -71,28 +84,40 @@ my $pfx = "publicinbox.$name";
 my @x = (qw/git config/, "--file=$pi_config_tmp");
 
 $mainrepo = abs_path($mainrepo);
+if (-f "$mainrepo/inbox.lock") {
+       if (!defined $version) {
+               $version = 2;
+       } elsif ($version != 2) {
+               die "$mainrepo is a -V2 repo, -V$version specified\n"
+       }
+} elsif (-d "$mainrepo/objects") {
+       if (!defined $version) {
+               $version = 1;
+       } elsif ($version != 1) {
+               die "$mainrepo is a -V1 repo, -V$version specified\n"
+       }
+}
+
+$version = 1 unless defined $version;
+
+if ($version == 1 && defined $skip) {
+       die "--skip is only supported for -V2 repos\n";
+}
+
+my $ibx = PublicInbox::Inbox->new({
+       mainrepo => $mainrepo,
+       name => $name,
+       version => $version,
+       -primary_address => $address[0],
+       indexlevel => $indexlevel,
+});
 
 if ($version >= 2) {
        require PublicInbox::V2Writable;
-       require PublicInbox::Inbox;
-       my $ibx = {
-               mainrepo => $mainrepo,
-               name => $name,
-               version => $version,
-               -primary_address => $address[0],
-       };
-       $ibx = PublicInbox::Inbox->new($ibx);
-       my $v2w = PublicInbox::V2Writable->new($ibx, 1);
-       $v2w->{parallel} = 0;
-       $v2w->idx_init;
-       $v2w->git_init(0);
-       $v2w->done;
+       PublicInbox::V2Writable->new($ibx, 1)->init_inbox(0, $skip);
 } elsif ($version == 1) {
-       x(qw(git init -q --bare), $mainrepo);
-
-       # set a reasonable default:
-       x(qw/git config/, "--file=$mainrepo/config",
-               'repack.writeBitmaps', 'true');
+       require PublicInbox::V1Writable;
+       PublicInbox::V1Writable->new($ibx, 1)->init_inbox(0, $skip);
 } else {
        die "Unsupported -V/--version: $version\n";
 }
@@ -104,5 +129,9 @@ foreach my $addr (@address) {
 x(@x, "$pfx.url", $http_url);
 x(@x, "$pfx.mainrepo", $mainrepo);
 
+if (defined($indexlevel)) {
+       x(@x, "$pfx.indexlevel", $indexlevel);
+}
+
 rename $pi_config_tmp, $pi_config or
        die "failed to rename `$pi_config_tmp' to `$pi_config': $!\n";