Meta/cook: use b4 mbox to attempt to grab all messages in the thread

This commit is contained in:
Junio C Hamano
2026-05-21 16:19:08 +09:00
parent 258ab9e8df
commit 9784b6cfb6
+34 -20
View File
@@ -124,33 +124,47 @@ sub topic_relation {
}
}
my %msgid_to_in_reply_to = ();
sub get_message_parent {
my ($mid) = @_;
my @line = ();
my %irt = ();
my $state = 0;
my ($message_id, $in_reply_to);
open(my $fh, "-|", qw(b4 -q mbox --single-message -o-), "$mid");
while (<$fh>) {
last if (/^$/);
chomp;
if (/^\s/) {
$line[-1] .= $_;
} else {
push @line, $_;
}
if (exists $msgid_to_in_reply_to{$mid}) {
return $msgid_to_in_reply_to{$mid};
}
while (<$fh>) { # slurp
open(my $fh, "-|", qw(b4 -q mbox -o-), "$mid");
while (<$fh>) {
chomp;
if ($state == 0) {
if (/^$/) {
if (defined $message_id && defined $in_reply_to) {
$msgid_to_in_reply_to{$message_id} = $in_reply_to;
}
$state = 1;
$message_id = $in_reply_to = undef;
} elsif (/^message-id:\s*<(.*)>\s*$/i) {
$message_id = $1;
} elsif (/^in-reply-to:\s*<(.*)>\s*/i) {
$in_reply_to = $1;
}
next;
} elsif ($state == 1) {
if (/^From /) {
$state = 0;
}
next;
}
}
close($fh);
for (@line) {
if (s/^in-reply-to:\s*//i) {
while (/\s*<([^<]*)>\s*(.*)/) {
$irt{$1} = $1;
$_ = $2;
}
}
if (exists $msgid_to_in_reply_to{$mid}) {
return $msgid_to_in_reply_to{$mid};
} else {
return ();
}
keys %irt;
}
sub get_source {