X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.c;h=7360e0e6d5872fe61e691e5da44e62de0e28d5f3;hp=314bf53e60811d2cb2fb7c86b6d9bacb27a28781;hb=4c79a2dabe38ac72eb9eb21620f2ffca5f1885c6;hpb=867d7352a76e0a8a46e64a035f23edcf7d6f49e4 diff --git a/notmuch.c b/notmuch.c index 314bf53e..7360e0e6 100644 --- a/notmuch.c +++ b/notmuch.c @@ -27,8 +27,11 @@ * * The return value will be used as notmuch exit status code, * preferably EXIT_SUCCESS or EXIT_FAILURE. + * + * Each subcommand should be passed either a config object, or an open + * database */ -typedef int (*command_function_t) (notmuch_config_t *config, int argc, char *argv[]); +typedef int (*command_function_t) (notmuch_config_t *config, notmuch_database_t *notmuch, int argc, char *argv[]); typedef struct command { const char *name; @@ -38,10 +41,10 @@ typedef struct command { } command_t; static int -notmuch_help_command (notmuch_config_t *config, int argc, char *argv[]); +notmuch_help_command (notmuch_config_t *config, notmuch_database_t *notmuch, int argc, char *argv[]); static int -notmuch_command (notmuch_config_t *config, int argc, char *argv[]); +notmuch_command (notmuch_config_t *config, notmuch_database_t *notmuch, int argc, char *argv[]); static int _help_for (const char *topic); @@ -140,29 +143,30 @@ static command_t commands[] = { "Notmuch main command." }, { "setup", notmuch_setup_command, NOTMUCH_COMMAND_CONFIG_OPEN | NOTMUCH_COMMAND_CONFIG_CREATE, "Interactively set up notmuch for first use." }, - { "new", notmuch_new_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "new", notmuch_new_command, + NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE | NOTMUCH_COMMAND_DATABASE_CREATE, "Find and import new messages to the notmuch database." }, - { "insert", notmuch_insert_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "insert", notmuch_insert_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Add a new message into the maildir and notmuch database." }, - { "search", notmuch_search_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "search", notmuch_search_command, NOTMUCH_COMMAND_DATABASE_EARLY, "Search for messages matching the given search terms." }, - { "address", notmuch_address_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "address", notmuch_address_command, NOTMUCH_COMMAND_DATABASE_EARLY, "Get addresses from messages matching the given search terms." }, { "show", notmuch_show_command, NOTMUCH_COMMAND_CONFIG_OPEN, "Show all messages matching the search terms." }, - { "count", notmuch_count_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "count", notmuch_count_command, NOTMUCH_COMMAND_DATABASE_EARLY, "Count messages matching the search terms." }, - { "reply", notmuch_reply_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "reply", notmuch_reply_command, NOTMUCH_COMMAND_DATABASE_EARLY, "Construct a reply template for a set of messages." }, - { "tag", notmuch_tag_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "tag", notmuch_tag_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Add/remove tags for all messages matching the search terms." }, - { "dump", notmuch_dump_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "dump", notmuch_dump_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Create a plain-text dump of the tags for each message." }, - { "restore", notmuch_restore_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "restore", notmuch_restore_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Restore the tags from the given dump file (see 'dump')." }, - { "compact", notmuch_compact_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "compact", notmuch_compact_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Compact the notmuch database." }, - { "reindex", notmuch_reindex_command, NOTMUCH_COMMAND_CONFIG_OPEN, + { "reindex", notmuch_reindex_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE, "Re-index all messages matching the search terms." }, { "config", notmuch_config_command, NOTMUCH_COMMAND_CONFIG_OPEN, "Get or set settings in the notmuch configuration file." }, @@ -335,7 +339,7 @@ _help_for (const char *topic_name) } static int -notmuch_help_command (unused (notmuch_config_t *config), int argc, char *argv[]) +notmuch_help_command (unused (notmuch_config_t *config), unused(notmuch_database_t *notmuch), int argc, char *argv[]) { int opt_index; @@ -360,6 +364,7 @@ notmuch_help_command (unused (notmuch_config_t *config), int argc, char *argv[]) */ static int notmuch_command (notmuch_config_t *config, + unused(notmuch_database_t *notmuch), unused(int argc), unused(char **argv)) { char *db_path; @@ -369,7 +374,7 @@ notmuch_command (notmuch_config_t *config, * notmuch_setup_command which will give a nice welcome message, * and interactively guide the user through the configuration. */ if (notmuch_config_is_new (config)) - return notmuch_setup_command (config, 0, NULL); + return notmuch_setup_command (config, NULL, 0, NULL); /* Notmuch is already configured, but is there a database? */ db_path = talloc_asprintf (config, "%s/%s", @@ -453,6 +458,7 @@ main (int argc, char *argv[]) command_t *command; const char *config_file_name = NULL; notmuch_config_t *config = NULL; + notmuch_database_t *notmuch = NULL; int opt_index; int ret; @@ -496,13 +502,60 @@ main (int argc, char *argv[]) goto DONE; } - config = notmuch_config_open (local, config_file_name, command->mode); - if (! config) { - ret = EXIT_FAILURE; - goto DONE; - } + if (command->mode & NOTMUCH_COMMAND_DATABASE_EARLY) { + char *status_string = NULL; + notmuch_database_mode_t mode; + notmuch_status_t status; - ret = (command->function)(config, argc - opt_index, argv + opt_index); + if (command->mode & NOTMUCH_COMMAND_DATABASE_WRITE || + command->mode & NOTMUCH_COMMAND_DATABASE_CREATE) + mode = NOTMUCH_DATABASE_MODE_READ_WRITE; + else + mode = NOTMUCH_DATABASE_MODE_READ_ONLY; + + if (command->mode & NOTMUCH_COMMAND_DATABASE_CREATE) { + status = notmuch_database_create_with_config (NULL, + config_file_name, + NULL, + ¬much, + &status_string); + if (status && status != NOTMUCH_STATUS_DATABASE_EXISTS) { + if (status_string) { + fputs (status_string, stderr); + free (status_string); + } + + if (status == NOTMUCH_STATUS_NO_CONFIG) + fputs ("Try running 'notmuch setup' to create a configuration.", stderr); + + return EXIT_FAILURE; + } + } + + if (notmuch == NULL) { + status = notmuch_database_open_with_config (NULL, + mode, + config_file_name, + NULL, + ¬much, + &status_string); + if (status) { + if (status_string) { + fputs (status_string, stderr); + free (status_string); + } + + return EXIT_FAILURE; + } + } + } else { + config = notmuch_config_open (local, config_file_name, command->mode); + if (! config) { + ret = EXIT_FAILURE; + goto DONE; + } + } + ret = (command->function)(config, notmuch, argc - opt_index, argv + opt_index); DONE: if (config)