[PATCH 17/22] lib/open: support XDG_DATA_HOME as a fallback database location.

2021-03-14 Thread David Bremner
This changes some error reporting, either intentionally by reporting
the highest level missing directory, or by side effect from looking in
XDG locations when given null database location.
---
 lib/open.cc  | 13 +++--
 test/T055-path-config.sh | 35 +--
 test/T560-lib-error.sh   |  4 ++--
 test/T590-libconfig.sh   |  4 ++--
 4 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/lib/open.cc b/lib/open.cc
index 2816f72a..3097121e 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -181,6 +181,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 +204,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;
@@ -462,6 +468,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 +478,8 @@ notmuch_database_open_with_config (const char 
*database_path,
goto DONE;
 }
 
-if ((status = _choose_database_path (local, config_path, profile, 
_file, _path,
+if ((status = _choose_database_path (local, config_path, profile,
+_file, _path, ,
 )))
goto DONE;
 
@@ -563,7 +571,8 @@ notmuch_database_create_with_config (const char 
*database_path,
 _init_libs ();
 
 if ((status = _choose_database_path (local, config_path, profile,
-_file, _path, )))
+_file, _path, ,
+)))
goto DONE;
 
 status = _db_dir_exists (database_path, );
diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh
index 6df17f80..f9a8e200 100755
--- a/test/T055-path-config.sh
+++ b/test/T055-path-config.sh
@@ -37,8 +37,31 @@ symlink_config () {
 unset DATABASE_PATH
 }
 
-for config in traditional split symlink; do
-# start each set of tests with a known set of messages
+xdg_config () {
+local dir
+local profile=${1:-default}
+
+if [[ $profile != default ]]; then
+   export NOTMUCH_PROFILE=$profile
+fi
+
+backup_config
+DATABASE_PATH="${HOME}/.local/share/notmuch/${profile}"
+rm -rf $DATABASE_PATH
+mkdir -p $DATABASE_PATH
+
+config_dir="${HOME}/.config/notmuch/${profile}"
+mkdir -p ${config_dir}
+CONFIG_PATH=$config_dir/config
+mv ${NOTMUCH_CONFIG} $CONFIG_PATH
+unset NOTMUCH_CONFIG
+
+notmuch --config=${CONFIG_PATH} config set database.mail_root 
${TMP_DIRECTORY}/mail
+notmuch --config=${CONFIG_PATH} config set database.path
+}
+
+for config in traditional split XDG XDG+profile symlink; do
+#start each set of tests with an known set of messages
 add_email_corpus
 
 case $config in
@@ -49,6 +72,14 @@ for config in traditional split symlink; do
split_config
mv mail/.notmuch/xapian $DATABASE_PATH
;;
+   XDG)
+   xdg_config
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
+   XDG+profile)
+   xdg_config ${RANDOM}
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
symlink)
symlink_config
;;
diff --git a/test/T560-lib-error.sh b/test/T560-lib-error.sh
index 03df69d9..89447e9a 100755
--- a/test/T560-lib-error.sh
+++ b/test/T560-lib-error.sh
@@ -22,7 +22,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
@@ -93,7 +93,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 5cf70987..c21c139b 100755
--- a/test/T590-libconfig.sh
+++ b/test/T590-libconfig.sh
@@ -519,8 +519,8 @@ cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
 error opening database
-Erroneous NULL pointer
-Error: Cannot open a database for a NULL path.
+Something went wrong trying to read or write a file
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 
 EOF
 

[PATCH 17/22] lib/open: support XDG_DATA_HOME as a fallback database location.

2021-03-07 Thread David Bremner
This changes some error reporting, either intentionally by reporting
the highest level missing directory, or by side effect from looking in
XDG locations when given null database location.
---
 lib/open.cc  | 14 --
 test/T055-path-config.sh | 35 +--
 test/T560-lib-error.sh   |  4 ++--
 test/T590-libconfig.sh   |  4 ++--
 4 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/lib/open.cc b/lib/open.cc
index 1ad026fb..95c93744 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -181,6 +181,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 +204,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;
@@ -459,6 +465,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 ();
 
@@ -468,7 +475,9 @@ notmuch_database_open_with_config (const char 
*database_path,
goto DONE;
 }
 
-if ((status = _choose_database_path (local, config_path, profile, 
_file, _path, )))
+if ((status = _choose_database_path (local, config_path, profile,
+_file, _path, ,
+)))
goto DONE;
 
 status = _db_dir_exists (database_path, );
@@ -557,7 +566,8 @@ notmuch_database_create_with_config (const char 
*database_path,
 }
 
 if ((status = _choose_database_path (local, config_path, profile,
-_file, _path, )))
+_file, _path, ,
+)))
goto DONE;
 
 status = _db_dir_exists (database_path, );
diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh
index 6df17f80..f9a8e200 100755
--- a/test/T055-path-config.sh
+++ b/test/T055-path-config.sh
@@ -37,8 +37,31 @@ symlink_config () {
 unset DATABASE_PATH
 }
 
-for config in traditional split symlink; do
-# start each set of tests with a known set of messages
+xdg_config () {
+local dir
+local profile=${1:-default}
+
+if [[ $profile != default ]]; then
+   export NOTMUCH_PROFILE=$profile
+fi
+
+backup_config
+DATABASE_PATH="${HOME}/.local/share/notmuch/${profile}"
+rm -rf $DATABASE_PATH
+mkdir -p $DATABASE_PATH
+
+config_dir="${HOME}/.config/notmuch/${profile}"
+mkdir -p ${config_dir}
+CONFIG_PATH=$config_dir/config
+mv ${NOTMUCH_CONFIG} $CONFIG_PATH
+unset NOTMUCH_CONFIG
+
+notmuch --config=${CONFIG_PATH} config set database.mail_root 
${TMP_DIRECTORY}/mail
+notmuch --config=${CONFIG_PATH} config set database.path
+}
+
+for config in traditional split XDG XDG+profile symlink; do
+#start each set of tests with an known set of messages
 add_email_corpus
 
 case $config in
