]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
Makefile: Hide away auto-generated dependency file as .depends.
[notmuch] / notmuch.c
index 581592c4f926aa1c391438a0c2d65fb766da3c95..923a7cee53eb366cd91ee822ffb8c7678e157621 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -533,7 +533,7 @@ setup_command (unused (void *ctx), unused (int argc), unused (char *argv[]))
        free (default_path);
     }
 
        free (default_path);
     }
 
-    /* Coerce th directory into an absolute directory name. */
+    /* Coerce the directory into an absolute directory name. */
     if (*mail_directory != '/') {
        char *cwd, *absolute_mail_directory;
 
     if (*mail_directory != '/') {
        char *cwd, *absolute_mail_directory;
 
@@ -553,8 +553,6 @@ setup_command (unused (void *ctx), unused (int argc), unused (char *argv[]))
        free (cwd);
        free (mail_directory);
        mail_directory = absolute_mail_directory;
        free (cwd);
        free (mail_directory);
        mail_directory = absolute_mail_directory;
-
-       printf ("Abs: %s\n", mail_directory);
     }
 
     notmuch = notmuch_database_create (mail_directory);
     }
 
     notmuch = notmuch_database_create (mail_directory);
@@ -850,7 +848,7 @@ search_command (void *ctx, int argc, char *argv[])
        date = notmuch_thread_get_oldest_date (thread);
        relative_date = _format_relative_date (local, date);
 
        date = notmuch_thread_get_oldest_date (thread);
        relative_date = _format_relative_date (local, date);
 
-       printf ("%s %12s %s",
+       printf ("thread:%s %12s %s",
                notmuch_thread_get_thread_id (thread),
                relative_date,
                notmuch_thread_get_subject (thread));
                notmuch_thread_get_thread_id (thread),
                relative_date,
                notmuch_thread_get_subject (thread));
@@ -880,6 +878,32 @@ search_command (void *ctx, int argc, char *argv[])
     return ret;
 }
 
     return ret;
 }
 
+static const char *
+_get_tags_as_string (void *ctx, notmuch_message_t *message)
+{
+    notmuch_tags_t *tags;
+    int first = 1;
+    const char *tag;
+    char *result;
+
+    result = talloc_strdup (ctx, "");
+    if (result == NULL)
+       return NULL;
+
+    for (tags = notmuch_message_get_tags (message);
+        notmuch_tags_has_more (tags);
+        notmuch_tags_advance (tags))
+    {
+       tag = notmuch_tags_get (tags);
+
+       result = talloc_asprintf_append (result, "%s%s",
+                                        first ? "" : " ", tag);
+       first = 0;
+    }
+
+    return result;
+}
+
 /* Get a nice, single-line summary of message. */
 static const char *
 _get_one_line_summary (void *ctx, notmuch_message_t *message)
 /* Get a nice, single-line summary of message. */
 static const char *
 _get_one_line_summary (void *ctx, notmuch_message_t *message)
@@ -887,17 +911,17 @@ _get_one_line_summary (void *ctx, notmuch_message_t *message)
     const char *from;
     time_t date;
     const char *relative_date;
     const char *from;
     time_t date;
     const char *relative_date;
-    const char *subject;
+    const char *tags;
 
     from = notmuch_message_get_header (message, "from");
 
     date = notmuch_message_get_date (message);
     relative_date = _format_relative_date (ctx, date);
 
 
     from = notmuch_message_get_header (message, "from");
 
     date = notmuch_message_get_date (message);
     relative_date = _format_relative_date (ctx, date);
 
-    subject = notmuch_message_get_header (message, "subject");
+    tags = _get_tags_as_string (ctx, message);
 
 
-    return talloc_asprintf (ctx, "%s (%s) %s",
-                           from, relative_date, subject);
+    return talloc_asprintf (ctx, "%s (%s) (%s)",
+                           from, relative_date, tags);
 }
 
 static void
 }
 
 static void
@@ -952,10 +976,11 @@ show_message_part (GMimeObject *part, int *part_count)
        const char *filename = g_mime_part_get_filename (GMIME_PART (part));
        content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
 
        const char *filename = g_mime_part_get_filename (GMIME_PART (part));
        content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
 
