summaryrefslogtreecommitdiff
path: root/guix/store
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-11-13 14:20:27 +0100
committerLudovic Courtès <ludo@gnu.org>2018-11-13 14:59:46 +0100
commitf5a2724ae453f4a4b55ff848f4ad7e30efb6eef8 (patch)
treed75dc771a1fdd3322ed0c4f266c39b952f149183 /guix/store
parent8390869811f56f5b2ff947efb9d48bcf219a0444 (diff)
downloadgnu-guix-f5a2724ae453f4a4b55ff848f4ad7e30efb6eef8.tar
gnu-guix-f5a2724ae453f4a4b55ff848f4ad7e30efb6eef8.tar.gz
deduplication: Restore directory mtime and permissions after deduplication.
Fixes <https://bugs.gnu.org/33361>. * guix/store/deduplication.scm (replace-with-link): Call 'set-file-time' and 'chmod' after 'rename-file'. * tests/nar.scm ("restore-file-set with directories (signed, valid)"): New test.
Diffstat (limited to 'guix/store')
-rw-r--r--guix/store/deduplication.scm12
1 files changed, 9 insertions, 3 deletions
diff --git a/guix/store/deduplication.scm b/guix/store/deduplication.scm
index 53810c680f..21b0c81f3d 100644
--- a/guix/store/deduplication.scm
+++ b/guix/store/deduplication.scm
@@ -102,11 +102,17 @@ LINK-PREFIX."
SWAP-DIRECTORY as the directory to store temporary hard links.
Note: TARGET, TO-REPLACE, and SWAP-DIRECTORY must be on the same file system."
- (let ((temp-link (get-temp-link target swap-directory)))
- (make-file-writable (dirname to-replace))
+ (let* ((temp-link (get-temp-link target swap-directory))
+ (parent (dirname to-replace))
+ (stat (stat parent)))
+ (make-file-writable parent)
(catch 'system-error
(lambda ()
- (rename-file temp-link to-replace))
+ (rename-file temp-link to-replace)
+
+ ;; Restore PARENT's mtime and permissions.
+ (set-file-time parent stat)
+ (chmod parent (stat:mode stat)))
(lambda args
(delete-file temp-link)
(unless (= EMLINK (system-error-errno args))