X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-index-message.cc;h=efc7eb14cda4f2f6c386365443909857110149a2;hp=636757a165ac68e47a56af69817c25496afa1123;hb=48d2e2dc440d49d7305324c25460e98d5fa40bda;hpb=29974af08f2eb3ebdff3ae1052a07b6d7361d511 diff --git a/notmuch-index-message.cc b/notmuch-index-message.cc index 636757a1..efc7eb14 100644 --- a/notmuch-index-message.cc +++ b/notmuch-index-message.cc @@ -17,6 +17,38 @@ * Author: Carl Worth */ +/* This indexer creates a Xapian mail index that is remarkably similar + * to that created by sup. The big difference, (and the thing that + * will keep a notmuch index from being used by sup directly), is that + * sup expects a serialized ruby data structure in the document's data + * field, but notmuch just puts the mail's filename there (trusting + * that the email client can get the data in needs from the filename). + * + * Note: One bug here is that sup actually merges together fields such + * as To, CC, Bcc etc. when finding multiple emails with the same + * message ID. To support something similar, notmuch should list + * multiple files in the data field. + * + * Other differences between sup and notmuch-index identified so far: + * + * o sup supports encrypted mime parts by prompting for a passphrase + * to decrypt the message. So far, notmuch doesn't support this, + * both because I'm lazy to code it, and I also think doing so + * would present a security leak. + * + * o sup and notmuch have different heuristics for identifying (and + * thus ignoring) signatures. For example, sup considers a line + * consisting of two hypens as a signature separator, while + * notmuch expects those two hyphens to be followed by a space + * character. + * + * o sup as been seen to split some numbers before indexing + * them. For example, the number 1754 in an email message was + * indexed by sup as separate terms 17 and 54. I couldn't find any + * explanation for this behavior and did not try to replicate it + * in notmuch. + */ + #include #include #include @@ -172,6 +204,9 @@ gen_terms_address_names (Xapian::TermGenerator term_gen, int i; InternetAddress *address; + if (addresses == NULL) + return; + for (i = 0; i < internet_address_list_length (addresses); i++) { address = internet_address_list_get_address (addresses, i); gen_terms_address_name (term_gen, address, address_type); @@ -202,6 +237,9 @@ add_terms_address_addrs (Xapian::Document doc, int i; InternetAddress *address; + if (addresses == NULL) + return; + for (i = 0; i < internet_address_list_length (addresses); i++) { address = internet_address_list_get_address (addresses, i); add_term_address_addr (doc, address, address_type); @@ -379,8 +417,8 @@ gen_terms_body_str (Xapian::TermGenerator term_gen, } line_end = next_line - 1; - /* Trim whitespace. */ - while (*next_line && isspace (*next_line)) + /* Get to the next non-blank line. */ + while (*next_line == '\n') next_line++; /* Skip lines that are quotes. */ @@ -443,9 +481,20 @@ gen_terms_part (Xapian::TermGenerator term_gen, if (disposition && strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) { + const char *filename = g_mime_part_get_filename (GMIME_PART (part)); + const char *extension; + add_term (term_gen.get_document (), "label", "attachment"); - gen_terms (term_gen, "attachment", - g_mime_part_get_filename (GMIME_PART (part))); + gen_terms (term_gen, "attachment", filename); + + if (filename) { + extension = strchr (filename, '.'); + if (extension) { + add_term (term_gen.get_document (), "attachment_extension", + extension + 1); + } + } + return; }