On Sat, Jan 16 2021, David Bremner wrote: In id:20210116170406.842014-4-david@tethera.net there is missing space after , gchar **groups,**keys, *val; Here, perhaps s/This commits fills in/Fill in/ (?) > This commit fills in the remainder of the documented functionality for > n_d_open_with_config with respect to config file location. Similar > searching default locations of the database file still needs to be > added. > --- > lib/open.cc | 95 +++++++++++++++++++++---- > test/T590-libconfig.sh | 153 ++++++++++++++++++++++++++++++++++++++--- > 2 files changed, 227 insertions(+), 21 deletions(-) > > diff --git a/lib/open.cc b/lib/open.cc > index 7acaea7b..76255283 100644 > --- a/lib/open.cc > +++ b/lib/open.cc > @@ -37,6 +37,82 @@ notmuch_database_open_verbose (const char *path, > database, status_string); > } > > +static const char * > +_xdg_dir (void *ctx, > + const char *xdg_root_variable, > + const char *xdg_prefix, > + const char *profile_name) > +{ > + const char *xdg_root = getenv (xdg_root_variable); > + const char *home = getenv ("HOME"); Resolving HOME from env is not needed always, move it inside next if() -- that will also make its scope smaller. > + > + if (! xdg_root) { > + if (! home) return NULL; > + > + xdg_root = talloc_asprintf (ctx, > + "%s/%s", > + home, > + xdg_prefix); > + } > + > + if (! profile_name) > + profile_name = getenv ("NOTMUCH_PROFILE"); > + > + if (! profile_name) > + profile_name = "default"; > + > + return talloc_asprintf (ctx, > + "%s/notmuch/%s", > + xdg_root, > + profile_name); > +} > + > +static notmuch_status_t > +_load_key_file (const char *path, > + const char *profile, > + GKeyFile **key_file) > +{ > + notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; > + void *local = talloc_new (NULL); > + > + if (path && EMPTY_STRING (path)) > + goto DONE; > + > + if (! path) > + path = getenv ("NOTMUCH_CONFIG"); > + > + if (! path) { > + const char *dir = _xdg_dir (local, "XDG_CONFIG_HOME", ".config", profile); > + > + if (dir) { > + path = talloc_asprintf (local, "%s/config", dir); > + if (access (path, R_OK) !=0) > + path = NULL; > + } > + } > + > + if (! path) { > + const char *home = getenv ("HOME"); > + > + path = talloc_asprintf (local, "%s/.notmuch-config", home); > + > + if (! profile) > + profile = getenv ("NOTMUCH_PROFILE"); > + > + if (profile) > + path = talloc_asprintf (local, "%s.%s", path, profile); > + } > + > + *key_file = g_key_file_new (); > + if (! g_key_file_load_from_file (*key_file, path, G_KEY_FILE_NONE, NULL)) { > + status = NOTMUCH_STATUS_FILE_ERROR; > + } > + > +DONE: > + talloc_free (local); > + return status; > +} > + > notmuch_status_t > notmuch_database_open_with_config (const char *database_path, > notmuch_database_mode_t mode, > @@ -49,7 +125,6 @@ notmuch_database_open_with_config (const char *database_path, > void *local = talloc_new (NULL); > notmuch_database_t *notmuch = NULL; > char *notmuch_path, *xapian_path, *incompat_features; > - char *configured_database_path = NULL; > char *message = NULL; > struct stat st; > int err; > @@ -57,18 +132,14 @@ notmuch_database_open_with_config (const char *database_path, > GKeyFile *key_file = NULL; > static int initialized = 0; > > - /* XXX TODO: default locations for NULL case, handle profiles */ > - if (config_path != NULL && ! EMPTY_STRING (config_path)) { > - key_file = g_key_file_new (); > - if (! g_key_file_load_from_file (key_file, config_path, G_KEY_FILE_NONE, NULL)) { > - status = NOTMUCH_STATUS_FILE_ERROR; > - goto DONE; > - } > - configured_database_path = g_key_file_get_value (key_file, "database", "path", NULL); > + status = _load_key_file (config_path, profile, &key_file); > + if (status) { > + message = strdup ("Error: cannot load config file"); > + goto DONE; > } > - > - if (database_path == NULL) > - database_path = configured_database_path; > + > + if (! database_path && key_file) > + database_path = g_key_file_get_value (key_file, "database", "path", NULL); > > if (database_path == NULL) { > message = strdup ("Error: Cannot open a database for a NULL path.\n"); > diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh > index 5fb1bb87..2986284a 100755 > --- a/test/T590-libconfig.sh > +++ b/test/T590-libconfig.sh > @@ -15,14 +15,21 @@ int main (int argc, char** argv) > notmuch_database_t *db; > char *val; > notmuch_status_t stat; > + char *msg = NULL; > > - EXPECT0(notmuch_database_open_with_config (argv[1], > + for (int i=1; i<argc; i++) spaces > + if (strcmp (argv[i], "%NULL%") == 0) argv[i] = NULL; > + > + stat = notmuch_database_open_with_config (argv[1], > NOTMUCH_DATABASE_MODE_READ_WRITE, > argv[2], > - NULL, > + argv[3], > &db, > - NULL)); > - > + &msg); > + if (stat != NOTMUCH_STATUS_SUCCESS) { > + fprintf (stderr, "error opening database: %d %s\n", stat, msg ? msg : ""); > + exit (1); > + } > EOF > > cat <<EOF > c_tail > @@ -51,7 +58,7 @@ test_expect_equal_file EXPECTED OUTPUT > > > test_begin_subtest "notmuch_database_get_config_list: empty list" > -cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% > { > notmuch_config_list_t *list; > EXPECT0(notmuch_database_get_config_list (db, "nonexistent", &list)); > @@ -83,7 +90,7 @@ EOF > test_expect_equal_file EXPECTED OUTPUT > > test_begin_subtest "notmuch_database_get_config_list: all pairs" > -cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% > { > notmuch_config_list_t *list; > EXPECT0(notmuch_database_set_config (db, "zzzafter", "afterval")); > @@ -128,7 +135,7 @@ EOF > test_expect_equal_file EXPECTED OUTPUT > > test_begin_subtest "notmuch_database_get_config_list: one prefix" > -cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% > { > notmuch_config_list_t *list; > EXPECT0(notmuch_database_get_config_list (db, "test.key", &list)); > @@ -147,7 +154,7 @@ EOF > test_expect_equal_file EXPECTED OUTPUT > > test_begin_subtest "dump config" > -cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% > { > EXPECT0(notmuch_database_set_config (db, "key with spaces", "value, with, spaces!")); > } > @@ -165,7 +172,7 @@ test_expect_equal_file EXPECTED OUTPUT > > test_begin_subtest "restore config" > notmuch dump --include=config >EXPECTED > -cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% > { > EXPECT0(notmuch_database_set_config (db, "test.key1", "mutatedvalue")); > } > @@ -194,4 +201,132 @@ EOF > test_expect_equal_file EXPECTED OUTPUT > restore_database > > +backup_database > +test_begin_subtest "override config from \${NOTMUCH_CONFIG}" > +notmuch config set test.key1 overridden > +# second argument omitted to make argv[2] == NULL > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} > +{ > + EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); > + printf("test.key1 = %s\n", val); > + EXPECT0(notmuch_database_get_config (db, "test.key2", &val)); > + printf("test.key2 = %s\n", val); > +} > +EOF > +notmuch config set test.key1 > +cat <<'EOF' >EXPECTED > +== stdout == > +test.key1 = overridden > +test.key2 = testvalue2 > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > +restore_database > + > +backup_database > +test_begin_subtest "override config from \${HOME}/.notmuch-config" > +ovconfig=${HOME}/.notmuch-config > +cp ${NOTMUCH_CONFIG} ${ovconfig} > +old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG} > +unset NOTMUCH_CONFIG > +notmuch --config=${ovconfig} config set test.key1 overridden-home > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL% > +{ > + EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); > + printf("test.key1 = %s\n", val); > + EXPECT0(notmuch_database_get_config (db, "test.key2", &val)); > + printf("test.key2 = %s\n", val); > +} > +EOF > +rm -f ${ovconfig} > +NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG} > +cat <<'EOF' >EXPECTED > +== stdout == > +test.key1 = overridden-home > +test.key2 = testvalue2 > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > +restore_database > + > +backup_database > +test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch" > +ovconfig=${HOME}/.config/notmuch/default/config > +mkdir -p $(dirname ${ovconfig}) > +cp ${NOTMUCH_CONFIG} ${ovconfig} > +old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG} > +unset NOTMUCH_CONFIG > +notmuch --config=${ovconfig} config set test.key1 overridden-xdg > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL% > +{ > + EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); > + printf("test.key1 = %s\n", val); > + EXPECT0(notmuch_database_get_config (db, "test.key2", &val)); > + printf("test.key2 = %s\n", val); > +} > +EOF > +rm -f ${ovconfig} > +NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG} > +cat <<'EOF' >EXPECTED > +== stdout == > +test.key1 = overridden-xdg > +test.key2 = testvalue2 > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > +restore_database > + > +backup_database > +test_begin_subtest "override config from \${XDG_CONFIG_HOME}/notmuch with profile" > +ovconfig=${HOME}/.config/notmuch/work/config > +mkdir -p $(dirname ${ovconfig}) > +cp ${NOTMUCH_CONFIG} ${ovconfig} > +old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG} > +unset NOTMUCH_CONFIG > +notmuch --config=${ovconfig} config set test.key1 overridden-xdg-profile > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work > +{ > + EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); > + printf("test.key1 = %s\n", val); > + EXPECT0(notmuch_database_get_config (db, "test.key2", &val)); > + printf("test.key2 = %s\n", val); > +} > +EOF > +rm -f ${ovconfig} > +NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG} > +cat <<'EOF' >EXPECTED > +== stdout == > +test.key1 = overridden-xdg-profile > +test.key2 = testvalue2 > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > +restore_database > + > +backup_database > +test_begin_subtest "override config from \${HOME}/.notmuch-config.work (via args)" (left out comments where "s could be replaced w/ 's (and w/o \ before $)) > +ovconfig=${HOME}/.notmuch-config.work > +cp ${NOTMUCH_CONFIG} ${ovconfig} > +old_NOTMUCH_CONFIG=${NOTMUCH_CONFIG} > +unset NOTMUCH_CONFIG > +notmuch --config=${ovconfig} config set test.key1 overridden-profile > +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% work > +{ > + EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); > + printf("test.key1 = %s\n", val); > + EXPECT0(notmuch_database_get_config (db, "test.key2", &val)); > + printf("test.key2 = %s\n", val); > +} > +EOF > +#rm -f ${ovconfig} > +NOTMUCH_CONFIG=${old_NOTMUCH_CONFIG} > +cat <<'EOF' >EXPECTED > +== stdout == > +test.key1 = overridden-profile > +test.key2 = testvalue2 > +== stderr == > +EOF > +test_expect_equal_file EXPECTED OUTPUT > +restore_database > + > test_done > -- > 2.29.2 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-leave@notmuchmail.org