[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
06/06: deduplication: Restore directory mtime and permissions after dedu
From: |
Ludovic Courtès |
Subject: |
06/06: deduplication: Restore directory mtime and permissions after deduplication. |
Date: |
Tue, 13 Nov 2018 09:05:23 -0500 (EST) |
civodul pushed a commit to branch master
in repository guix.
commit f5a2724ae453f4a4b55ff848f4ad7e30efb6eef8
Author: Ludovic Courtès <address@hidden>
Date: Tue Nov 13 14:20:27 2018 +0100
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.
---
guix/store/deduplication.scm | 12 +++++++++---
tests/nar.scm | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/guix/store/deduplication.scm b/guix/store/deduplication.scm
index 53810c6..21b0c81 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))
diff --git a/tests/nar.scm b/tests/nar.scm
index bf1b066..5ffe68c 100644
--- a/tests/nar.scm
+++ b/tests/nar.scm
@@ -359,6 +359,41 @@
files))
(every canonical-file? files)))))))
+(test-assert "restore-file-set with directories (signed, valid)"
+ ;; <https://bugs.gnu.org/33361> describes a bug whereby directories
+ ;; containing files subject to deduplication were not canonicalized--i.e.,
+ ;; their mtime and permissions were not reset. Ensure that this bug is
+ ;; gone.
+ (with-store store
+ (let* ((text1 (random-text))
+ (text2 (random-text))
+ (tree `("tree" directory
+ ("a" regular (data ,text1))
+ ("b" directory
+ ("c" regular (data ,text2))
+ ("d" regular (data ,text1))))) ;duplicate
+ (file (add-file-tree-to-store store tree))
+ (dump (call-with-bytevector-output-port
+ (cute export-paths store (list file) <>))))
+ (delete-paths store (list file))
+ (and (not (file-exists? file))
+ (let* ((source (open-bytevector-input-port dump))
+ (imported (restore-file-set source)))
+ (and (equal? imported (list file))
+ (file-exists? file)
+ (valid-path? store file)
+ (string=? text1
+ (call-with-input-file (string-append file "/a")
+ get-string-all))
+ (string=? text2
+ (call-with-input-file
+ (string-append file "/b/c")
+ get-string-all))
+ (= (stat:ino (stat (string-append file "/a"))) ;deduplication
+ (stat:ino (stat (string-append file "/b/d"))))
+ (every canonical-file?
+ (find-files file #:directories? #t))))))))
+
(test-assert "restore-file-set (missing signature)"
(let/ec return
(with-store store
- branch master updated (1559564 -> f5a2724), Ludovic Courtès, 2018/11/13
- 02/06: services: mcron: Fix typo in comment., Ludovic Courtès, 2018/11/13
- 04/06: tests: Remove check for a feature that appeared in Guile 2.0.10., Ludovic Courtès, 2018/11/13
- 06/06: deduplication: Restore directory mtime and permissions after deduplication.,
Ludovic Courtès <=
- 03/06: services: nscd: Add 'invalidate' and 'statistics' actions., Ludovic Courtès, 2018/11/13
- 01/06: nar: Access the database instead of connecting to the daemon., Ludovic Courtès, 2018/11/13
- 05/06: tests: Check file canonicalization for 'restore-file-set'., Ludovic Courtès, 2018/11/13