lib/open: set HOOK_DIR on open

This is a simple two step path search.  Most error checking is
deferred until running the hooks.
This commit is contained in:
David Bremner 2021-01-09 15:05:58 -04:00
parent 4922416ccc
commit 0345bc57a0
2 changed files with 74 additions and 1 deletions

View file

@ -68,6 +68,44 @@ _xdg_dir (void *ctx,
profile_name); profile_name);
} }
static notmuch_status_t
_choose_hook_dir (notmuch_database_t *notmuch,
const char *profile,
char **message)
{
const char *config;
const char *hook_dir;
struct stat st;
int err;
hook_dir = notmuch_config_get (notmuch, NOTMUCH_CONFIG_HOOK_DIR);
if (hook_dir)
return NOTMUCH_STATUS_SUCCESS;
config = _xdg_dir (notmuch, "XDG_CONFIG_HOME", ".config", profile);
if (! config)
return NOTMUCH_STATUS_PATH_ERROR;
hook_dir = talloc_asprintf (notmuch, "%s/hooks", config);
err = stat (hook_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);
} else {
IGNORE_RESULT (asprintf (message, "Error: Cannot stat %s: %s.\n",
hook_dir, strerror (errno)));
return NOTMUCH_STATUS_FILE_ERROR;
}
}
_notmuch_config_cache (notmuch, NOTMUCH_CONFIG_HOOK_DIR, hook_dir);
return NOTMUCH_STATUS_SUCCESS;
}
static notmuch_status_t static notmuch_status_t
_load_key_file (const char *path, _load_key_file (const char *path,
const char *profile, const char *profile,
@ -301,6 +339,10 @@ notmuch_database_open_with_config (const char *database_path,
if (status) if (status)
goto DONE; goto DONE;
status = _choose_hook_dir (notmuch, profile, &message);
if (status)
goto DONE;
status = _notmuch_config_load_defaults (notmuch); status = _notmuch_config_load_defaults (notmuch);
if (status) if (status)
goto DONE; goto DONE;

View file

@ -201,6 +201,37 @@ EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
restore_database restore_database
test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: traditional"
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
{
const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
printf("database.hook_dir = %s\n", val);
}
EOF
cat <<'EOF' >EXPECTED
== stdout ==
database.hook_dir = MAIL_DIR/.notmuch/hooks
== stderr ==
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "NOTMUCH_CONFIG_HOOK_DIR: xdg"
dir="${HOME}/.config/notmuch/default/hooks"
mkdir -p $dir
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
{
const char *val = notmuch_config_get (db, NOTMUCH_CONFIG_HOOK_DIR);
printf("database.hook_dir = %s\n", val);
}
EOF
cat <<'EOF' >EXPECTED
== stdout ==
database.hook_dir = CWD/home/.config/notmuch/default/hooks
== stderr ==
EOF
rmdir $dir
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "notmuch_config_get_values" test_begin_subtest "notmuch_config_get_values"
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL% cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} ${NOTMUCH_CONFIG} %NULL%
{ {
@ -333,7 +364,7 @@ EOF
cat <<'EOF' >EXPECTED cat <<'EOF' >EXPECTED
== stdout == == stdout ==
MAIL_DIR MAIL_DIR
NULL MAIL_DIR/.notmuch/hooks
inbox;unread inbox;unread
NULL NULL