]> git.cworth.org Git - notmuch/commitdiff
CLI/new: use configuration variable for backup directory
authorDavid Bremner <david@tethera.net>
Wed, 17 Feb 2021 15:26:15 +0000 (11:26 -0400)
committerDavid Bremner <david@tethera.net>
Sat, 20 Mar 2021 10:53:02 +0000 (07:53 -0300)
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.

notmuch-new.c
test/T055-path-config.sh
test/T530-upgrade.sh

index 4f29aa2a513fea93c7a0973b2645349a5678d24e..8e2bf4a84babba4fe80e6b2ce72c2e4c8a6cefa1 100644 (file)
@@ -1051,28 +1051,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,
index e4812c820ee961c985fc0d82c61e2a9ffed03f6c..d8828342dd3bcfbe6ef08ca83b2a33c7edcd15a0 100755 (executable)
@@ -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
 
index c599dacfc81d82b1777034c2d11c72c5897d19c0..cce29f4580855044f51ea23cb341191f19e0436f 100755 (executable)
@@ -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