about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-05-14 02:04:41 +0000
committerEric Wong <e@80x24.org>2019-05-14 02:05:55 +0000
commitfdfd7161a9257b70d65ab55dba4328b4960142d3 (patch)
treece3fe2b0a13c62931f8e4b039f3f73c38561a8dd /lib/PublicInbox
parent7e2abe2d068367f2fcdf638a4482c953111df156 (diff)
downloadpublic-inbox-fdfd7161a9257b70d65ab55dba4328b4960142d3.tar.gz
Import initialization is a little strange from history, but we
also can't change it too much because it's technically a public
API which external code may rely on...

And we may need to support v1 repos indefinitely.  This should
make it easier to write tests for both formats.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/Import.pm15
-rw-r--r--lib/PublicInbox/V1Writable.pm34
-rw-r--r--lib/PublicInbox/V2Writable.pm6
3 files changed, 49 insertions, 6 deletions
diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm
index c7755755..12abf399 100644
--- a/lib/PublicInbox/Import.pm
+++ b/lib/PublicInbox/Import.pm
@@ -18,12 +18,15 @@ use PublicInbox::MDA;
 use POSIX qw(strftime);
 
 sub new {
+        # we can't change arg order, this is documented in POD
+        # and external projects may rely on it:
         my ($class, $git, $name, $email, $ibx) = @_;
         my $ref = 'refs/heads/master';
         if ($ibx) {
                 $ref = $ibx->{ref_head} || 'refs/heads/master';
                 $name ||= $ibx->{name};
                 $email ||= $ibx->{-primary_address};
+                $git ||= $ibx->git;
         }
         bless {
                 git => $git,
@@ -433,6 +436,16 @@ sub run_die ($;$$) {
         $? == 0 or die join(' ', @$cmd) . " failed: $?\n";
 }
 
+sub init_bare {
+        my ($dir) = @_;
+        my @cmd = (qw(git init --bare -q), $dir);
+        run_die(\@cmd);
+        # set a reasonable default:
+        @cmd = (qw/git config/, "--file=$dir/config",
+                'repack.writeBitmaps', 'true');
+        run_die(\@cmd);
+}
+
 sub done {
         my ($self) = @_;
         my $w = delete $self->{out} or return;
@@ -586,7 +599,7 @@ __END__
 
 =head1 NAME
 
-PublicInbox::Import - message importer for public-inbox
+PublicInbox::Import - message importer for public-inbox v1 inboxes
 
 =head1 VERSION
 
diff --git a/lib/PublicInbox/V1Writable.pm b/lib/PublicInbox/V1Writable.pm
new file mode 100644
index 00000000..6ca5db4a
--- /dev/null
+++ b/lib/PublicInbox/V1Writable.pm
@@ -0,0 +1,34 @@
+# Copyright (C) 2019 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# This interface wraps PublicInbox::Import and makes it closer
+# to V2Writable
+# Used to write to V1 inboxes (see L<public-inbox-v1-format(5)>).
+package PublicInbox::V1Writable;
+use strict;
+use warnings;
+use base qw(PublicInbox::Import);
+use PublicInbox::InboxWritable;
+
+sub new {
+        my ($class, $ibx, $creat) = @_;
+        my $dir = $ibx->{mainrepo} or die "no mainrepo in inbox\n";
+        unless (-d $dir) {
+                if ($creat) {
+                        PublicInbox::Import::init_bare($dir);
+                } else {
+                        die "$dir does not exist\n";
+                }
+        }
+        $ibx = PublicInbox::InboxWritable->new($ibx);
+        $class->SUPER::new(undef, undef, undef, $ibx);
+}
+
+sub init_inbox {
+        my ($self, $partitions, $skip_epoch, $skip_artnum) = @_;
+        # TODO: honor skip_artnum
+        my $dir = $self->{-inbox}->{mainrepo} or die "no mainrepo in inbox\n";
+        PublicInbox::Import::init_bare($dir);
+}
+
+1;
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index 87e8f3eb..b92d8d24 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -517,11 +517,7 @@ sub fill_alternates ($$) {
         my $all = "$self->{-inbox}->{mainrepo}/all.git";
         my @cmd;
         unless (-d $all) {
-                @cmd = (qw(git init --bare -q), $all);
-                PublicInbox::Import::run_die(\@cmd);
-                @cmd = (qw/git config/, "--file=$all/config",
-                                'repack.writeBitmaps', 'true');
-                PublicInbox::Import::run_die(\@cmd);
+                PublicInbox::Import::init_bare($all);
         }
         @cmd = (qw/git config/, "--file=$pfx/$epoch.git/config",
                         'include.path', '../../all.git/config');