mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
lib/open: create database path in some cases
There is some duplication of code here, but not all of the locations valid to find a database make sense to create. Furthermore we nead two passes, so the control flow in _choose_database_path would get a bit convoluted.
This commit is contained in:
parent
8ba3057d01
commit
84e4e130e2
3 changed files with 57 additions and 7 deletions
53
lib/open.cc
53
lib/open.cc
|
@ -262,6 +262,45 @@ _mkdir (const char *path, char **message)
|
||||||
return NOTMUCH_STATUS_SUCCESS;
|
return NOTMUCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static notmuch_status_t
|
||||||
|
_create_database_path (notmuch_database_t *notmuch,
|
||||||
|
const char *profile,
|
||||||
|
GKeyFile *key_file,
|
||||||
|
const char **database_path,
|
||||||
|
char **message)
|
||||||
|
{
|
||||||
|
notmuch_status_t status;
|
||||||
|
|
||||||
|
if (! *database_path) {
|
||||||
|
*database_path = getenv ("NOTMUCH_DATABASE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! *database_path && key_file) {
|
||||||
|
char *path = g_key_file_get_string (key_file, "database", "path", NULL);
|
||||||
|
if (path) {
|
||||||
|
if (path[0] == '/')
|
||||||
|
*database_path = talloc_strdup (notmuch, path);
|
||||||
|
else
|
||||||
|
*database_path = talloc_asprintf (notmuch, "%s/%s", getenv ("HOME"), path);
|
||||||
|
g_free (path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! *database_path) {
|
||||||
|
*database_path = _xdg_dir (notmuch, "XDG_DATA_HOME", ".local/share", profile);
|
||||||
|
notmuch->params |= NOTMUCH_PARAM_SPLIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*database_path[0] != '/') {
|
||||||
|
*message = strdup ("Error: Database path must be absolute.\n");
|
||||||
|
return NOTMUCH_STATUS_PATH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((status = _mkdir (*database_path, message)))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
return NOTMUCH_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static notmuch_database_t *
|
static notmuch_database_t *
|
||||||
_alloc_notmuch (const char *database_path, const char *config_path, const char *profile)
|
_alloc_notmuch (const char *database_path, const char *config_path, const char *profile)
|
||||||
|
@ -641,9 +680,19 @@ notmuch_database_create_with_config (const char *database_path,
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((status = _choose_database_path (notmuch, profile, key_file,
|
status = _choose_database_path (notmuch, profile, key_file,
|
||||||
&database_path, &message)))
|
&database_path, &message);
|
||||||
|
switch (status) {
|
||||||
|
case NOTMUCH_STATUS_SUCCESS:
|
||||||
|
break;
|
||||||
|
case NOTMUCH_STATUS_NO_DATABASE:
|
||||||
|
if ((status = _create_database_path (notmuch, profile, key_file,
|
||||||
|
&database_path, &message)))
|
||||||
|
goto DONE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
goto DONE;
|
goto DONE;
|
||||||
|
}
|
||||||
|
|
||||||
_set_database_path (notmuch, database_path);
|
_set_database_path (notmuch, database_path);
|
||||||
|
|
||||||
|
|
|
@ -369,7 +369,6 @@ EOF
|
||||||
;&
|
;&
|
||||||
mailroot_only)
|
mailroot_only)
|
||||||
test_begin_subtest "create database parent dir ($config)"
|
test_begin_subtest "create database parent dir ($config)"
|
||||||
test_subtest_known_broken
|
|
||||||
rm -r ${DATABASE_PATH}
|
rm -r ${DATABASE_PATH}
|
||||||
notmuch new
|
notmuch new
|
||||||
test_expect_equal "$(xapian-metadata get ${XAPIAN_PATH} version)" 3
|
test_expect_equal "$(xapian-metadata get ${XAPIAN_PATH} version)" 3
|
||||||
|
|
|
@ -102,16 +102,17 @@ test_C <<'EOF'
|
||||||
int main (int argc, char** argv)
|
int main (int argc, char** argv)
|
||||||
{
|
{
|
||||||
notmuch_status_t stat;
|
notmuch_status_t stat;
|
||||||
char *msg;
|
char *msg = NULL;
|
||||||
|
|
||||||
stat = notmuch_database_create_with_config (NULL, "", NULL, NULL, &msg);
|
stat = notmuch_database_create_with_config (NULL, "", NULL, NULL, &msg);
|
||||||
|
printf ("%s\n", notmuch_status_to_string (stat));
|
||||||
if (msg) fputs (msg, stderr);
|
if (msg) fputs (msg, stderr);
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
cat <<'EOF' >EXPECTED
|
cat <<'EOF' >EXPECTED
|
||||||
== stdout ==
|
== stdout ==
|
||||||
|
No mail root found
|
||||||
== stderr ==
|
== stderr ==
|
||||||
Error: could not locate database.
|
|
||||||
EOF
|
EOF
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
@ -123,16 +124,17 @@ int main (int argc, char** argv)
|
||||||
{
|
{
|
||||||
notmuch_database_t *db;
|
notmuch_database_t *db;
|
||||||
notmuch_status_t stat;
|
notmuch_status_t stat;
|
||||||
char *msg;
|
char *msg = NULL;
|
||||||
|
|
||||||
stat = notmuch_database_create_with_config (argv[1], "", NULL, &db, &msg);
|
stat = notmuch_database_create_with_config (argv[1], "", NULL, &db, &msg);
|
||||||
|
printf ("%d\n", stat == NOTMUCH_STATUS_SUCCESS);
|
||||||
if (msg) fputs (msg, stderr);
|
if (msg) fputs (msg, stderr);
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
cat <<'EOF' >EXPECTED
|
cat <<'EOF' >EXPECTED
|
||||||
== stdout ==
|
== stdout ==
|
||||||
|
1
|
||||||
== stderr ==
|
== stderr ==
|
||||||
Error: database path 'CWD/nonexistent/foo' does not exist or is not a directory.
|
|
||||||
EOF
|
EOF
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue