From: Eric Wong (Contractor, The Linux Foundation) Date: Mon, 19 Mar 2018 20:49:30 +0000 (+0000) Subject: introduce InboxWritable class X-Git-Tag: v1.1.0-pre1~141 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=70207d974c5a965ef849b58c27b63fd644b3293e introduce InboxWritable class This code will be shared with future mass-import tools. --- diff --git a/MANIFEST b/MANIFEST index 4346cd9d..567148a4 100644 --- a/MANIFEST +++ b/MANIFEST @@ -66,6 +66,7 @@ lib/PublicInbox/HTTPD/Async.pm lib/PublicInbox/Hval.pm lib/PublicInbox/Import.pm lib/PublicInbox/Inbox.pm +lib/PublicInbox/InboxWritable.pm lib/PublicInbox/Linkify.pm lib/PublicInbox/Listener.pm lib/PublicInbox/Lock.pm diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm new file mode 100644 index 00000000..0a976ea2 --- /dev/null +++ b/lib/PublicInbox/InboxWritable.pm @@ -0,0 +1,57 @@ +# Copyright (C) 2018 all contributors +# License: AGPL-3.0+ + +# Extends read-only Inbox for writing +package PublicInbox::InboxWritable; +use strict; +use warnings; +use base qw(PublicInbox::Inbox); +use PublicInbox::Import; + +sub new { + my ($class, $ibx) = @_; + bless $ibx, $class; +} + +sub importer { + my ($self, $parallel) = @_; + $self->{-importer} ||= eval { + my $v = $self->{version} || 1; + if ($v == 2) { + eval { require PublicInbox::V2Writable }; + die "v2 not supported: $@\n" if $@; + my $v2w = PublicInbox::V2Writable->new($self); + $v2w->{parallel} = $parallel; + $v2w; + } elsif ($v == 1) { + my $git = $self->git; + my $name = $self->{name}; + my $addr = $self->{-primary_address}; + PublicInbox::Import->new($git, $name, $addr, $self); + } else { + die "unsupported inbox version: $v\n"; + } + } +} + +sub filter { + my ($self) = @_; + my $f = $self->{filter}; + if ($f && $f =~ /::/) { + my @args = (-inbox => $self); + # basic line splitting, only + # Perhaps we can have proper quote splitting one day... + ($f, @args) = split(/\s+/, $f) if $f =~ /\s+/; + + eval "require $f"; + if ($@) { + warn $@; + } else { + # e.g: PublicInbox::Filter::Vger->new(@args) + return $f->new(@args); + } + } + undef; +} + +1; diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index e28e602a..b165a603 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -11,6 +11,7 @@ use PublicInbox::Git; use PublicInbox::Import; use PublicInbox::MDA; use PublicInbox::Spawn qw(spawn); +use PublicInbox::InboxWritable; use File::Temp qw//; sub new { @@ -50,6 +51,10 @@ sub new { $spamcheck = undef; } } + + # need to make all inboxes writable for spam removal: + $config->each_inbox(sub { PublicInbox::InboxWritable->new($_[0]) }); + foreach $k (keys %$config) { $k =~ /\Apublicinbox\.([^\.]+)\.watch\z/ or next; my $name = $1; @@ -118,7 +123,7 @@ sub _remove_spam { eval { my $im = _importer_for($self, $ibx); $im->remove($mime, 'spam'); - if (my $scrub = _scrubber_for($ibx)) { + if (my $scrub = $ibx->filter) { my $scrubbed = $scrub->scrub($mime) or return; $scrubbed == 100 and return; $im->remove($scrubbed, 'spam'); @@ -160,7 +165,7 @@ sub _try_path { my $v = $mime->header_obj->header_raw($wm->[0]); return unless ($v && $v =~ $wm->[1]); } - if (my $scrub = _scrubber_for($inbox)) { + if (my $scrub = $inbox->filter) { my $ret = $scrub->scrub($mime) or return; $ret == 100 and return; $mime = $ret; @@ -253,25 +258,8 @@ sub _path_to_mime { } sub _importer_for { - my ($self, $inbox) = @_; - my $im = $inbox->{-import} ||= eval { - my $v = $inbox->{version} || 1; - if ($v == 2) { - eval { require PublicInbox::V2Writable }; - die "v2 not supported: $@\n" if $@; - my $v2w = PublicInbox::V2Writable->new($inbox); - $v2w->{parallel} = 0; - $v2w; - } elsif ($v == 1) { - my $git = $inbox->git; - my $name = $inbox->{name}; - my $addr = $inbox->{-primary_address}; - PublicInbox::Import->new($git, $name, $addr, $inbox); - } else { - die "unsupported inbox version: $v\n"; - } - }; - + my ($self, $ibx) = @_; + my $im = $ibx->importer(0); my $importers = $self->{importers}; if (scalar(keys(%$importers)) > 2) { delete $importers->{"$im"}; @@ -281,26 +269,6 @@ sub _importer_for { $importers->{"$im"} = $im; } -sub _scrubber_for { - my ($inbox) = @_; - my $f = $inbox->{filter}; - if ($f && $f =~ /::/) { - my @args = (-inbox => $inbox); - # basic line splitting, only - # Perhaps we can have proper quote splitting one day... - ($f, @args) = split(/\s+/, $f) if $f =~ /\s+/; - - eval "require $f"; - if ($@) { - warn $@; - } else { - # e.g: PublicInbox::Filter::Vger->new(@args) - return $f->new(@args); - } - } - undef; -} - sub _spamcheck_cb { my ($sc) = @_; sub {