-       printf ("\fattachment{ ID: %d, Content-type: %s",
+       printf ("\fattachment{ ID: %d, Content-type: %s\n",
                *part_count,
                g_mime_content_type_to_string (content_type));
                *part_count,
                g_mime_content_type_to_string (content_type));
-       printf ("Filename: %s ", filename);
+       printf ("Attachment: %s (%s)\n", filename,
+               g_mime_content_type_to_string (content_type));
        printf ("\fattachment}\n");
 
        return;
        printf ("\fattachment}\n");
 
        return;
@@ -976,11 +1001,16 @@ show_message_part (GMimeObject *part, int *part_count)
        wrapper = g_mime_part_get_content_object (GMIME_PART (part));
        if (wrapper)
            g_mime_data_wrapper_write_to_stream (wrapper, stream);
        wrapper = g_mime_part_get_content_object (GMIME_PART (part));
        if (wrapper)
            g_mime_data_wrapper_write_to_stream (wrapper, stream);
+
+       g_object_unref (stream);
+    }
+    else
+    {
+       printf ("Non-text part: %s\n",
+               g_mime_content_type_to_string (content_type));
     }
 
     printf ("\fpart}\n");
     }
 
     printf ("\fpart}\n");
-
-    g_object_unref (stream);
 }
 
 static notmuch_status_t
 }
 
 static notmuch_status_t
@@ -1044,24 +1074,18 @@ show_command (void *ctx, unused (int argc), unused (char *argv[]))
     int ret = 0;
 
     const char *headers[] = {
     int ret = 0;
 
     const char *headers[] = {
-       "Subject", "From", "To", "Cc", "Bcc", "Date"
+       "From", "To", "Cc", "Bcc", "Date"
     };
     const char *name, *value;
     unsigned int i;
 
     };
     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;
     }
 
     notmuch = notmuch_database_open (NULL);
     if (notmuch == NULL) {
        ret = 1;
        goto DONE;
     }
 
