const char *documentation;
} command_t;
+#define MAX_ALIAS_SUBSTITUTIONS 3
+
+typedef struct alias {
+ const char *name;
+ const char *substitutions[MAX_ALIAS_SUBSTITUTIONS];
+} alias_t;
+
+alias_t aliases[] = {
+ { "part", { "show", "--format=raw"}},
+ { "search-tags", {"search", "--output=tags", "*"}}
+};
+
static int
notmuch_help_command (void *ctx, int argc, char *argv[]);
"\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.",
"\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"
"\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"
"\tSo if you've previously been using sup for mail, then the\n"
"\t\"notmuch restore\" command provides you a way to import\n"
"\tall of your tags (or labels as sup calls them)." },
- { "search-tags", notmuch_search_tags_command,
- "[<search-terms> [...] ]",
- "List all tags found in the database or matching messages.",
- "\tRun this command without any search-term(s) to obtain a list\n"
- "\tof all tags found in the database. If you provide one or more\n"
- "\tsearch-terms as argument(s) then the resulting list will\n"
- "\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=<num> <search-terms>",
- "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] <section>.<item> [value ...]",
"Get or set settings in the notmuch configuration file.",
{
void *local;
command_t *command;
- unsigned int i;
+ alias_t *alias;
+ unsigned int i, j;
+ const char **argv_local;
talloc_enable_null_tracking ();
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];