diff --git a/lib/open.cc b/lib/open.cc index d0493950..387e4ddb 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -209,8 +209,8 @@ _choose_database_path (void *ctx, } if (*database_path == NULL) { - *message = strdup ("Error: Cannot open a database for a NULL path.\n"); - return NOTMUCH_STATUS_NULL_POINTER; + *message = strdup ("Error: could not locate database.\n"); + return NOTMUCH_STATUS_NO_DATABASE; } if (*database_path[0] != '/') { @@ -750,12 +750,12 @@ _maybe_load_config_from_database (notmuch_database_t *notmuch, char *message; /* ignored */ if (_db_dir_exists (database_path, &message)) - return NOTMUCH_STATUS_SUCCESS; + return NOTMUCH_STATUS_NO_DATABASE; _set_database_path (notmuch, database_path); if (_notmuch_choose_xapian_path (notmuch, database_path, ¬much->xapian_path, &message)) - return NOTMUCH_STATUS_SUCCESS; + return NOTMUCH_STATUS_NO_DATABASE; (void) _finish_open (notmuch, profile, NOTMUCH_DATABASE_MODE_READ_ONLY, key_file, &message); @@ -798,19 +798,27 @@ notmuch_database_load_config (const char *database_path, status = _choose_database_path (local, profile, key_file, &database_path, &split, &message); switch (status) { - /* weirdly NULL_POINTER is what is returned if we fail to find - * a database */ - case NOTMUCH_STATUS_NULL_POINTER: + case NOTMUCH_STATUS_NO_DATABASE: case NOTMUCH_STATUS_SUCCESS: + if (! warning) + warning = status; break; default: goto DONE; } + if (database_path) { status = _maybe_load_config_from_database (notmuch, key_file, database_path, profile); - if (status) + switch (status) { + case NOTMUCH_STATUS_NO_DATABASE: + case NOTMUCH_STATUS_SUCCESS: + if (! warning) + warning = status; + break; + default: goto DONE; + } } if (key_file) { diff --git a/notmuch.c b/notmuch.c index ff9ad18b..bcb4b768 100644 --- a/notmuch.c +++ b/notmuch.c @@ -380,34 +380,12 @@ notmuch_command (notmuch_config_t *config, notmuch_database_t *notmuch, unused(int argc), unused(char **argv)) { - char *db_path; - struct stat st; - /* If the user has never configured notmuch, then run * 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, notmuch, 0, NULL); - /* Notmuch is already configured, but is there a database? */ - db_path = talloc_asprintf (config, "%s/%s", - notmuch_config_get (notmuch, NOTMUCH_CONFIG_DATABASE_PATH), - ".notmuch"); - if (stat (db_path, &st)) { - if (errno != ENOENT) { - fprintf (stderr, "Error looking for notmuch database at %s: %s\n", - db_path, strerror (errno)); - return EXIT_FAILURE; - } - printf ("Notmuch is configured, but there's not yet a database at\n\n\t%s\n\n", - db_path); - printf ("You probably want to run \"notmuch new\" now to create that database.\n\n" - "Note that the first run of \"notmuch new\" can take a very long time\n" - "and that the resulting database will use roughly the same amount of\n" - "storage space as the email being indexed.\n\n"); - return EXIT_SUCCESS; - } - printf ("Notmuch is configured and appears to have a database. Excellent!\n\n" "At this point you can start exploring the functionality of notmuch by\n" "using commands such as:\n\n" @@ -576,12 +554,27 @@ main (int argc, char *argv[]) fputs ("Try running 'notmuch setup' to create a configuration.", stderr); goto DONE; } - - if (status && (status != NOTMUCH_STATUS_NO_CONFIG)) { - if (status_string) { - fputs (status_string, stderr); - free (status_string); + switch (status) { + case NOTMUCH_STATUS_NO_CONFIG: + if (! (command->mode & NOTMUCH_COMMAND_CONFIG_CREATE)) { + fputs ("Try running 'notmuch setup' to create a configuration.", stderr); + goto DONE; } + break; + case NOTMUCH_STATUS_NO_DATABASE: + if (! command_name) { + printf ("Notmuch is configured, but no database was found.\n"); + printf ("You probably want to run \"notmuch new\" now to create a database.\n\n" + "Note that the first run of \"notmuch new\" can take a very long time\n" + "and that the resulting database will use roughly the same amount of\n" + "storage space as the email being indexed.\n\n"); + status = NOTMUCH_STATUS_SUCCESS; + goto DONE; + } + break; + case NOTMUCH_STATUS_SUCCESS: + break; + default: goto DONE; } diff --git a/test/T040-setup.sh b/test/T040-setup.sh index daeca3e4..42c621c8 100755 --- a/test/T040-setup.sh +++ b/test/T040-setup.sh @@ -26,11 +26,8 @@ test_expect_equal_file ${expected_dir}/config-with-comments new-notmuch-config test_begin_subtest "notmuch with a config but without a database suggests notmuch new" notmuch 2>&1 | notmuch_dir_sanitize > OUTPUT cat < EXPECTED -Notmuch is configured, but there's not yet a database at - - MAIL_DIR/.notmuch - -You probably want to run "notmuch new" now to create that database. +Notmuch is configured, but no database was found. +You probably want to run "notmuch new" now to create a database. Note that the first run of "notmuch new" can take a very long time and that the resulting database will use roughly the same amount of diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh index d8828342..0a34e67f 100755 --- a/test/T055-path-config.sh +++ b/test/T055-path-config.sh @@ -199,6 +199,22 @@ EOF "$output" \ "Welcome to a new version of notmuch! Your database will now be upgraded." + test_begin_subtest "notmuch +config -database suggests notmuch new ($config)" + mv "$XAPIAN_PATH" "${XAPIAN_PATH}.bak" + notmuch > OUTPUT +cat < EXPECTED +Notmuch is configured, but no database was found. +You probably want to run "notmuch new" now to create a database. + +Note that the first run of "notmuch new" can take a very long time +and that the resulting database will use roughly the same amount of +storage space as the email being indexed. + +EOF + mv "${XAPIAN_PATH}.bak" "$XAPIAN_PATH" + + test_expect_equal_file EXPECTED OUTPUT + restore_config done