]> git.notmuchmail.org Git - notmuch/blobdiff - lib/add-message.cc
lib: add notmuch_message_reindex
[notmuch] / lib / add-message.cc
index 314016a8c49f70638de0fd05ee5ef8a50f12f5c0..711ed9fac80cc045aa641420ec993eb3420f94ef 100644 (file)
@@ -220,7 +220,7 @@ _my_talloc_free_for_g_hash (void *ptr)
     talloc_free (ptr);
 }
 
-static notmuch_status_t
+notmuch_status_t
 _notmuch_database_link_message_to_parents (notmuch_database_t *notmuch,
                                           notmuch_message_t *message,
                                           notmuch_message_file_t *message_file,
@@ -468,7 +468,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     notmuch_private_status_t private_status;
     notmuch_bool_t is_ghost = FALSE, is_new = FALSE;
 
-    const char *date, *header;
+    const char *date;
     const char *from, *to, *subject;
     char *message_id = NULL;
 
@@ -489,57 +489,12 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
     if (ret)
        goto DONE;
 
-    /* Parse message up front to get better error status. */
-    ret = _notmuch_message_file_parse (message_file);
+    ret = _notmuch_message_file_get_headers (message_file,
+                                            &from, &subject, &to, &date,
+                                            &message_id);
     if (ret)
        goto DONE;
 
-    /* Before we do any real work, (especially before doing a
-     * potential SHA-1 computation on the entire file's contents),
-     * let's make sure that what we're looking at looks like an
-     * actual email message.
-     */
-    from = _notmuch_message_file_get_header (message_file, "from");
-    subject = _notmuch_message_file_get_header (message_file, "subject");
-    to = _notmuch_message_file_get_header (message_file, "to");
-
-    if ((from == NULL || *from == '\0') &&
-       (subject == NULL || *subject == '\0') &&
-       (to == NULL || *to == '\0')) {
-       ret = NOTMUCH_STATUS_FILE_NOT_EMAIL;
-       goto DONE;
-    }
-
-    /* Now that we're sure it's mail, the first order of business
-     * is to find a message ID (or else create one ourselves).
-     */
-    header = _notmuch_message_file_get_header (message_file, "message-id");
-    if (header && *header != '\0') {
-       message_id = _parse_message_id (message_file, header, NULL);
-
-       /* So the header value isn't RFC-compliant, but it's
-        * better than no message-id at all.
-        */
-       if (message_id == NULL)
-           message_id = talloc_strdup (message_file, header);
-    }
-
-    if (message_id == NULL ) {
-       /* No message-id at all, let's generate one by taking a
-        * hash over the file's contents.
-        */
-       char *sha1 = _notmuch_sha1_of_file (filename);
-
-       /* If that failed too, something is really wrong. Give up. */
-       if (sha1 == NULL) {
-           ret = NOTMUCH_STATUS_FILE_ERROR;
-           goto DONE;
-       }
-
-       message_id = talloc_asprintf (message_file, "notmuch-sha1-%s", sha1);
-       free (sha1);
-    }
-
     try {
        /* Now that we have a message ID, we get a message object,
         * (which may or may not reference an existing document in the
@@ -574,20 +529,22 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
            if (is_ghost)
                /* Convert ghost message to a regular message */
                _notmuch_message_remove_term (message, "type", "ghost");
-           ret = _notmuch_database_link_message (notmuch, message,
+       }
+
+       ret = _notmuch_database_link_message (notmuch, message,
                                                  message_file, is_ghost);
-           if (ret)
-               goto DONE;
+       if (ret)
+           goto DONE;
 
-           date = _notmuch_message_file_get_header (message_file, "date");
+       if (is_new || is_ghost)
            _notmuch_message_set_header_values (message, date, from, subject);
 
-           ret = _notmuch_message_index_file (message, message_file);
-           if (ret)
-               goto DONE;
-       } else {
+       ret = _notmuch_message_index_file (message, message_file);
+       if (ret)
+           goto DONE;
+
+       if (! is_new && !is_ghost)
            ret = NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID;
-       }
 
        _notmuch_message_sync (message);
     } catch (const Xapian::Error &error) {