@@ -49,6 +72,14 @@ for config in traditional split symlink; do
split_config
mv mail/.notmuch/xapian $DATABASE_PATH
;;
+   XDG)
+   xdg_config
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
+   XDG+profile)
+   xdg_config ${RANDOM}
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
symlink)
symlink_config
;;
diff --git a/test/T560-lib-error.sh b/test/T560-lib-error.sh
index 03df69d9..89447e9a 100755
--- a/test/T560-lib-error.sh
+++ b/test/T560-lib-error.sh
@@ -22,7 +22,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
@@ -93,7 +93,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 5cf70987..c21c139b 100755
--- a/test/T590-libconfig.sh
+++ b/test/T590-libconfig.sh
@@ -519,8 +519,8 @@ cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
 error opening database
-Erroneous NULL pointer
-Error: Cannot open a database for a NULL path.
+Something went wrong trying to read or write a file
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or 

[PATCH 17/22] lib/open: support XDG_DATA_HOME as a fallback database location.

2021-03-04 Thread David Bremner
This changes some error reporting, either intentionally by reporting
the highest level missing directory, or by side effect from looking in
XDG locations when given null database location.
---
 lib/open.cc  | 18 +++---
 test/T055-path-config.sh | 35 +--
 test/T560-lib-error.sh   |  4 ++--
 test/T590-libconfig.sh   |  4 ++--
 4 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/lib/open.cc b/lib/open.cc
index 0b3b9ca4..a21f6252 100644
--- a/lib/open.cc
+++ b/lib/open.cc
@@ -176,10 +176,12 @@ _db_dir_exists (const char *database_path, char **message)
 }
 
 static notmuch_status_t
-_choose_database_path (const char *config_path,
+_choose_database_path (void * ctx,
+   const char *config_path,
   const char *profile,
   GKeyFile **key_file,
   const char **database_path,
+  bool *split,
   char **message)
 {
 notmuch_status_t status;
@@ -197,6 +199,11 @@ _choose_database_path (const char *config_path,
 if (! *database_path && *key_file)
*database_path = g_key_file_get_value (*key_file, "database", "path", 
NULL);
 
+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;
@@ -446,6 +453,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 ();
 
@@ -455,7 +463,9 @@ notmuch_database_open_with_config (const char 
*database_path,
goto DONE;
 }
 
-if ((status = _choose_database_path (config_path, profile, _file, 
_path, )))
+if ((status = _choose_database_path (local, config_path, profile,
+_file, _path, ,
+)))
goto DONE;
 
 status = _db_dir_exists (database_path, );
@@ -540,7 +550,9 @@ notmuch_database_create_with_config (const char 
*database_path,
goto DONE;
 }
 
-if ((status = _choose_database_path (config_path, profile, _file, 
_path, )))
+if ((status = _choose_database_path (local, config_path, profile,
+_file, _path, ,
+)))
goto DONE;
 
 status = _db_dir_exists (database_path, );
diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh
index 6df17f80..f9a8e200 100755
--- a/test/T055-path-config.sh
+++ b/test/T055-path-config.sh
@@ -37,8 +37,31 @@ symlink_config () {
 unset DATABASE_PATH
 }
 
-for config in traditional split symlink; do
-# start each set of tests with a known set of messages
+xdg_config () {
+local dir
+local profile=${1:-default}
+
+if [[ $profile != default ]]; then
+   export NOTMUCH_PROFILE=$profile
+fi
+
+backup_config
+DATABASE_PATH="${HOME}/.local/share/notmuch/${profile}"
+rm -rf $DATABASE_PATH
+mkdir -p $DATABASE_PATH
+
+config_dir="${HOME}/.config/notmuch/${profile}"
+mkdir -p ${config_dir}
+CONFIG_PATH=$config_dir/config
+mv ${NOTMUCH_CONFIG} $CONFIG_PATH
+unset NOTMUCH_CONFIG
+
+notmuch --config=${CONFIG_PATH} config set database.mail_root 
${TMP_DIRECTORY}/mail
+notmuch --config=${CONFIG_PATH} config set database.path
+}
+
+for config in traditional split XDG XDG+profile symlink; do
+#start each set of tests with an known set of messages
 add_email_corpus
 
 case $config in
@@ -49,6 +72,14 @@ for config in traditional split symlink; do
split_config
mv mail/.notmuch/xapian $DATABASE_PATH
;;
+   XDG)
+   xdg_config
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
+   XDG+profile)
+   xdg_config ${RANDOM}
+   mv mail/.notmuch/xapian $DATABASE_PATH
+   ;;
symlink)
symlink_config
;;
diff --git a/test/T560-lib-error.sh b/test/T560-lib-error.sh
index 03df69d9..89447e9a 100755
--- a/test/T560-lib-error.sh
+++ b/test/T560-lib-error.sh
@@ -22,7 +22,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
@@ -93,7 +93,7 @@ EOF
 cat <<'EOF' >EXPECTED
 == stdout ==
 == stderr ==
-Error: Cannot open a database for a NULL path.
+Error: Cannot open database at CWD/home/.local/share/notmuch/default: No such 
file or directory.
 EOF
 test_expect_equal_file EXPECTED OUTPUT
 
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 5cf70987..c21c139b 100755
---