summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-02-16 20:08:23 -0400
committerDavid Bremner <david@tethera.net>2021-03-20 07:41:04 -0300
commit5ec6fd4dcfba0c50bcdec56b4ec51c2ccd1f2e92 (patch)
tree87541dc69c10fb92602b6ccaec4857158c1a8c61
parente823d05ae6dc920d4fc9abf774c3d2575d891d7b (diff)
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.
-rw-r--r--lib/open.cc53
-rwxr-xr-xtest/T055-path-config.sh15
2 files changed, 53 insertions, 15 deletions
diff --git a/lib/open.cc b/lib/open.cc
index 8fc17caf..0dfd295f 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -545,11 +545,12 @@ notmuch_database_create_with_config (const char *database_path,
{
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
notmuch_database_t *notmuch = NULL;
- char *notmuch_path = NULL;
+ const char *notmuch_path = NULL;
char *message = NULL;
GKeyFile *key_file = NULL;
void *local = talloc_new (NULL);
int err;
+ bool split = false;
_init_libs ();
@@ -571,20 +572,38 @@ notmuch_database_create_with_config (const char *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);
- 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;
+ split = (mail_root && (0 != strcmp (mail_root, db_path)));
+
+ free (mail_root);
+ free (db_path);
+ }
+
+ if (split) {
+ notmuch_path = database_path;
+ } else {
+ 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"))) {
@@ -592,6 +611,14 @@ notmuch_database_create_with_config (const char *database_path,
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,
profile,
NOTMUCH_DATABASE_MODE_READ_WRITE,
diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh
index c6920ca9..19a8a4ab 100755
--- a/test/T055-path-config.sh
+++ b/test/T055-path-config.sh
@@ -27,9 +27,17 @@ split_config () {
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; do
+for config in traditional split symlink; do
# start each set of tests with a known set of messages
add_email_corpus
@@ -41,6 +49,9 @@ for config in traditional split; do
split_config
mv mail/.notmuch/xapian $DATABASE_PATH
;;
+ symlink)
+ symlink_config
+ ;;
esac
test_begin_subtest "count ($config)"