CLI/new: use configuration variable for backup directory

The stat is essentially replaced by the mkdir for error detection
purposes.  This changes the default location for backups to make
things tidier, even in non-split configurations. Hopefully there is
not too many user scripts relying on the previous location.

Because the default location may not exist, replace the use of stat
for error detection with a call to mkdir.
This commit is contained in:
David Bremner 2021-02-17 11:26:15 -04:00
parent a7873df331
commit 4e209ca99a
3 changed files with 22 additions and 13 deletions

View file

@ -1051,28 +1051,22 @@ _maybe_upgrade (notmuch_database_t *notmuch, add_files_state_t *state)
if (notmuch_database_needs_upgrade (notmuch)) { if (notmuch_database_needs_upgrade (notmuch)) {
time_t now = time (NULL); time_t now = time (NULL);
struct tm *gm_time = gmtime (&now); struct tm *gm_time = gmtime (&now);
struct stat st;
int err; int err;
notmuch_status_t status; notmuch_status_t status;
char *dot_notmuch_path = talloc_asprintf (notmuch, "%s/%s", state->db_path, ".notmuch"); const char *backup_dir = notmuch_config_get (notmuch, NOTMUCH_CONFIG_BACKUP_DIR);
const char *backup_name; const char *backup_name;
err = stat (dot_notmuch_path, &st); err = mkdir (backup_dir, 0755);
if (err) { if (err && errno != EEXIST) {
if (errno == ENOENT) { fprintf (stderr, "Failed to create %s: %s\n", backup_dir, strerror (errno));
dot_notmuch_path = NULL;
} else {
fprintf (stderr, "Failed to stat %s: %s\n", dot_notmuch_path, strerror (errno));
return EXIT_FAILURE; return EXIT_FAILURE;
} }
}
/* since dump files are written atomically, the amount of /* since dump files are written atomically, the amount of
* harm from overwriting one within a second seems * harm from overwriting one within a second seems
* relatively small. */ * relatively small. */
backup_name = talloc_asprintf (notmuch, "%s/dump-%04d%02d%02dT%02d%02d%02d.gz", backup_name = talloc_asprintf (notmuch, "%s/dump-%04d%02d%02dT%02d%02d%02d.gz",
dot_notmuch_path ? dot_notmuch_path : state->db_path, backup_dir,
gm_time->tm_year + 1900, gm_time->tm_year + 1900,
gm_time->tm_mon + 1, gm_time->tm_mon + 1,
gm_time->tm_mday, gm_time->tm_mday,

View file

@ -2,6 +2,8 @@
test_description='Configuration of mail-root and database path' test_description='Configuration of mail-root and database path'
. $(dirname "$0")/test-lib.sh || exit 1 . $(dirname "$0")/test-lib.sh || exit 1
test_require_external_prereq xapian-metdata
backup_config () { backup_config () {
local test_name=$(basename $0 .sh) local test_name=$(basename $0 .sh)
cp ${NOTMUCH_CONFIG} notmuch-config-backup.${test_name} cp ${NOTMUCH_CONFIG} notmuch-config-backup.${test_name}
@ -13,6 +15,7 @@ restore_config () {
unset CONFIG_PATH unset CONFIG_PATH
unset DATABASE_PATH unset DATABASE_PATH
unset NOTMUCH_PROFILE unset NOTMUCH_PROFILE
unset XAPIAN_PATH
cp notmuch-config-backup.${test_name} ${NOTMUCH_CONFIG} cp notmuch-config-backup.${test_name} ${NOTMUCH_CONFIG}
} }
@ -25,6 +28,7 @@ split_config () {
notmuch config set database.path $dir notmuch config set database.path $dir
notmuch config set database.mail_root $MAIL_DIR notmuch config set database.mail_root $MAIL_DIR
DATABASE_PATH=$dir DATABASE_PATH=$dir
XAPIAN_PATH="$dir/xapian"
} }
symlink_config () { symlink_config () {
@ -34,6 +38,7 @@ symlink_config () {
ln -s $MAIL_DIR $dir ln -s $MAIL_DIR $dir
notmuch config set database.path $dir notmuch config set database.path $dir
notmuch config set database.mail_root $MAIL_DIR notmuch config set database.mail_root $MAIL_DIR
XAPIAN_PATH="$MAIL_DIR/.notmuch/xapian"
unset DATABASE_PATH unset DATABASE_PATH
} }
@ -56,6 +61,7 @@ xdg_config () {
mv ${NOTMUCH_CONFIG} $CONFIG_PATH mv ${NOTMUCH_CONFIG} $CONFIG_PATH
unset NOTMUCH_CONFIG unset NOTMUCH_CONFIG
XAPIAN_PATH="${DATABASE_PATH}/xapian"
notmuch --config=${CONFIG_PATH} config set database.mail_root ${TMP_DIRECTORY}/mail notmuch --config=${CONFIG_PATH} config set database.mail_root ${TMP_DIRECTORY}/mail
notmuch --config=${CONFIG_PATH} config set database.path notmuch --config=${CONFIG_PATH} config set database.path
} }
@ -67,6 +73,7 @@ for config in traditional split XDG XDG+profile symlink; do
case $config in case $config in
traditional) traditional)
backup_config backup_config
XAPIAN_PATH="$MAIL_DIR/.notmuch/xapian"
;; ;;
split) split)
split_config split_config
@ -184,6 +191,14 @@ EOF
notmuch search --output=messages '*' | sort > OUTPUT notmuch search --output=messages '*' | sort > OUTPUT
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "upgrade backup ($config)"
features=$(xapian-metadata get $XAPIAN_PATH features | grep -v "^relative directory paths")
xapian-metadata set $XAPIAN_PATH features "$features"
output=$(notmuch new | grep Welcome)
test_expect_equal \
"$output" \
"Welcome to a new version of notmuch! Your database will now be upgraded."
restore_config restore_config
done done

View file

@ -5,7 +5,7 @@ test_description='database upgrades'
test_require_external_prereq xapian-metadata test_require_external_prereq xapian-metadata
XAPIAN_PATH=$MAIL_DIR/.notmuch/xapian XAPIAN_PATH=$MAIL_DIR/.notmuch/xapian
BACKUP_PATH=$MAIL_DIR/.notmuch BACKUP_PATH=$MAIL_DIR/.notmuch/backups
delete_feature () { delete_feature () {
local key=$1 local key=$1