]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
notmuch show: Trim down header list.
[notmuch] / notmuch.c
index 5a0ca5c946c69e12adadca235969463e98983f91..4ac5531ae42a14c8216e3977cfc7dc8a495fbb29 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -531,6 +531,30 @@ setup_command (unused (int argc), unused (char *argv[]))
        free (default_path);
     }
 
+    /* Coerce th directory into an absolute directory name. */
+    if (*mail_directory != '/') {
+       char *cwd, *absolute_mail_directory;
+
+       cwd = getcwd (NULL, 0);
+       if (cwd == NULL) {
+           fprintf (stderr, "Out of memory.\n");
+           exit (1);
+       }
+
+       if (asprintf (&absolute_mail_directory, "%s/%s",
+                     cwd, mail_directory) < 0)
+       {
+           fprintf (stderr, "Out of memory.\n");
+           exit (1);
+       }
+
+       free (cwd);
+       free (mail_directory);
+       mail_directory = absolute_mail_directory;
+
+       printf ("Abs: %s\n", mail_directory);
+    }
+
     notmuch = notmuch_database_create (mail_directory);
     if (notmuch == NULL) {
        fprintf (stderr, "Failed to create new notmuch database at %s\n",
@@ -776,8 +800,99 @@ search_command (int argc, char *argv[])
 static int
 show_command (unused (int argc), unused (char *argv[]))
 {
-    fprintf (stderr, "Error: show is not implemented yet.\n");
-    return 1;
+    void *local = talloc_new (NULL);
+    char *query_string;
+    notmuch_database_t *notmuch = NULL;
+    notmuch_query_t *query = NULL;
+    notmuch_message_results_t *messages;
+    notmuch_message_t *message;
+    const char *filename;
+    FILE *file;
+    int ret = 0;
+    int c;
+
+    const char *headers[] = {
+       "Subject", "From", "To", "Cc", "Bcc", "Date"
+    };
+    const char *name, *value;
+    unsigned int i;
+
+    if (argc != 1) {
+       fprintf (stderr, "Error: \"notmuch show\" requires exactly one thread-ID argument.\n");
+       ret = 1;
+       goto DONE;
+    }
+
+    notmuch = notmuch_database_open (NULL);
+    if (notmuch == NULL) {
+       ret = 1;
+       goto DONE;
+    }
+
+    query_string = talloc_asprintf (local, "thread:%s", argv[0]);
+    if (query_string == NULL) {
+       fprintf (stderr, "Out of memory\n");
+       ret = 1;
+       goto DONE;
+    }
+
+    query = notmuch_query_create (notmuch, query_string);
+    if (query == NULL) {
+       fprintf (stderr, "Out of memory\n");
+       ret = 1;
+       goto DONE;
+    }
+
+    for (messages = notmuch_query_search_messages (query);
+        notmuch_message_results_has_more (messages);
+        notmuch_message_results_advance (messages))
+    {
+       message = notmuch_message_results_get (messages);
+
+       printf ("%%message{\n");
+
+       printf ("%%header{\n");
+
+       for (i = 0; i < ARRAY_SIZE (headers); i++) {
+           name = headers[i];
+           value = notmuch_message_get_header (message, name);
+           if (value)
+               printf ("%s: %s\n", name, value);
+       }
+
+       printf ("%%header}\n");
+
+       filename = notmuch_message_get_filename (message);
+
+       file = fopen (filename, "r");
+       if (file) {
+           size_t header_size = notmuch_message_get_header_size (message);
+           fseek (file, header_size + 1, SEEK_SET);
+           while (1) {
+               c = fgetc (file);
+               if (c == EOF)
+                   break;
+               putchar (c);
+           }
+       }
+       fclose (file);
+
+       printf ("%%message}\n");
+
+       notmuch_message_destroy (message);
+    }
+
+  DONE:
+    if (local)
+       talloc_free (local);
+
+    if (query)
+       notmuch_query_destroy (query);
+
+    if (notmuch)
+       notmuch_database_close (notmuch);
+
+    return ret;
 }
 
 static int
@@ -1121,7 +1236,6 @@ command_t commands[] = {
       "\t\tmarks around any parenthesized expression)." },
     { "show", show_command,
       "<thread-id>\n\n"
-      "\t\tNote: The \"notmuch show\" command is not implemented yet.\n\n"
       "\t\tShow the thread with the given thread ID (see 'search').",
       "\t\tThread ID values are given as the first column in the\n"
       "\t\toutput of the \"notmuch search\" command. These are the\n"