-    query_string = talloc_asprintf (local, "thread:%s", argv[0]);
+    query_string = query_string_from_args (local, argc, argv);
     if (query_string == NULL) {
        fprintf (stderr, "Out of memory\n");
        ret = 1;
     if (query_string == NULL) {
        fprintf (stderr, "Out of memory\n");
        ret = 1;
@@ -1081,12 +1105,16 @@ show_command (void *ctx, unused (int argc), unused (char *argv[]))
     {
        message = notmuch_messages_get (messages);
 
     {
        message = notmuch_messages_get (messages);
 
-       printf ("\fmessage{\n");
+       printf ("\fmessage{ id:%s filename:%s\n",
+               notmuch_message_get_message_id (message),
+               notmuch_message_get_filename (message));
 
        printf ("\fheader{\n");
 
        printf ("%s\n", _get_one_line_summary (local, message));
 
 
        printf ("\fheader{\n");
 
        printf ("%s\n", _get_one_line_summary (local, message));
 
+       printf ("%s\n", notmuch_message_get_header (message, "subject"));
+
        for (i = 0; i < ARRAY_SIZE (headers); i++) {
            name = headers[i];
            value = notmuch_message_get_header (message, name);
        for (i = 0; i < ARRAY_SIZE (headers); i++) {
            name = headers[i];
            value = notmuch_message_get_header (message, name);
@@ -1095,9 +1123,12 @@ show_command (void *ctx, unused (int argc), unused (char *argv[]))
        }
 
        printf ("\fheader}\n");
        }
 
        printf ("\fheader}\n");
+       printf ("\fbody{\n");
 
        show_message_body (notmuch_message_get_filename (message));
 
 
        show_message_body (notmuch_message_get_filename (message));
 
+       printf ("\fbody}\n");
+
        printf ("\fmessage}\n");
 
        notmuch_message_destroy (message);
        printf ("\fmessage}\n");
 
        notmuch_message_destroy (message);
@@ -1433,11 +1464,24 @@ command_t commands[] = {
       "\t\tNote that the individual mail messages will be matched\n"
       "\t\tagainst the search terms, but the results will be the\n"
       "\t\tthreads containing the matched messages.\n\n"
       "\t\tNote that the individual mail messages will be matched\n"
       "\t\tagainst the search terms, but the results will be the\n"
       "\t\tthreads containing the matched messages.\n\n"
-      "\t\tCurrently, the supported search terms are as follows, (where\n"
-      "\t\t<brackets> indicate user-supplied values):\n\n"
+      "\t\tCurrently, in addition to free text (and quoted phrases)\n"
+      "\t\twhich match terms appearing anywhere within an email,\n"
+      "\t\tthe following prefixes can be used to search specific\n"
+      "\t\tportions of an email, (where <brackets> indicate user-\n"
+      "\t\tsupplied values):\n\n"
+      "\t\t\tfrom:<name-or-address>\n"
+      "\t\t\tto:<name-or-address>\n"
+      "\t\t\tsubject:<word-or-quoted-phrase>\n"
       "\t\t\ttag:<tag>\n"
       "\t\t\tid:<message-id>\n"
       "\t\t\tthread:<thread-id>\n\n"
       "\t\t\ttag:<tag>\n"
       "\t\t\tid:<message-id>\n"
       "\t\t\tthread:<thread-id>\n\n"
+      "\t\tThe from: prefix is used to match the name or address of\n"
+      "\t\tthe sender of an email message.\n\n"
+      "\t\tThe to: prefix is used to match the names or addresses of\n"
+      "\t\tany recipient of an email message, (whether To, Cc, or Bcc).\n\n"
+      "\t\tAny term prefixed with subject: will match only text from\n"
+      "\t\tthe subject of an email. Quoted phrases are supported when\n"
+      "\t\tsearching with: subject:\"this is a phrase\".\n\n"
       "\t\tValid tag values include \"inbox\" and \"unread\" by default\n"
       "\t\tfor new messages added by \"notmuch new\" as well as any other\n"
       "\t\ttag values added manually with \"notmuch tag\".\n\n"
       "\t\tValid tag values include \"inbox\" and \"unread\" by default\n"
       "\t\tfor new messages added by \"notmuch new\" as well as any other\n"
       "\t\ttag values added manually with \"notmuch tag\".\n\n"
@@ -1456,11 +1500,22 @@ command_t commands[] = {
       "\t\tinterpretation by the shell, (such as by putting quotation\n"
       "\t\tmarks around any parenthesized expression)." },
     { "show", show_command,
       "\t\tinterpretation by the shell, (such as by putting quotation\n"
       "\t\tmarks around any parenthesized expression)." },
     { "show", show_command,
-      "<thread-id>\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"
-      "\t\trandom-looking strings of 32 characters." },
+      "<search-terms> [...]\n\n"
+      "\t\tShows all messages matching the search terms.",
+      "\t\tSee the documentation of \"notmuch search\" for details\n"
+      "\t\tof the supported syntax of search terms.\n\n"
+      "\t\tA common use of \"notmuch show\" is to display a single\n"
+      "\t\tthread of email messages. For this, use a search term of\n"
+      "\t\t\"thread:<thread-id>\" as can be seen in the first column\n"
+      "\t\tof output from the \"notmuch search\" command.\n\n"
+      "\t\tAll messages will be displayed in date order. The output\n"
+      "\t\tformat is plain-text, with all text-content MIME parts\n"
+      "\t\tdecoded. Various components in the output, ('message',\n"
+      "\t\t'header', 'body', 'attachment', and MIME 'part') will be\n"
+      "\t\tdelimited by easily-parsed markers. Each marker consists\n"
+      "\t\tof a Control-L character (ASCII decimal 12), the name of\n"
+      "\t\tthe marker, and then either an opening or closing brace,\n"
+      "\t\t'{' or '}' to either open or close the component."},
     { "tag", tag_command,
       "+<tag>|-<tag> [...] [--] <search-term> [...]\n\n"
       "\t\tAdd/remove tags for all messages matching the search terms.",
     { "tag", tag_command,
       "+<tag>|-<tag> [...] [--] <search-term> [...]\n\n"
       "\t\tAdd/remove tags for all messages matching the search terms.",