mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-22 17:34:54 +01:00
cf8aaafbad
Presently, the code which finds the parent of a message as it is being added to the database assumes that the first Message-ID-like substring of the In-Reply-To header is the parent Message ID. Some mail clients, however, put stuff other than the Message-ID of the parent in the In-Reply-To header, such as the email address of the sender of the parent. This can fool notmuch. The updated algorithm prefers the last Message ID in the References header. The References header lists messages oldest-first, so the last Message ID is the parent (RFC2822, p. 24). The References header is also less likely to be in a non-standard syntax (http://cr.yp.to/immhf/thread.html, http://www.jwz.org/doc/threading.html). In case the References header is not to be found, fall back to the old behavior. V2 of this patch, incorporating feedback from Jani and (indirectly) Austin.
141 lines
6.2 KiB
Bash
Executable file
141 lines
6.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# Copyright (c) 2013 Aaron Ecay
|
|
#
|
|
|
|
test_description='test of proper handling of in-reply-to and references headers'
|
|
|
|
# This test makes sure that the thread structure in the notmuch
|
|
# database is constructed properly, even in the presence of
|
|
# non-RFC-compliant headers'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_begin_subtest "Use References when In-Reply-To is broken"
|
|
add_message '[id]="foo@one.com"' \
|
|
'[subject]=one'
|
|
add_message '[in-reply-to]="mumble"' \
|
|
'[references]="<foo@one.com>"' \
|
|
'[subject]="Re: one"'
|
|
output=$(notmuch show --format=json 'subject:one' | notmuch_json_show_sanitize)
|
|
expected='[[[{"id": "foo@one.com",
|
|
"match": true,
|
|
"excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437,
|
|
"date_relative": "2001-01-05",
|
|
"tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "one",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
|
|
"body": [{"id": 1,
|
|
"content-type": "text/plain",
|
|
"content": "This is just a test message (#1)\n"}]},
|
|
[[{"id": "msg-002@notmuch-test-suite",
|
|
"match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05",
|
|
"tags": ["inbox", "unread"], "headers": {"Subject": "Re: one",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
|
|
"body": [{"id": 1, "content-type": "text/plain",
|
|
"content": "This is just a test message (#2)\n"}]}, []]]]]]'
|
|
expected=`echo "$expected" | notmuch_json_show_sanitize`
|
|
test_expect_equal_json "$output" "$expected"
|
|
|
|
test_begin_subtest "Prefer References to In-Reply-To"
|
|
add_message '[id]="foo@two.com"' \
|
|
'[subject]=two'
|
|
add_message '[in-reply-to]="<bar@baz.com>"' \
|
|
'[references]="<foo@two.com>"' \
|
|
'[subject]="Re: two"'
|
|
output=$(notmuch show --format=json 'subject:two' | notmuch_json_show_sanitize)
|
|
expected='[[[{"id": "foo@two.com",
|
|
"match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "two",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
|
|
"body": [{"id": 1, "content-type": "text/plain",
|
|
"content": "This is just a test message (#3)\n"}]},
|
|
[[{"id": "msg-004@notmuch-test-suite", "match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "Re: two",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
|
|
"body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#4)\n"}]},
|
|
[]]]]]]'
|
|
expected=`echo "$expected" | notmuch_json_show_sanitize`
|
|
test_expect_equal_json "$output" "$expected"
|
|
|
|
test_begin_subtest "Use In-Reply-To when no References"
|
|
add_message '[id]="foo@three.com"' \
|
|
'[subject]="three"'
|
|
add_message '[in-reply-to]="<foo@three.com>"' \
|
|
'[subject]="Re: three"'
|
|
output=$(notmuch show --format=json 'subject:three' | notmuch_json_show_sanitize)
|
|
expected='[[[{"id": "foo@three.com", "match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "three",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#5)\n"}]},
|
|
[[{"id": "msg-006@notmuch-test-suite", "match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "Re: three",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#6)\n"}]},
|
|
[]]]]]]'
|
|
expected=`echo "$expected" | notmuch_json_show_sanitize`
|
|
test_expect_equal_json "$output" "$expected"
|
|
|
|
test_begin_subtest "Use last Reference"
|
|
add_message '[id]="foo@four.com"' \
|
|
'[subject]="four"'
|
|
add_message '[id]="bar@four.com"' \
|
|
'[subject]="not-four"'
|
|
add_message '[in-reply-to]="<baz@four.com>"' \
|
|
'[references]="<baz@four.com> <foo@four.com>"' \
|
|
'[subject]="neither"'
|
|
output=$(notmuch show --format=json 'subject:four' | notmuch_json_show_sanitize)
|
|
expected='[[[{"id": "foo@four.com", "match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "four",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#7)\n"}]},
|
|
[[{"id": "msg-009@notmuch-test-suite", "match": false, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "neither",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#9)\n"}]},
|
|
[]]]]], [[{"id": "bar@four.com", "match": true, "excluded": false,
|
|
"filename": "YYYYY",
|
|
"timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["inbox", "unread"],
|
|
"headers": {"Subject": "not-four",
|
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
|
"Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [{"id": 1,
|
|
"content-type": "text/plain", "content": "This is just a test message (#8)\n"}]}, []]]]'
|
|
expected=`echo "$expected" | notmuch_json_show_sanitize`
|
|
test_expect_equal_json "$output" "$expected"
|
|
|
|
|
|
test_done
|