mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
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.
This commit is contained in:
parent
9896b37ac5
commit
3363ff1867
2 changed files with 23 additions and 2 deletions
16
guix/ui.scm
16
guix/ui.scm
|
@ -200,6 +200,20 @@ (define-syntax-rule (without-compiler-optimizations exp)
|
||||||
(parameterize (((@ (system base compile) default-optimization-level) 1))
|
(parameterize (((@ (system base compile) default-optimization-level) 1))
|
||||||
exp))
|
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
|
(define* (load* file user-module
|
||||||
#:key (on-error 'nothing-special))
|
#:key (on-error 'nothing-special))
|
||||||
"Load the user provided Scheme source code FILE."
|
"Load the user provided Scheme source code FILE."
|
||||||
|
@ -230,7 +244,7 @@ (define tag
|
||||||
;; 'primitive-load', so that FILE is compiled, which then allows
|
;; 'primitive-load', so that FILE is compiled, which then allows
|
||||||
;; us to provide better error reporting with source line numbers.
|
;; us to provide better error reporting with source line numbers.
|
||||||
(without-compiler-optimizations
|
(without-compiler-optimizations
|
||||||
(load (canonicalize-path file))))
|
(load (try-canonicalize-path file))))
|
||||||
(const #f))))))
|
(const #f))))))
|
||||||
(lambda _
|
(lambda _
|
||||||
;; XXX: Errors are reported from the pre-unwind handler below, but
|
;; XXX: Errors are reported from the pre-unwind handler below, but
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# GNU Guix --- Functional package management for GNU
|
# 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 © 2020 Marius Bakke <mbakke@fastmail.com>
|
||||||
# Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
|
# Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
|
||||||
#
|
#
|
||||||
|
@ -397,6 +397,13 @@ guix build -d -m "$module_dir/manifest.scm" \
|
||||||
|
|
||||||
rm "$module_dir"/*.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'.
|
# Using 'GUIX_BUILD_OPTIONS'.
|
||||||
GUIX_BUILD_OPTIONS="--dry-run --no-grafts"
|
GUIX_BUILD_OPTIONS="--dry-run --no-grafts"
|
||||||
export GUIX_BUILD_OPTIONS
|
export GUIX_BUILD_OPTIONS
|
||||||
|
|
Loading…
Reference in a new issue