X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.c;h=9bb884712dbb86a6dc245219f2d4495dc3faf464;hp=40da62b62057b9b346cf624fa381128bbd79d02e;hb=e267f9a46731e796f7064c7483de9942caba3c2a;hpb=b64afb1ab9924749cd6d3fbfa02e5e42bb0d728b diff --git a/notmuch.c b/notmuch.c index 40da62b6..9bb88471 100644 --- a/notmuch.c +++ b/notmuch.c @@ -32,6 +32,17 @@ typedef struct command { const char *documentation; } command_t; +#define MAX_ALIAS_SUBSTITUTIONS 2 + +typedef struct alias { + const char *name; + const char *substitutions[MAX_ALIAS_SUBSTITUTIONS]; +} alias_t; + +alias_t aliases[] = { + { "part", { "show", "--format=raw"}} +}; + static int notmuch_help_command (void *ctx, int argc, char *argv[]); @@ -115,7 +126,7 @@ static const char search_terms_help[] = "\n" "\t\t$(date +%%s -d 2009-10-01)..$(date +%%s)\n\n"; -command_t commands[] = { +static command_t commands[] = { { "setup", notmuch_setup_command, NULL, "Interactively setup notmuch for first use.", @@ -230,7 +241,7 @@ command_t commands[] = { "\n" "\t--format=(text|json|mbox|raw)\n" "\n" - "\t\ttext (default)\n" + "\t\ttext (default for messages)\n" "\n" "\t\tThe default plain-text format has all text-content MIME parts\n" "\t\tdecoded. Various components in the output, ('message', 'header',\n" @@ -238,15 +249,17 @@ command_t commands[] = { "\t\teasily-parsed markers. Each marker consists of a Control-L\n" "\t\tcharacter (ASCII decimal 12), the name of the marker, and\n" "\t\tthen either an opening or closing brace, '{' or '}' to\n" - "\t\teither open or close the component.\n" + "\t\teither open or close the component. For a multipart MIME\n" + "\t\tmessage, these parts will be nested.\n" "\n" "\t\tjson\n" "\n" "\t\tThe output is formatted with Javascript Object Notation\n" "\t\t(JSON). This format is more robust than the text format\n" - "\t\tfor automated processing. JSON output always includes all\n" - "\t\tmessages in a matching thread; in effect '--format=json'\n" - "\t\timplies '--entire-thread'\n" + "\t\tfor automated processing. The nested structure of multipart\n" + "\t\tMIME messages is reflected in nested JSON output. JSON\n" + "\t\toutput always includes all messages in a matching thread;\n" + "\t\tin effect '--format=json' implies '--entire-thread'\n" "\n" "\t\tmbox\n" "\n" @@ -260,12 +273,26 @@ command_t commands[] = { "\n" "\t\thttp://homepage.ntlworld.com/jonathan.deboynepollard/FGA/mail-mbox-formats.html\n" "\n" - "\t\traw\n" + "\t\traw (default for a single part, see --part)\n" + "\n" + "\t\tFor a message, the original, raw content of the email\n" + "\t\tmessage is output. Consumers of this format should\n" + "\t\texpect to implement MIME decoding and similar functions.\n" + "\n" + "\t\tFor a single part (--part) the raw part content is output\n" + "\t\tafter performing any necessary MIME decoding.\n" + "\n" + "\t\tThe raw format must only be used with search terms matching\n" + "\t\tsingle message.\n" + "\n" + "\t--part=N\n" + "\n" + "\t\tOutput the single decoded MIME part N of a single message.\n" + "\t\tThe search terms must match only a single message.\n" + "\t\tMessage parts are numbered in a depth-first walk of the\n" + "\t\tmessage MIME structure, and are identified in the 'json' or\n" + "\t\t'text' output formats.\n" "\n" - "\t\tThe original, raw content of the email message is displayed.\n" - "\t\tConsumers of this format should expect to implement MIME\n" - "\t\tdecoding and similar functions. This format must only\n" - "\t\tbe used with search terms matching a single message.\n" "\n" "\tA common use of \"notmuch show\" is to display a single\n" "\tthread of email messages. For this, use a search term of\n" @@ -356,17 +383,6 @@ command_t commands[] = { "\tcontain tags only from messages that match the search-term(s).\n" "\n" "\tIn both cases the list will be alphabetically sorted." }, - { "part", notmuch_part_command, - "--part= ", - "Output a single MIME part of a message.", - "\tA single decoded MIME part, with no encoding or framing,\n" - "\tis output to stdout. The search terms must match only a single\n" - "\tmessage, otherwise this command will fail.\n" - "\n" - "\tThe part number should match the part \"id\" field output\n" - "\tby the \"--format=json\" option of \"notmuch show\". If the\n" - "\tmessage specified by the search terms does not include a\n" - "\tpart with the specified \"id\" there will be no output." }, { "config", notmuch_config_command, "[get|set]
. [value ...]", "Get or set settings in the notmuch configuration file.", @@ -546,7 +562,9 @@ main (int argc, char *argv[]) { void *local; command_t *command; - unsigned int i; + alias_t *alias; + unsigned int i, j; + const char **argv_local; talloc_enable_null_tracking (); @@ -565,6 +583,40 @@ main (int argc, char *argv[]) return 0; } + for (i = 0; i < ARRAY_SIZE (aliases); i++) { + alias = &aliases[i]; + + if (strcmp (argv[1], alias->name) == 0) + { + int substitutions; + + argv_local = talloc_size (local, sizeof (char *) * + (argc + MAX_ALIAS_SUBSTITUTIONS - 1)); + if (argv_local == NULL) { + fprintf (stderr, "Out of memory.\n"); + return 1; + } + + /* Copy all substution arguments from the alias. */ + argv_local[0] = argv[0]; + for (j = 0; j < MAX_ALIAS_SUBSTITUTIONS; j++) { + if (alias->substitutions[j] == NULL) + break; + argv_local[j+1] = alias->substitutions[j]; + } + substitutions = j; + + /* And copy all original arguments (skipping the argument + * that matched the alias of course. */ + for (j = 2; j < (unsigned) argc; j++) { + argv_local[substitutions+j-1] = argv[j]; + } + + argc += substitutions - 1; + argv = (char **) argv_local; + } + } + for (i = 0; i < ARRAY_SIZE (commands); i++) { command = &commands[i];