X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FFilter%2FRubyLang.pm;h=57ebbe78f5e173e3a723bb2968da0dac816d7424;hb=d9b0f6432682e4ad0a49f7befccde208e4565f1d;hp=a65a59716f9affa7b6befacf1eb04a5383ae5f01;hpb=95bdac7f09c69036efed537a4d03d5bdd2ae4eb6;p=public-inbox.git diff --git a/lib/PublicInbox/Filter/RubyLang.pm b/lib/PublicInbox/Filter/RubyLang.pm index a65a5971..57ebbe78 100644 --- a/lib/PublicInbox/Filter/RubyLang.pm +++ b/lib/PublicInbox/Filter/RubyLang.pm @@ -1,11 +1,10 @@ -# Copyright (C) 2017-2020 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # Filter for lists.ruby-lang.org trailers package PublicInbox::Filter::RubyLang; -use base qw(PublicInbox::Filter::Base); -use strict; -use warnings; +use v5.10.1; +use parent qw(PublicInbox::Filter::Base); use PublicInbox::MID qw(mids); my $l1 = qr/Unsubscribe:\s @@ -16,7 +15,7 @@ sub new { my ($class, %opts) = @_; my $altid = delete $opts{-altid}; my $self = $class->SUPER::new(%opts); - my $ibx = $self->{-inbox}; + my $ibx = $self->{ibx}; # altid = serial:ruby-core:file=msgmap.sqlite3 if (!$altid && $ibx && $ibx->{altid}) { $altid ||= $ibx->{altid}->[0]; @@ -28,34 +27,50 @@ sub new { $self; } +sub scrub_part ($) { + my ($part) = @_; + my $ct = $part->content_type; + if (!$ct || $ct =~ m{\btext/plain\b}i) { + my $s = eval { $part->body_str }; + if (defined $s && $s =~ s/\n?$l1\n$l2\n\z//os) { + $part->body_str_set($s); + return 1; + } + } + 0; +} + sub scrub { my ($self, $mime, $for_remove) = @_; - # no msg_iter here, that is only for read-only access - $mime->walk_parts(sub { - my ($part) = $_[0]; - my $ct = $part->content_type; - if (!$ct || $ct =~ m{\btext/plain\b}i) { - my $s = eval { $part->body_str }; - if (defined $s && $s =~ s/\n?$l1\n$l2\n\z//os) { - $part->body_str_set($s); - } - } - }); + # no msg_iter here, msg_iter is only for read-only access + if (my @sub = $mime->subparts) { + my $changed = 0; + $changed |= scrub_part($_) for @sub; + $mime->parts_set(\@sub) if $changed; + } else { + scrub_part($mime); + } my $altid = $self->{-altid}; if ($altid && !$for_remove) { my $hdr = $mime->header_obj; my $mids = mids($hdr); return $self->REJECT('Message-ID missing') unless (@$mids); - my @v = $hdr->header_raw('X-Mail-Count'); my $n; - foreach (@v) { - /\A\s*([0-9]+)\s*\z/ or next; - $n = $1; - last; - } - unless (defined $n) { - return $self->REJECT('X-Mail-Count not numeric'); + my @v = $hdr->header_raw('X-Mail-Count'); # old host only + if (@v) { + for (@v) { + /\A\s*([0-9]+)\s*\z/ or next; + $n = $1; + last; + } + } else { # new host: nue.mailmanlists.eu + for ($hdr->header_str('Subject')) { + /\A\[ruby-[^:]+:([0-9]+)\]/ or next; + $n = $1; + last; + } } + $n // return $self->REJECT('could not get count not numeric'); foreach my $mid (@$mids) { my $r = $altid->mm_alt->mid_set($n, $mid); next if $r == 0;