From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS6315 166.70.0.0/16 X-Spam-Status: No, score=-3.7 required=3.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, SPF_HELO_NONE,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from out01.mta.xmission.com (out01.mta.xmission.com [166.70.13.231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id DCDFB1F461; Fri, 17 May 2019 01:45:47 +0000 (UTC) Received: from in01.mta.xmission.com ([166.70.13.51]) by out01.mta.xmission.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.87) (envelope-from ) id 1hRRwP-0000XP-Uj; Thu, 16 May 2019 19:45:45 -0600 Received: from ip72-206-97-68.om.om.cox.net ([72.206.97.68] helo=x220.xmission.com) by in01.mta.xmission.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.87) (envelope-from ) id 1hRRwP-0002Ln-3E; Thu, 16 May 2019 19:45:45 -0600 From: ebiederm@xmission.com (Eric W. Biederman) To: Eric Wong Cc: meta@public-inbox.org Date: Thu, 16 May 2019 20:45:22 -0500 Message-ID: <877eap26rx.fsf@xmission.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1hRRwP-0002Ln-3E;;;mid=<877eap26rx.fsf@xmission.com>;;;hst=in01.mta.xmission.com;;;ip=72.206.97.68;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX1+vWKrJPgNpVUvdia5maM2H6CzKUWJc7oI= X-SA-Exim-Connect-IP: 72.206.97.68 X-SA-Exim-Mail-From: ebiederm@xmission.com Subject: [RFC][PATCH] Config.pm: Add support for mailing list information X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in01.mta.xmission.com) List-Id: The world has turned since I first started following mailing lists and to my surprise every mailling list that I am subscribed to properly sets the "List-ID:" mailing list header. So instead of doing something clever and flexible I am adding support for looking up public inbox mailing lists by their mailing list name. That makes the work needed for each email trivial and easy to understand. - Parse the "List-ID:" header. - Lookup in the configuration which mailbox is connected to that "List-ID:" - Deliver the mail to that mailbox. To that end this change enhances PublicInbox to have an additional mailbox configuration parameter "list" that holds the mailling list name. A method is added to the PublicInbox config object called lookup_list that given a mailing list name will return the PublicInbox in the configarion that is configured to handle that mailing list. Signed-off-by: "Eric W. Biederman" --- Some context. I have my mailing list email coming in via imap, and I have a script that looks at List-ID and delivers them to the appropriate public-inbox. I am hoping to get my script at least into the PublicInbox scripts directory. I have looked and see that you a watchheader directive that effectively does the same thing that I am doing. Even so, I think a mailing list having one or more mailling list names is more fundamental. A mailing name is a well supported concept and it differs from an address in that a mailing list name does not have an "@". So as part of getting my small changes to your PublicInbox code to support my email fetching script. Do you mind the addition of a mailing list name configuration parameter? If you don't mind can we apply the patch below? Do I need to tweak public-inbox-watch to be able to use the list parameter? I can't really test it as my setup is quite different but I am willing to work things through so that the code is harmonized and people can benefit from each others improvements. lib/PublicInbox/Config.pm | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 09f9179b085a..70bd88f51556 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -25,6 +25,7 @@ sub new { # caches $self->{-by_addr} ||= {}; + $self->{-by_list} ||= {}; $self->{-by_name} ||= {}; $self->{-by_newsgroup} ||= {}; $self->{-no_obfuscate} ||= {}; @@ -84,6 +85,32 @@ sub lookup { _fill($self, $pfx); } +sub lookup_list { + my ($self, $list) = @_; + my $inbox = $self->{-by_list}->{$list}; + return $inbox if $inbox; + + my $pfx; + + foreach my $k (keys %$self) { + $k =~ /\A(publicinbox\.[\w-]+)\.list\z/ or next; + my $v = $self->{$k}; + if (ref($v) eq "ARRAY") { + foreach my $alias (@$v) { + ($alias eq $list) or next; + $pfx = $1; + last; + } + } else { + ($v eq $list) or next; + $pfx = $1; + last; + } + } + defined $pfx or return; + _fill($self, $pfx); +} + sub lookup_name ($$) { my ($self, $name) = @_; $self->{-by_name}->{$name} || _fill($self, "publicinbox.$name"); @@ -389,7 +416,7 @@ sub _fill { } # TODO: more arrays, we should support multi-value for # more things to encourage decentralization - foreach my $k (qw(address altid nntpmirror coderepo hide)) { + foreach my $k (qw(address altid nntpmirror coderepo hide list)) { if (defined(my $v = $self->{"$pfx.$k"})) { $ibx->{$k} = _array($v); } @@ -412,6 +439,10 @@ sub _fill { $self->{-by_addr}->{$lc_addr} = $ibx; $self->{-no_obfuscate}->{$lc_addr} = 1; } + foreach (@{$ibx->{list}}) { + my $list = $_; + $self->{-by_list}->{$list} = $ibx; + } if (my $ng = $ibx->{newsgroup}) { $self->{-by_newsgroup}->{$ng} = $ibx; } -- 2.17.1