| #!/usr/bin/perl -w |
| # Copyright (C) all contributors <meta@public-inbox.org> |
| # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> |
| =begin usage |
| One-off script to convert an slrnpull spool from gmane to Maildir |
| Note: this contains Gmane-specific header munging to workaround |
| the munging done by Gmane. |
| |
| ./slrnspool2maildir SLRNPULL_ROOT/news/foo/bar /path/to/maildir/ |
| |
| A generic replacement w/o Gmane-specific munging could treat |
| the slrnpull spool as an MH folder with lei: |
| |
| lei convert mh:SLRNPULL_ROOT/news/foo/bar -o /path/to/maildir |
| # (and `lei daemon-kill' if you don't want the daemon to linger) |
| =cut |
| use v5.12; |
| use autodie; |
| # warning: unstable internal APIs: |
| use PublicInbox::Eml; |
| use PublicInbox::LeiToMail; |
| use PublicInbox::MHreader; |
| use PublicInbox::IO qw(read_all); |
| use File::Path qw(make_path); |
| use File::Spec (); |
| sub usage { |
| open my $fh, '<', __FILE__; |
| ("Usage:\n", grep { /^=begin usage/../^=cut/ and !/^=/m } <$fh>); |
| } |
| my $spool = shift @ARGV or die usage(); |
| my $dst = shift @ARGV or die usage(); |
| $dst .= '/' unless $dst =~ m!/\z!; |
| File::Path::make_path(map { $dst.$_ } qw(tmp new cur)); |
| $dst = File::Spec->rel2abs($dst).'/'; |
| opendir my $cwdfh, '.'; |
| my $mhr = PublicInbox::MHreader->new($spool, $cwdfh); |
| my $smsg; |
| $mhr->mh_each_eml(sub { |
| my ($d, $n, $kw, $eml) = @_; |
| # gmane rewrites Received headers, which increases spamminess |
| # Some older archives set Original-To |
| for my $x (qw(Received To)) { |
| my @h = $eml->header_raw("Original-$x"); |
| if (@h) { |
| $eml->header_set($x, @h); |
| $eml->header_set("Original-$x"); |
| } |
| } |
| # `Approved' triggers the SA HEADER_SPAM rule |
| # `connect()' appears to be an old gmane bug: |
| $eml->header_set($_) for ('Approved', 'connect()'); |
| my $buf = $eml->as_string; |
| $smsg->{blob} = $n; |
| PublicInbox::LeiToMail::_buf2maildir($dst, \$buf, $smsg, 'new/'); |
| }); |