[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02/04: gexp: Correctly handle unquoting S-exp objects.
From: |
guix-commits |
Subject: |
02/04: gexp: Correctly handle unquoting S-exp objects. |
Date: |
Sun, 13 Mar 2022 18:28:45 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix.
commit 5aec62ee0f69d691c1c1e322029463beb8bfc3cd
Author: Maxime Devos <maximedevos@telenet.be>
AuthorDate: Thu Mar 3 13:57:03 2022 +0000
gexp: Correctly handle unquoting S-exp objects.
This fixes a false-positive in the linter:
guix lint -c 'wrapper-inputs' libaio
* guix/gexp.scm (gexp->approximate-sexp): Allow the 'thing' in <gexp-input>
to
be a sexp, without approximation, by testing if it is a record.
* tests/gexp.scm ("unquoted sexp (not a gexp!)"): Test it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
---
guix/gexp.scm | 16 +++++++++-------
tests/gexp.scm | 15 ++++++++++++++-
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/guix/gexp.scm b/guix/gexp.scm
index e229c1fc8f..38114f8863 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -4,7 +4,7 @@
;;; Copyright © 2018 Jan Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2019, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
-;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -174,12 +174,14 @@ As a result, the S-expression will be approximate if GEXP
has references."
(map (lambda (reference)
(match reference
(($ <gexp-input> thing output native)
- (if (gexp-like? thing)
- (gexp->approximate-sexp thing)
- ;; Simply returning 'thing' won't work in some
- ;; situations; see 'write-gexp' below.
- '(*approximate*)))
- (_ '(*approximate*))))
+ (cond ((gexp-like? thing)
+ (gexp->approximate-sexp thing))
+ ((not (record? thing)) ; a S-exp
+ thing)
+ (#true
+ ;; Simply returning 'thing' won't work in some
+ ;; situations; see 'write-gexp' below.
+ '(*approximate*))))))
(gexp-references gexp))))
(define (write-gexp gexp port)
diff --git a/tests/gexp.scm b/tests/gexp.scm
index 33c0e4bf8c..61ed5bc02d 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -1,6 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014-2022 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
+;;; Copyright © 2021-2022 Maxime Devos <maximedevos@telenet.be>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -121,6 +121,19 @@
(let ((inside (file-append coreutils "/bin/hello")))
(gexp->approximate-sexp #~(display '#$inside))))
+;; See <https://issues.guix.gnu.org/54236>.
+(test-equal "unquoted sexp (not a gexp!)"
+ '(list #(foo) (foo) () "foo" foo #xf00)
+ (let ((inside/vector #(foo))
+ (inside/list '(foo))
+ (inside/empty '())
+ (inside/string "foo")
+ (inside/symbol 'foo)
+ (inside/number #xf00))
+ (gexp->approximate-sexp
+ #~(list #$inside/vector #$inside/list #$inside/empty #$inside/string
+ #$inside/symbol #$inside/number))))
+
(test-equal "no refs"
'(display "hello!")
(let ((exp (gexp (display "hello!"))))