The stat is dropped to avoid a race condition between stat and mkdir. This changes the default location for backups to make things tidier. Hopefully there is not user scripts relying on this location. --- notmuch-new.c | 18 ++++++------------ test/T055-path-config.sh | 15 +++++++++++++++ test/T530-upgrade.sh | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/notmuch-new.c b/notmuch-new.c index 63ac10a6..8a8ff69a 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -1048,28 +1048,22 @@ _maybe_upgrade (notmuch_database_t *notmuch, add_files_state_t *state) { if (notmuch_database_needs_upgrade (notmuch)) { time_t now = time (NULL); struct tm *gm_time = gmtime (&now); - struct stat st; int err; 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; - err = stat(dot_notmuch_path, &st); - if (err) { - if (errno == ENOENT) { - dot_notmuch_path = NULL; - } else { - fprintf(stderr, "Failed to stat %s: %s\n", dot_notmuch_path, strerror(errno)); - return EXIT_FAILURE; - } + err = mkdir (backup_dir, 0755); + if (err && errno != EEXIST) { + fprintf(stderr, "Failed to create %s: %s\n", backup_dir, strerror(errno)); + return EXIT_FAILURE; } /* since dump files are written atomically, the amount of * harm from overwriting one within a second seems * relatively small. */ 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_mon + 1, gm_time->tm_mday, diff --git a/test/T055-path-config.sh b/test/T055-path-config.sh index e4812c82..d8828342 100755 --- a/test/T055-path-config.sh +++ b/test/T055-path-config.sh @@ -2,6 +2,8 @@ test_description='Configuration of mail-root and database path' . $(dirname "$0")/test-lib.sh || exit 1 +test_require_external_prereq xapian-metdata + backup_config () { local test_name=$(basename $0 .sh) cp ${NOTMUCH_CONFIG} notmuch-config-backup.${test_name} @@ -13,6 +15,7 @@ restore_config () { unset CONFIG_PATH unset DATABASE_PATH unset NOTMUCH_PROFILE + unset XAPIAN_PATH cp notmuch-config-backup.${test_name} ${NOTMUCH_CONFIG} } @@ -25,6 +28,7 @@ split_config () { notmuch config set database.path $dir notmuch config set database.mail_root $MAIL_DIR DATABASE_PATH=$dir + XAPIAN_PATH="$dir/xapian" } symlink_config () { @@ -34,6 +38,7 @@ symlink_config () { ln -s $MAIL_DIR $dir notmuch config set database.path $dir notmuch config set database.mail_root $MAIL_DIR + XAPIAN_PATH="$MAIL_DIR/.notmuch/xapian" unset DATABASE_PATH } @@ -56,6 +61,7 @@ xdg_config () { mv ${NOTMUCH_CONFIG} $CONFIG_PATH 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.path } @@ -67,6 +73,7 @@ for config in traditional split XDG XDG+profile symlink; do case $config in traditional) backup_config + XAPIAN_PATH="$MAIL_DIR/.notmuch/xapian" ;; split) split_config @@ -184,6 +191,14 @@ EOF notmuch search --output=messages '*' | sort > 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 done diff --git a/test/T530-upgrade.sh b/test/T530-upgrade.sh index c599dacf..cce29f45 100755 --- a/test/T530-upgrade.sh +++ b/test/T530-upgrade.sh @@ -5,7 +5,7 @@ test_description='database upgrades' test_require_external_prereq xapian-metadata XAPIAN_PATH=$MAIL_DIR/.notmuch/xapian -BACKUP_PATH=$MAIL_DIR/.notmuch +BACKUP_PATH=$MAIL_DIR/.notmuch/backups delete_feature () { local key=$1 -- 2.30.1 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-leave@notmuchmail.org