Pass error message from GLib ini parser to CLI

The function _notmuch_config_load_from_file is only called in two
places in open.cc. Update internal API to match the idiom in open.cc.
Adding a newline is needed for consistency with other status strings.

Based in part on a patch [1] from Eric Blake.

[1]: id:20230906153402.101471-1-eblake@redhat.com
This commit is contained in:
David Bremner 2023-09-15 09:50:04 -03:00
parent bc38580cef
commit 1c10d91d8e
5 changed files with 20 additions and 6 deletions

View file

@ -416,7 +416,8 @@ _expand_path (void *ctx, const char *key, const char *val)
notmuch_status_t notmuch_status_t
_notmuch_config_load_from_file (notmuch_database_t *notmuch, _notmuch_config_load_from_file (notmuch_database_t *notmuch,
GKeyFile *file) GKeyFile *file,
char **status_string)
{ {
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
gchar **groups = NULL, **keys, *val; gchar **groups = NULL, **keys, *val;
@ -435,6 +436,7 @@ _notmuch_config_load_from_file (notmuch_database_t *notmuch,
for (gchar **keys_p = keys; *keys_p; keys_p++) { for (gchar **keys_p = keys; *keys_p; keys_p++) {
char *absolute_key = talloc_asprintf (notmuch, "%s.%s", *grp, *keys_p); char *absolute_key = talloc_asprintf (notmuch, "%s.%s", *grp, *keys_p);
char *normalized_val; char *normalized_val;
GError *gerr = NULL;
/* If we opened from a given path, do not overwrite it */ /* If we opened from a given path, do not overwrite it */
if (strcmp (absolute_key, "database.path") == 0 && if (strcmp (absolute_key, "database.path") == 0 &&
@ -442,7 +444,14 @@ _notmuch_config_load_from_file (notmuch_database_t *notmuch,
notmuch->xapian_db) notmuch->xapian_db)
continue; continue;
val = g_key_file_get_string (file, *grp, *keys_p, NULL); val = g_key_file_get_string (file, *grp, *keys_p, &gerr);
if (gerr) {
if (status_string)
IGNORE_RESULT (asprintf (status_string,
"GLib: %s\n",
gerr->message));
g_error_free (gerr);
}
if (! val) { if (! val) {
status = NOTMUCH_STATUS_FILE_ERROR; status = NOTMUCH_STATUS_FILE_ERROR;
goto DONE; goto DONE;

View file

@ -726,7 +726,7 @@ notmuch_status_t
_notmuch_config_load_from_database (notmuch_database_t *db); _notmuch_config_load_from_database (notmuch_database_t *db);
notmuch_status_t notmuch_status_t
_notmuch_config_load_from_file (notmuch_database_t *db, GKeyFile *file); _notmuch_config_load_from_file (notmuch_database_t *db, GKeyFile *file, char **status_string);
notmuch_status_t notmuch_status_t
_notmuch_config_load_defaults (notmuch_database_t *db); _notmuch_config_load_defaults (notmuch_database_t *db);

View file

@ -555,7 +555,7 @@ _finish_open (notmuch_database_t *notmuch,
goto DONE; goto DONE;
if (key_file) if (key_file)
status = _notmuch_config_load_from_file (notmuch, key_file); status = _notmuch_config_load_from_file (notmuch, key_file, &message);
if (status) if (status)
goto DONE; goto DONE;
@ -961,7 +961,7 @@ notmuch_database_load_config (const char *database_path,
} }
if (key_file) { if (key_file) {
status = _notmuch_config_load_from_file (notmuch, key_file); status = _notmuch_config_load_from_file (notmuch, key_file, &message);
if (status) if (status)
goto DONE; goto DONE;
} }

View file

@ -563,6 +563,12 @@ main (int argc, char *argv[])
NULL, NULL,
&notmuch, &notmuch,
&status_string); &status_string);
if (status_string) {
fputs (status_string, stderr);
free (status_string);
status_string = NULL;
}
switch (status) { switch (status) {
case NOTMUCH_STATUS_NO_CONFIG: case NOTMUCH_STATUS_NO_CONFIG:
if (! (command->mode & NOTMUCH_COMMAND_CONFIG_CREATE)) { if (! (command->mode & NOTMUCH_COMMAND_CONFIG_CREATE)) {

View file

@ -201,7 +201,6 @@ printf '[query]\nq3=from:\xff\n' >>bad-config
test_expect_code 1 "notmuch --config=./bad-config config list" test_expect_code 1 "notmuch --config=./bad-config config list"
test_begin_subtest "Specific error message about bad utf8" test_begin_subtest "Specific error message about bad utf8"
test_subtest_known_broken
notmuch --config=./bad-config config list 2>ERRORS notmuch --config=./bad-config config list 2>ERRORS
cat <<EOF > EXPECTED cat <<EOF > EXPECTED
GLib: Key file contains key “q3” with value “from:<3A>” which is not UTF-8 GLib: Key file contains key “q3” with value “from:<3A>” which is not UTF-8