ui: 'load*' accepts /dev/fd/N files pointing to a pipe.
This allows users to write Bash commands like: guix time-machine -C <(echo %default-channels) -- ... or: guix build -m <(echo '(specifications->manifest (list "guile"))') Previously, on GNU/Linux, they would fail with: error: failed to load '/dev/fd/63': No such file or directory * guix/ui.scm (try-canonicalize-path): New procedure. (load*): Use it. * tests/guix-build.sh: Test 'guix build -m' with a /dev/fd/N file.
parent
9896b37ac5
commit
3363ff1867
16
guix/ui.scm
16
guix/ui.scm
|
@ -200,6 +200,20 @@ information, or #f if it could not be found."
|
|||
(parameterize (((@ (system base compile) default-optimization-level) 1))
|
||||
exp))
|
||||
|
||||
(define (try-canonicalize-path file)
|
||||
"Like 'canonicalize-path', but return FILE as-is if 'canonicalize-path'
|
||||
throws.
|
||||
|
||||
This is necessary for corner cases where 'canonicalize-path' fails. One
|
||||
example is on Linux when a /dev/fd/N file denotes a pipe, represented as a
|
||||
symlink to a non-existent file like 'pipe:[1234]', as in this example:
|
||||
|
||||
sh -c 'stat $(readlink -f /dev/fd/1)' | cat"
|
||||
(catch 'system-error
|
||||
(lambda ()
|
||||
(canonicalize-path file))
|
||||
(const file)))
|
||||
|
||||
(define* (load* file user-module
|
||||
#:key (on-error 'nothing-special))
|
||||
"Load the user provided Scheme source code FILE."
|
||||
|
@ -230,7 +244,7 @@ information, or #f if it could not be found."
|
|||
;; 'primitive-load', so that FILE is compiled, which then allows
|
||||
;; us to provide better error reporting with source line numbers.
|
||||
(without-compiler-optimizations
|
||||
(load (canonicalize-path file))))
|
||||
(load (try-canonicalize-path file))))
|
||||
(const #f))))))
|
||||
(lambda _
|
||||
;; XXX: Errors are reported from the pre-unwind handler below, but
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2012-2014, 2016-2022 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2012-2014, 2016-2023 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
|
||||
# Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
|
||||
#
|
||||
|
@ -397,6 +397,13 @@ guix build -d -m "$module_dir/manifest.scm" \
|
|||
|
||||
rm "$module_dir"/*.scm
|
||||
|
||||
if [ -n "$BASH_VERSION" ]
|
||||
then
|
||||
# Check whether we can load from a /dev/fd/N denoting a pipe, using this
|
||||
# handy Bash-specific construct.
|
||||
guix build -m <(echo '(specifications->manifest (list "guile"))') -n
|
||||
fi
|
||||
|
||||
# Using 'GUIX_BUILD_OPTIONS'.
|
||||
GUIX_BUILD_OPTIONS="--dry-run --no-grafts"
|
||||
export GUIX_BUILD_OPTIONS
|
||||
|
|
Reference in New Issue