~ruther/guix-local

994fbc0ac6c6efcb385cbd6ef7b9073b7571ac93 — Carlo Zancanaro 2 years ago 6da03fc
build: utils: Raise error in modify-phases upon missing key.

* guix/build/utils.scm (alist-cons-before)
(alist-cons-after): Error with a match failure if the
reference is not found, instead of appending to the alist.
* tests/build-utils.scm: Update tests to match the new behavior.

Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Change-Id: I3044b101bd06231d5cd55a544ac1009e6ce6f9a0
2 files changed, 15 insertions(+), 12 deletions(-)

M guix/build/utils.scm
M tests/build-utils.scm
M guix/build/utils.scm => guix/build/utils.scm +9 -6
@@ 9,6 9,7 @@
;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be>
;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
;;; Copyright © 2023 Carlo Zancanaro <carlo@zancanaro.id.au>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 729,18 730,22 @@ effects, such as displaying warnings or error messages."
(define* (alist-cons-before reference key value alist
                            #:optional (key=? equal?))
  "Insert the KEY/VALUE pair before the first occurrence of a pair whose key
is REFERENCE in ALIST.  Use KEY=? to compare keys."
is REFERENCE in ALIST.  Use KEY=? to compare keys.  An error is raised when no
such pair exists."
  (let-values (((before after)
                (break (match-lambda
                        ((k . _)
                         (key=? k reference)))
                       alist)))
    (append before (alist-cons key value after))))
    (match after
      ((_ _ ...)
       (append before (alist-cons key value after))))))

(define* (alist-cons-after reference key value alist
                           #:optional (key=? equal?))
  "Insert the KEY/VALUE pair after the first occurrence of a pair whose key
is REFERENCE in ALIST.  Use KEY=? to compare keys."
is REFERENCE in ALIST.  Use KEY=? to compare keys.  An error is raised when
no such pair exists."
  (let-values (((before after)
                (break (match-lambda
                        ((k . _)


@@ 748,9 753,7 @@ is REFERENCE in ALIST.  Use KEY=? to compare keys."
                       alist)))
    (match after
      ((reference after ...)
       (append before (cons* reference `(,key . ,value) after)))
      (()
       (append before `((,key . ,value)))))))
       (append before (cons* reference `(,key . ,value) after))))))

(define* (alist-replace key value alist #:optional (key=? equal?))
  "Replace the first pair in ALIST whose car is KEY with the KEY/VALUE pair.

M tests/build-utils.scm => tests/build-utils.scm +6 -6
@@ 41,17 41,17 @@
  '((a . 1) (x . 42) (b . 2) (c . 3))
  (alist-cons-before 'b 'x 42 '((a . 1) (b . 2) (c . 3))))

(test-equal "alist-cons-before, reference not found"
  '((a . 1) (b . 2) (c . 3) (x . 42))
  (alist-cons-before 'z 'x 42 '((a . 1) (b . 2) (c . 3))))
(test-assert "alist-cons-before, reference not found"
  (not (false-if-exception
        (alist-cons-before 'z 'x 42 '((a . 1) (b . 2) (c . 3))))))

(test-equal "alist-cons-after"
  '((a . 1) (b . 2) (x . 42) (c . 3))
  (alist-cons-after 'b 'x 42 '((a . 1) (b . 2) (c . 3))))

(test-equal "alist-cons-after, reference not found"
  '((a . 1) (b . 2) (c . 3) (x . 42))
  (alist-cons-after 'z 'x 42 '((a . 1) (b . 2) (c . 3))))
(test-assert "alist-cons-after, reference not found"
  (not (false-if-exception
        (alist-cons-after 'z 'x 42 '((a . 1) (b . 2) (c . 3))))))

(test-equal "alist-replace"
  '((a . 1) (b . 77) (c . 3))