X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=lib%2Fopen.cc;h=dc191d64aad0489890aed9bc0af10fd50f7ea8a5;hb=a6a580e61613507edc47e0eac0b2b84f6678d01c;hp=0dfd295f2e8b8da1166cd0e3184789ccef5d0510;hpb=5ec6fd4dcfba0c50bcdec56b4ec51c2ccd1f2e92;p=notmuch diff --git a/lib/open.cc b/lib/open.cc index 0dfd295f..dc191d64 100644 --- a/lib/open.cc +++ b/lib/open.cc @@ -1,4 +1,6 @@ #include +#include + #include "database-private.h" #include "parse-time-vrp.h" @@ -69,39 +71,43 @@ _xdg_dir (void *ctx, } static notmuch_status_t -_choose_hook_dir (notmuch_database_t *notmuch, - const char *profile, - char **message) +_choose_dir (notmuch_database_t *notmuch, + const char *profile, + notmuch_config_key_t key, + const char *xdg_var, + const char *xdg_subdir, + const char *subdir, + char **message = NULL) { - const char *config; - const char *hook_dir; + const char *parent; + const char *dir; struct stat st; int err; - hook_dir = notmuch_config_get (notmuch, NOTMUCH_CONFIG_HOOK_DIR); + dir = notmuch_config_get (notmuch, key); - if (hook_dir) + if (dir) return NOTMUCH_STATUS_SUCCESS; - config = _xdg_dir (notmuch, "XDG_CONFIG_HOME", ".config", profile); - if (! config) + parent = _xdg_dir (notmuch, xdg_var, xdg_subdir, profile); + if (! parent) return NOTMUCH_STATUS_PATH_ERROR; - hook_dir = talloc_asprintf (notmuch, "%s/hooks", config); + dir = talloc_asprintf (notmuch, "%s/%s", parent, subdir); - err = stat (hook_dir, &st); + err = stat (dir, &st); if (err) { if (errno == ENOENT) { - const char *database_path = notmuch_database_get_path (notmuch); - hook_dir = talloc_asprintf (notmuch, "%s/.notmuch/hooks", database_path); + char *notmuch_path = dirname (talloc_strdup (notmuch, notmuch->xapian_path)); + dir = talloc_asprintf (notmuch, "%s/%s", notmuch_path, subdir); } else { IGNORE_RESULT (asprintf (message, "Error: Cannot stat %s: %s.\n", - hook_dir, strerror (errno))); + dir, strerror (errno))); return NOTMUCH_STATUS_FILE_ERROR; } } - _notmuch_config_cache (notmuch, NOTMUCH_CONFIG_HOOK_DIR, hook_dir); + _notmuch_config_cache (notmuch, key, dir); return NOTMUCH_STATUS_SUCCESS; } @@ -181,6 +187,7 @@ _choose_database_path (void *ctx, const char *profile, GKeyFile **key_file, const char **database_path, + bool *split, char **message) { notmuch_status_t status; @@ -203,6 +210,11 @@ _choose_database_path (void *ctx, } } + if (! *database_path) { + *database_path = _xdg_dir (ctx, "XDG_DATA_HOME", ".local/share", profile); + *split = true; + } + if (*database_path == NULL) { *message = strdup ("Error: Cannot open a database for a NULL path.\n"); return NOTMUCH_STATUS_NULL_POINTER; @@ -252,9 +264,9 @@ _trial_open (const char *xapian_path, char **message_ptr) return NOTMUCH_STATUS_SUCCESS; } -static notmuch_status_t -_choose_xapian_path (void *ctx, const char *database_path, const char **xapian_path, - char **message_ptr) +notmuch_status_t +_notmuch_choose_xapian_path (void *ctx, const char *database_path, + const char **xapian_path, char **message_ptr) { notmuch_status_t status; const char *trial_path, *notmuch_path; @@ -268,6 +280,9 @@ _choose_xapian_path (void *ctx, const char *database_path, const char **xapian_p if (status != NOTMUCH_STATUS_PATH_ERROR) goto DONE; + if (*message_ptr) + free (*message_ptr); + notmuch_path = talloc_asprintf (ctx, "%s/.notmuch", database_path); status = _db_dir_exists (notmuch_path, message_ptr); if (status) @@ -420,10 +435,23 @@ _finish_open (notmuch_database_t *notmuch, if (status) goto DONE; - status = _choose_hook_dir (notmuch, profile, &message); + status = _choose_dir (notmuch, profile, + NOTMUCH_CONFIG_HOOK_DIR, + "XDG_CONFIG_HOME", + ".config", + "hooks", + &message); if (status) goto DONE; + status = _choose_dir (notmuch, profile, + NOTMUCH_CONFIG_BACKUP_DIR, + "XDG_DATA_HOME", + ".local/share", + "backups", + &message); + if (status) + goto DONE; status = _notmuch_config_load_defaults (notmuch); if (status) goto DONE; @@ -462,6 +490,7 @@ notmuch_database_open_with_config (const char *database_path, notmuch_database_t *notmuch = NULL; char *message = NULL; GKeyFile *key_file = NULL; + bool split = false; _init_libs (); @@ -471,7 +500,8 @@ notmuch_database_open_with_config (const char *database_path, goto DONE; } - if ((status = _choose_database_path (local, config_path, profile, &key_file, &database_path, + if ((status = _choose_database_path (local, config_path, profile, + &key_file, &database_path, &split, &message))) goto DONE; @@ -481,7 +511,8 @@ notmuch_database_open_with_config (const char *database_path, _set_database_path (notmuch, database_path); - status = _choose_xapian_path (notmuch, database_path, ¬much->xapian_path, &message); + status = _notmuch_choose_xapian_path (notmuch, database_path, + ¬much->xapian_path, &message); if (status) goto DONE; @@ -563,7 +594,8 @@ notmuch_database_create_with_config (const char *database_path, _init_libs (); if ((status = _choose_database_path (local, config_path, profile, - &key_file, &database_path, &message))) + &key_file, &database_path, &split, + &message))) goto DONE; status = _db_dir_exists (database_path, &message); @@ -619,6 +651,9 @@ notmuch_database_create_with_config (const char *database_path, goto DONE; } + if (message) + free (message); + status = _finish_open (notmuch, profile, NOTMUCH_DATABASE_MODE_READ_WRITE,