From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH 4/5] lei_to_mail: match mutt order of status headers
Date: Sat, 20 Mar 2021 19:04:06 +0900 [thread overview]
Message-ID: <20210320100407.15713-5-e@80x24.org> (raw)
In-Reply-To: <20210320100407.15713-1-e@80x24.org>
These changes may make it easier to do byte-for-byte comparisons
with mail copied out of mutt, a popular MUA for our target
audience.
mutt currently outputs the 'R' (seen) flag before the 'O'
character in the Status: header. We'll assume that stays
the case (it has been for a while).
Status now comes before X-Status, also matching mutt behavior.
---
lib/PublicInbox/LeiToMail.pm | 14 ++++++++------
t/lei-q-kw.t | 14 +++++++-------
t/lei-q-remote-import.t | 4 ++--
t/lei_to_mail.t | 2 +-
4 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm
index 3e6cf00c..e9ab939c 100644
--- a/lib/PublicInbox/LeiToMail.pm
+++ b/lib/PublicInbox/LeiToMail.pm
@@ -42,10 +42,7 @@ sub _mbox_hdr_buf ($$$) {
my ($eml, $type, $smsg) = @_;
$eml->header_set($_) for (qw(Lines Bytes Content-Length));
- # Messages are always 'O' (non-\Recent in IMAP), it saves
- # MUAs the trouble of rewriting the mbox if no other
- # changes are made
- my %hdr = (Status => [ 'O' ]); # set Status, X-Status
+ my %hdr = (Status => []); # set Status, X-Status
for my $k (@{$smsg->{kw} // []}) {
if (my $ent = $kw2status{$k}) {
push @{$hdr{$ent->[0]}}, $ent->[1];
@@ -53,8 +50,13 @@ sub _mbox_hdr_buf ($$$) {
warn "TODO: keyword `$k' not supported for mbox\n";
}
}
- while (my ($name, $chars) = each %hdr) {
- $eml->header_set($name, join('', sort @$chars));
+ # Messages are always 'O' (non-\Recent in IMAP), it saves
+ # MUAs the trouble of rewriting the mbox if no other
+ # changes are made. We put 'O' at the end (e.g. "Status: RO")
+ # to match mutt(1) output.
+ $eml->header_set('Status', join('', sort(@{$hdr{Status}})). 'O');
+ if (my $chars = delete $hdr{'X-Status'}) {
+ $eml->header_set('X-Status', join('', sort(@$chars)));
}
my $buf = delete $eml->{hdr};
diff --git a/t/lei-q-kw.t b/t/lei-q-kw.t
index de2c775a..b5e22e9b 100644
--- a/t/lei-q-kw.t
+++ b/t/lei-q-kw.t
@@ -13,7 +13,7 @@ my $exp = {
'<qp@example.com>' => eml_load('t/plack-qp.eml'),
'<testmessage@example.com>' => eml_load('t/utf8.eml'),
};
-$exp->{'<qp@example.com>'}->header_set('Status', 'OR');
+$exp->{'<qp@example.com>'}->header_set('Status', 'RO');
$exp->{'<testmessage@example.com>'}->header_set('Status', 'O');
test_lei(sub {
@@ -57,7 +57,7 @@ SKIP: {
open my $fh, '<', \$buf or BAIL_OUT $!;
PublicInbox::MboxReader->mboxrd($fh, sub {
my ($eml) = @_;
- $eml->header_set('Status', 'OR');
+ $eml->header_set('Status', 'RO');
is_deeply($eml, $exp->{'<qp@example.com>'},
'FIFO output works as expected');
});
@@ -96,7 +96,7 @@ for my $sfx ('', '.gz') {
is($buf, '', 'emptied');
lei_ok(qw(q -o), "mboxrd:$o", qw(m:qp@example.com));
$buf = $read_file->($o);
- $buf =~ s/\nStatus: O\n\n/\nStatus: OR\n\n/s or
+ $buf =~ s/\nStatus: O\n\n/\nStatus: RO\n\n/s or
BAIL_OUT "no Status in $buf";
$write_file->($o, $buf);
lei_ok(qw(q -a -o), "mboxrd:$o", qw(m:testmessage@example.com));
@@ -111,7 +111,7 @@ for my $sfx ('', '.gz') {
lei_ok(qw(q -o), "mboxrd:/dev/stdout", qw(m:qp@example.com)) or
diag $lei_err;
- like($lei_out, qr/^Status: OR\n/sm, 'Status set by previous augment');
+ like($lei_out, qr/^Status: RO\n/sm, 'Status set by previous augment');
} # /mbox + mbox.gz tests
my ($ro_home, $cfg_path) = setup_public_inboxes;
@@ -144,7 +144,7 @@ lei_ok(qw(q -o), "mboxrd:$o", "m:$m", @inc);
# emulate MUA marking mboxrd message as unread
open my $fh, '<', $o or BAIL_OUT;
my $s = do { local $/; <$fh> };
-$s =~ s/^Status: OR\n/Status: O\nX-Status: AF\n/sm or
+$s =~ s/^Status: RO\n/Status: O\nX-Status: AF\n/sm or
fail "failed to clear R flag in $s";
open $fh, '>', $o or BAIL_OUT;
print $fh $s or BAIL_OUT;
@@ -155,8 +155,8 @@ lei_ok(qw(q -o), "mboxrd:$o", 'm:bogus', @inc,
lei_ok(qw(q -o), "mboxrd:$o", "m:$m", @inc);
open $fh, '<', $o or BAIL_OUT;
$s = do { local $/; <$fh> };
-like($s, qr/^Status: O\n/ms, 'seen keyword gone in mbox');
-like($s, qr/^X-Status: AF\n/ms, 'answered + flagged set');
+like($s, qr/^Status: O\nX-Status: AF\n/ms,
+ 'seen keyword gone in mbox, answered + flagged set');
lei_ok(qw(q --pretty), "m:$m", @inc);
like($lei_out, qr/^ "kw": \["answered", "flagged"\],\n/sm,
diff --git a/t/lei-q-remote-import.t b/t/lei-q-remote-import.t
index 2293489a..25e461ac 100644
--- a/t/lei-q-remote-import.t
+++ b/t/lei-q-remote-import.t
@@ -80,7 +80,7 @@ From a@z Mon Sep 17 00:00:00 2001
From: nobody@localhost
Date: Sat, 13 Mar 2021 18:23:01 +0600
Message-ID: <never-before-seen@example.com>
-Status: RO
+Status: OR
whatever
EOF
@@ -89,7 +89,7 @@ EOF
is_deeply($slurp_emls->($o), [$exp],
'got expected result after clobber') or diag $lei_err;
lei_ok(qw(q -o mboxrd:/dev/stdout m:never-before-seen@example.com));
- like($lei_out, qr/seen\@example\.com>\nStatus: OR\n\nwhatever/sm,
+ like($lei_out, qr/seen\@example\.com>\nStatus: RO\n\nwhatever/sm,
'--import-before imported totally unseen message');
});
done_testing;
diff --git a/t/lei_to_mail.t b/t/lei_to_mail.t
index 585db689..626bdab3 100644
--- a/t/lei_to_mail.t
+++ b/t/lei_to_mail.t
@@ -28,7 +28,7 @@ for my $mbox (@MBOX) {
my $s = $cb->(PublicInbox::Eml->new($from), $smsg);
is(substr($$s, -1, 1), "\n", "trailing LF in normal $mbox");
my $eml = PublicInbox::Eml->new($s);
- is($eml->header('Status'), 'OR', "Status: set by $m");
+ is($eml->header('Status'), 'RO', "Status: set by $m");
is($eml->header('X-Status'), 'AF', "X-Status: set by $m");
if ($mbox eq 'mboxcl2') {
like($eml->body_raw, qr/^From /, "From not escaped $m");
next prev parent reply other threads:[~2021-03-20 10:04 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-20 10:04 [PATCH 0/5] lei: preserve keywords across queries Eric Wong
2021-03-20 10:04 ` [PATCH 1/5] lei: All Local Externals: bare git dir for alternates Eric Wong
2021-03-20 10:04 ` [PATCH 2/5] lei q: support vmd for external-only messages Eric Wong
2021-03-20 10:04 ` [PATCH 3/5] lei q: put keywords on one line in --pretty output Eric Wong
2021-03-20 10:04 ` Eric Wong [this message]
2021-03-20 10:04 ` [PATCH 5/5] lei: tie ALE lifetime to config file Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210320100407.15713-5-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).