lib/open: check for split configuration when creating database.

The main functionality will be tested when notmuch-new is converted to
support split configuration. Here only the somewhat odd case of split
mail root which is actually symlinked to the database path is tested.
This commit is contained in:
David Bremner 2021-02-16 20:08:23 -04:00
parent e823d05ae6
commit 5ec6fd4dcf
2 changed files with 53 additions and 15 deletions

View file

@ -545,11 +545,12 @@ notmuch_database_create_with_config (const char *database_path,
{ {
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
notmuch_database_t *notmuch = NULL; notmuch_database_t *notmuch = NULL;
char *notmuch_path = NULL; const char *notmuch_path = NULL;
char *message = NULL; char *message = NULL;
GKeyFile *key_file = NULL; GKeyFile *key_file = NULL;
void *local = talloc_new (NULL); void *local = talloc_new (NULL);
int err; int err;
bool split = false;
_init_libs (); _init_libs ();
@ -571,20 +572,38 @@ notmuch_database_create_with_config (const char *database_path,
_set_database_path (notmuch, database_path); _set_database_path (notmuch, database_path);
notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"); if (key_file && ! split) {
char *mail_root = canonicalize_file_name (
g_key_file_get_value (key_file, "database", "mail_root", NULL));
char *db_path = canonicalize_file_name (database_path);
err = mkdir (notmuch_path, 0755); split = (mail_root && (0 != strcmp (mail_root, db_path)));
if (err) {
if (errno == EEXIST) { free (mail_root);
status = NOTMUCH_STATUS_DATABASE_EXISTS; free (db_path);
talloc_free (notmuch); }
notmuch = NULL;
} else { if (split) {
IGNORE_RESULT (asprintf (&message, "Error: Cannot create directory %s: %s.\n", notmuch_path = database_path;
notmuch_path, strerror (errno))); } else {
status = NOTMUCH_STATUS_FILE_ERROR; if (! (notmuch_path = talloc_asprintf (local, "%s/%s", database_path, ".notmuch"))) {
status = NOTMUCH_STATUS_OUT_OF_MEMORY;
goto DONE;
}
err = mkdir (notmuch_path, 0755);
if (err) {
if (errno == EEXIST) {
status = NOTMUCH_STATUS_DATABASE_EXISTS;
talloc_free (notmuch);
notmuch = NULL;
} else {
IGNORE_RESULT (asprintf (&message, "Error: Cannot create directory %s: %s.\n",
notmuch_path, strerror (errno)));
status = NOTMUCH_STATUS_FILE_ERROR;
}
goto DONE;
} }
goto DONE;
} }
if (! (notmuch->xapian_path = talloc_asprintf (notmuch, "%s/%s", notmuch_path, "xapian"))) { if (! (notmuch->xapian_path = talloc_asprintf (notmuch, "%s/%s", notmuch_path, "xapian"))) {
@ -592,6 +611,14 @@ notmuch_database_create_with_config (const char *database_path,
goto DONE; goto DONE;
} }
status = _trial_open (notmuch->xapian_path, &message);
if (status == NOTMUCH_STATUS_SUCCESS) {
notmuch_database_destroy (notmuch);
notmuch = NULL;
status = NOTMUCH_STATUS_DATABASE_EXISTS;
goto DONE;
}
status = _finish_open (notmuch, status = _finish_open (notmuch,
profile, profile,
NOTMUCH_DATABASE_MODE_READ_WRITE, NOTMUCH_DATABASE_MODE_READ_WRITE,

View file

@ -27,9 +27,17 @@ split_config () {
DATABASE_PATH=$dir DATABASE_PATH=$dir
} }
symlink_config () {
local dir
backup_config
dir="$TMP_DIRECTORY/link.$test_count"
ln -s $MAIL_DIR $dir
notmuch config set database.path $dir
notmuch config set database.mail_root $MAIL_DIR
unset DATABASE_PATH
}
for config in traditional split symlink; do
for config in traditional split; do
# start each set of tests with a known set of messages # start each set of tests with a known set of messages
add_email_corpus add_email_corpus
@ -41,6 +49,9 @@ for config in traditional split; do
split_config split_config
mv mail/.notmuch/xapian $DATABASE_PATH mv mail/.notmuch/xapian $DATABASE_PATH
;; ;;
symlink)
symlink_config
;;
esac esac
test_begin_subtest "count ($config)" test_begin_subtest "count ($config)"