[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02/15: challenge: Store item contents are returned in canonical order.
From: |
guix-commits |
Subject: |
02/15: challenge: Store item contents are returned in canonical order. |
Date: |
Sat, 11 Dec 2021 18:29:27 -0500 (EST) |
civodul pushed a commit to branch master
in repository guix.
commit 4dca1bae2767b049532e7434151686fdb7fab256
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sat Dec 11 16:10:08 2021 +0100
challenge: Store item contents are returned in canonical order.
This allows the 'delete-duplicates' call in 'differing-files' to have
the intended effect.
Before that, a "guix challenge" invocation with three builds of a store
item, two of which are identical, would lead 'differing-files' to not
print anything, as in this example:
$ ./pre-inst-env guix challenge python-numpy
/gnu/store/…-python-numpy-1.17.3 contents differ:
local hash: 07var0wn8fywxchldz5pjqpnlavrlbc8s81aqwsqyi0i7qlh6ka7
https://ci.guix.gnu.org/nar/lzip/…-python-numpy-1.17.3:
07var0wn8fywxchldz5pjqpnlavrlbc8s81aqwsqyi0i7qlh6ka7
https://bordeaux.guix.gnu.org/nar/lzip/…-python-numpy-1.17.3:
0cbl3q19bshb6ddz8xkcrjzkcmillsqii4z852ybzixyp7rg40qa
1 store items were analyzed:
- 0 (0.0%) were identical
- 1 (100.0%) differed
- 0 (0.0%) were inconclusive
With this change, 'differing-files' prints additional info as intended:
differing file:
/lib/python3.8/site-packages/numpy/distutils/fcompiler/__pycache__/vast.cpython-38.pyc
* guix/scripts/challenge.scm (archive-contents): Add tail call to
'reverse'.
(store-item-contents): Rewrite to use 'scandir' and recursive calls
instead of 'file-system-fold'.
---
guix/scripts/challenge.scm | 87 ++++++++++++++++++++++++----------------------
1 file changed, 46 insertions(+), 41 deletions(-)
diff --git a/guix/scripts/challenge.scm b/guix/scripts/challenge.scm
index 57ffe88..c29d510 100644
--- a/guix/scripts/challenge.scm
+++ b/guix/scripts/challenge.scm
@@ -202,51 +202,56 @@ taken since we do not import the archives."
(get)))
(define (archive-contents port)
- "Return a list representing the files contained in the nar read from PORT."
- (fold-archive (lambda (file type contents result)
- (match type
- ((or 'regular 'executable)
- (match contents
- ((port . size)
- (cons `(,file ,type ,(port-sha256* port size))
- result))))
- ('directory result)
- ('directory-complete result)
- ('symlink
- (cons `(,file ,type ,contents) result))))
- '()
- port
- ""))
+ "Return a list representing the files contained in the nar read from PORT.
+The list is sorted in canonical order--i.e., the order in which entries appear
+in the nar."
+ (reverse
+ (fold-archive (lambda (file type contents result)
+ (match type
+ ((or 'regular 'executable)
+ (match contents
+ ((port . size)
+ (cons `(,file ,type ,(port-sha256* port size))
+ result))))
+ ('directory result)
+ ('directory-complete result)
+ ('symlink
+ (cons `(,file ,type ,contents) result))))
+ '()
+ port
+ "")))
(define (store-item-contents item)
"Return a list of files and contents for ITEM in the same format as
'archive-contents'."
- (file-system-fold (const #t) ;enter?
- (lambda (file stat result) ;leaf
- (define short
- (string-drop file (string-length item)))
-
- (match (stat:type stat)
- ('regular
- (let ((size (stat:size stat))
- (type (if (zero? (logand (stat:mode stat)
- #o100))
- 'regular
- 'executable)))
- (cons `(,short ,type
- ,(call-with-input-file file
- (cut port-sha256* <> size)))
- result)))
- ('symlink
- (cons `(,short symlink ,(readlink file))
- result))))
- (lambda (directory stat result) result) ;down
- (lambda (directory stat result) result) ;up
- (lambda (file stat result) result) ;skip
- (lambda (file stat errno result) result) ;error
- '()
- item
- lstat))
+ (let loop ((file item))
+ (define stat
+ (lstat file))
+
+ (define short
+ (string-drop file (string-length item)))
+
+ (match (stat:type stat)
+ ('regular
+ (let ((size (stat:size stat))
+ (type (if (zero? (logand (stat:mode stat)
+ #o100))
+ 'regular
+ 'executable)))
+ `((,short ,type
+ ,(call-with-input-file file
+ (cut port-sha256* <> size))))))
+ ('symlink
+ `((,short symlink ,(readlink file))))
+ ('directory
+ (append-map (match-lambda
+ ((or "." "..")
+ '())
+ (entry
+ (loop (string-append file "/" entry))))
+ ;; Traverse entries in canonical order, the same as the
+ ;; order of entries in nars.
+ (scandir file (const #t) string<?))))))
(define (call-with-nar narinfo proc)
"Call PROC with an input port from which it can read the nar pointed to by
- branch master updated (d5cfca2 -> 8bb6c74), guix-commits, 2021/12/11
- 01/15: challenge: Use SRFI-71 instead of SRFI-11., guix-commits, 2021/12/11
- 02/15: challenge: Store item contents are returned in canonical order.,
guix-commits <=
- 03/15: substitutes: Build correct narinfo URLs for cache URLs without trailing slash., guix-commits, 2021/12/11
- 05/15: gnu: Add ascii., guix-commits, 2021/12/11
- 07/15: gnu: python-vcrpy: Update to 4.1.1., guix-commits, 2021/12/11
- 04/15: narinfo: Do not repeat slash when building nar URLs., guix-commits, 2021/12/11
- 08/15: gnu: python-aws-sam-translator: Update to 1.40.0., guix-commits, 2021/12/11
- 06/15: gnu: Add python-ipaddress., guix-commits, 2021/12/11
- 09/15: gnu: python-cfn-lint: Update to 0.54.3., guix-commits, 2021/12/11
- 10/15: gnu: python-cfn-lint: Honor #:tests? flag., guix-commits, 2021/12/11
- 12/15: gnu: python-s3transfer: Honor #:tests? flag., guix-commits, 2021/12/11
- 13/15: gnu: Update awscli, python-boto3 and python-botocore., guix-commits, 2021/12/11