[PATCH 0/2] Add '-q' for 'pull' and 'time-machine'; support loading from pipes

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Simon Tournier
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 11 Aug 2023 17:31
(address . guix-patches@gnu.org)
cover.1691767568.git.ludo@gnu.org
Hello!

These patches address two related issues:

• The first one adds ‘-q’ to ‘pull’ and ‘time-machine’ to
instruct them to ignore the user/system ‘channels.scm’ file.
That way, a command like the following is guaranteed to have
the same semantics regardless of available config files:

guix time-machine -q --commit=v1.2.0 -- build hello

This issue had been raised in

• The second one lets users do things (in Bash) like:

guix time-machine -C <(echo %default-channels) -- …

Feedback welcome!

Ludo’.

Ludovic Courtès (2):
pull, time-machine: Add '-q' to ignore channel files.
ui: 'load*' accepts /dev/fd/N files pointing to a pipe.

doc/guix.texi | 30 ++++++++++++++++++++++--------
guix/scripts/pull.scm | 14 ++++++++++++--
guix/scripts/time-machine.scm | 7 ++++++-
guix/ui.scm | 16 +++++++++++++++-
tests/guix-build.sh | 9 ++++++++-
5 files changed, 63 insertions(+), 13 deletions(-)


base-commit: 56fddefc6de3b0c1f2ccb9559d86ba08d2e429b9
--
2.41.0
L
L
Ludovic Courtès wrote on 11 Aug 2023 17:34
[PATCH 1/2] pull, time-machine: Add '-q' to ignore channel files.
(address . 65229@debbugs.gnu.org)
0ee5ee05ea81374342740f06915e9dadb1a92a63.1691767568.git.ludo@gnu.org
From: Ludovic Courtès <ludovic.courtes@inria.fr>


* guix/scripts/pull.scm (show-help, %options): Add '-q'.
(channel-list): Honor it.
* guix/scripts/time-machine.scm (show-help, %options): Add '-q'.
* doc/guix.texi (Invoking guix pull, Invoking guix time-machine):
Document it.

Reported-by: Simon Tournier <zimon.toutoune@gmail.com>
---
doc/guix.texi | 30 ++++++++++++++++++++++--------
guix/scripts/pull.scm | 14 ++++++++++++--
guix/scripts/time-machine.scm | 7 ++++++-
3 files changed, 40 insertions(+), 11 deletions(-)

Toggle diff (142 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 409ca2ad62..ec36159de1 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4801,9 +4801,11 @@ Invoking guix pull
@item
the @option{--channels} option;
@item
-the user's @file{~/.config/guix/channels.scm} file;
+the user's @file{~/.config/guix/channels.scm} file, unless @option{-q}
+is passed;
@item
-the system-wide @file{/etc/guix/channels.scm} file;
+the system-wide @file{/etc/guix/channels.scm} file, unless @option{-q}
+is passed;
@item
the built-in default channels specified in the @code{%default-channels}
variable.
@@ -4905,6 +4907,10 @@ Invoking guix pull
evaluates to a list of channel objects. @xref{Channels}, for more
information.
+@item -q
+Inhibit loading of the user and system channel files,
+@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.
+
@cindex channel news
@item --news
@itemx -N
@@ -5092,18 +5098,26 @@ Invoking guix time-machine
Read the list of channels from @var{file}. @var{file} must contain
Scheme code that evaluates to a list of channel objects.
@xref{Channels} for more information.
+
+@item -q
+Inhibit loading of the user and system channel files,
+@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.
@end table
-As for @command{guix pull}, the absence of any options means that the
-latest commit on the master branch will be used. The command
+As for @command{guix pull}, in the absence of any options,
+@command{time-machine} fetches the latest commits of the channels
+specified in @file{~/.config/guix/channels.scm},
+@file{/etc/guix/channels.scm}, or the default channels; the @option{-q}
+option lets you ignore these configuration files. The command:
@example
-guix time-machine -- build hello
+guix time-machine -q -- build hello
@end example
-will thus build the package @code{hello} as defined in the master branch,
-which is in general a newer revision of Guix than you have installed.
-Time travel works in both directions!
+will thus build the package @code{hello} as defined in the main branch
+of Guix, without any additional channel, which is in general a newer
+revision of Guix than you have installed. Time travel works in both
+directions!
Note that @command{guix time-machine} can trigger builds of channels and
their dependencies, and these are controlled by the standard build
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
index ecd264d3fa..f0d4ff36e6 100644
--- a/guix/scripts/pull.scm
+++ b/guix/scripts/pull.scm
@@ -84,6 +84,8 @@ (define (show-help)
Download and deploy the latest version of Guix.\n"))
(display (G_ "
-C, --channels=FILE deploy the channels defined in FILE"))
+ (display (G_ "
+ -q inhibit loading of user and system 'channels.scm'"))
(display (G_ "
--url=URL download \"guix\" channel from the Git repository at URL"))
(display (G_ "
@@ -133,6 +135,9 @@ (define %options
(cons* (option '(#\C "channels") #t #f
(lambda (opt name arg result)
(alist-cons 'channel-file arg result)))
+ (option '(#\q) #f #f
+ (lambda (opt name arg result)
+ (alist-cons 'ignore-channel-files? #t result)))
(option '(#\l "list-generations") #f #t
(lambda (opt name arg result)
(cons `(query list-generations ,arg)
@@ -735,6 +740,9 @@ (define (channel-list opts)
(define file
(assoc-ref opts 'channel-file))
+ (define ignore-channel-files?
+ (assoc-ref opts 'ignore-channel-files?))
+
(define default-file
(string-append (config-directory) "/channels.scm"))
@@ -750,9 +758,11 @@ (define (channel-list opts)
(define channels
(cond (file
(load-channels file))
- ((file-exists? default-file)
+ ((and (not ignore-channel-files?)
+ (file-exists? default-file))
(load-channels default-file))
- ((file-exists? global-file)
+ ((and (not ignore-channel-files?)
+ (file-exists? global-file))
(load-channels global-file))
(else
%default-channels)))
diff --git a/guix/scripts/time-machine.scm b/guix/scripts/time-machine.scm
index d7c71ef705..8afea6b35d 100644
--- a/guix/scripts/time-machine.scm
+++ b/guix/scripts/time-machine.scm
@@ -1,6 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Konrad Hinsen <konrad.hinsen@fastmail.net>
-;;; Copyright © 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019, 2020, 2021, 2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
;;;
;;; This file is part of GNU Guix.
@@ -51,6 +51,8 @@ (define (show-help)
Execute COMMAND ARGS... in an older version of Guix.\n"))
(display (G_ "
-C, --channels=FILE deploy the channels defined in FILE"))
+ (display (G_ "
+ -q inhibit loading of user and system 'channels.scm'"))
(display (G_ "
--url=URL use the Git repository at URL"))
(display (G_ "
@@ -75,6 +77,9 @@ (define %options
(cons* (option '(#\C "channels") #t #f
(lambda (opt name arg result)
(alist-cons 'channel-file arg result)))
+ (option '(#\q) #f #f
+ (lambda (opt name arg result)
+ (alist-cons 'ignore-channel-files? #t result)))
(option '("url") #t #f
(lambda (opt name arg result)
(alist-cons 'repository-url arg
--
2.41.0
L
L
Ludovic Courtès wrote on 11 Aug 2023 17:34
[PATCH 2/2] ui: 'load*' accepts /dev/fd/N files pointing to a pipe.
(address . 65229@debbugs.gnu.org)
a00d4d602028777a6beaf823336a7b901480fcf4.1691767568.git.ludo@gnu.org
From: Ludovic Courtès <ludovic.courtes@inria.fr>

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.
---
guix/ui.scm | 16 +++++++++++++++-
tests/guix-build.sh | 9 ++++++++-
2 files changed, 23 insertions(+), 2 deletions(-)

Toggle diff (61 lines)
diff --git a/guix/ui.scm b/guix/ui.scm
index 47a118364a..6f2d4fe245 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -200,6 +200,20 @@ (define-syntax-rule (without-compiler-optimizations exp)
(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 @@ (define* (load* file user-module
;; '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
diff --git a/tests/guix-build.sh b/tests/guix-build.sh
index 317c58ac42..4eab0e38b6 100644
--- a/tests/guix-build.sh
+++ b/tests/guix-build.sh
@@ -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
--
2.41.0
S
S
Simon Tournier wrote on 16 Aug 2023 15:32
87a5urglk2.fsf@gmail.com
Hi Ludo,

Cool!

On Fri, 11 Aug 2023 at 17:34, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (8 lines)
> This allows users to write Bash commands like:
>
> guix time-machine -C <(echo %default-channels) -- ...
>
> or:
>
> guix build -m <(echo '(specifications->manifest (list "guile"))')

I propose to document this. WDYT about this?

Toggle snippet (20 lines)
1 file changed, 6 insertions(+)
doc/guix.texi | 6 ++++++

modified doc/guix.texi
@@ -5103,6 +5103,12 @@ Invoking guix time-machine
@item -q
Inhibit loading of the user and system channel files,
@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.
+
+This option is equivalent to the command run on Bash shell:
+
+@example
+guix time-machine -C <(echo %default-channels) -- build hello
+@end example
@end table
As for @command{guix pull}, in the absence of any options,


Cheers,
simon
S
S
Simon Tournier wrote on 16 Aug 2023 14:59
Re: [bug#65229] [PATCH 1/2] pull, time-machine: Add '-q' to ignore channel files.
87edk3gn2g.fsf@gmail.com
Hi Ludo,

Cool addition!

On Fri, 11 Aug 2023 at 17:34, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (18 lines)
> -As for @command{guix pull}, the absence of any options means that the
> -latest commit on the master branch will be used. The command
> +As for @command{guix pull}, in the absence of any options,
> +@command{time-machine} fetches the latest commits of the channels
> +specified in @file{~/.config/guix/channels.scm},
> +@file{/etc/guix/channels.scm}, or the default channels; the @option{-q}
> +option lets you ignore these configuration files. The command:
>
> @example
> -guix time-machine -- build hello
> +guix time-machine -q -- build hello
> @end example
>
> -will thus build the package @code{hello} as defined in the master branch,
> -which is in general a newer revision of Guix than you have installed.
> -Time travel works in both directions!
> +will thus build the package @code{hello} as defined in the main branch

Why not the master branch? Is the branch renamed from ’master’ to
’main’? If not, I would keep the explicit master branch in order to
avoid confusion.

Toggle quote (4 lines)
> +of Guix, without any additional channel, which is in general a newer
> +revision of Guix than you have installed. Time travel works in both
> +directions!

Well, I would keep the previous example because the behaviour appears to
me more prone-error. I mean, by default, there is no channels.scm file
under ~/.config/guix/ or /etc/guix, therefore an explanation of the
behaviour without any option at all appears to me worth. Moreover,
since there is no channels.scm file by default, i.e., the default is
%default-channels, it appears to me weird to explain the specific
behaviour (without any option and reaching new revision) using an option
turning off the channels.scm file.



Toggle quote (5 lines)
> diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm

> + (display (G_ "
> + -q inhibit loading of user and system 'channels.scm'"))

[...]

Toggle quote (5 lines)
> diff --git a/guix/scripts/time-machine.scm b/guix/scripts/time-machine.scm

> + (display (G_ "
> + -q inhibit loading of user and system 'channels.scm'"))

No long option? As --no-channel-files or --ignore-channel-files ?


Cheers,
simon
S
S
Simon Tournier wrote on 16 Aug 2023 15:43
874jkzgl0x.fsf@gmail.com
Re,

On Wed, 16 Aug 2023 at 14:59, Simon Tournier <zimon.toutoune@gmail.com> wrote:

Toggle quote (9 lines)
> Well, I would keep the previous example because the behaviour appears to
> me more prone-error. I mean, by default, there is no channels.scm file
> under ~/.config/guix/ or /etc/guix, therefore an explanation of the
> behaviour without any option at all appears to me worth. Moreover,
> since there is no channels.scm file by default, i.e., the default is
> %default-channels, it appears to me weird to explain the specific
> behaviour (without any option and reaching new revision) using an option
> turning off the channels.scm file.

Somehow, I would keep something like [1]:

Toggle snippet (16 lines)
Similarly as @command{guix pull}, the absence of any options means that
either the user's @file{~/.config/guix/channels.scm} file, or either the
system-wide @file{/etc/guix/channels.scm} file, or either the built-in
default channels specified in the @code{%default-channels} will be
honored, in that order. The command

@example
guix time-machine -- build hello
@end example

will thus build the package @code{hello} as defined by the previous
@dfn{channels} file (@pxref{Channels}). In general, it builds a newer
revision of Guix than you have installed. Time travel works in both
directions!

L
L
Ludovic Courtès wrote on 17 Aug 2023 10:56
(name . Simon Tournier)(address . zimon.toutoune@gmail.com)
875y5eyrl0.fsf@gnu.org
Hi,

Simon Tournier <zimon.toutoune@gmail.com> skribis:

Toggle quote (2 lines)
> On Fri, 11 Aug 2023 at 17:34, Ludovic Courtès <ludo@gnu.org> wrote:

[...]

Toggle quote (9 lines)
>> -will thus build the package @code{hello} as defined in the master branch,
>> -which is in general a newer revision of Guix than you have installed.
>> -Time travel works in both directions!
>> +will thus build the package @code{hello} as defined in the main branch
>
> Why not the master branch? Is the branch renamed from ’master’ to
> ’main’? If not, I would keep the explicit master branch in order to
> avoid confusion.

The “main branch” is the branch currently called ‘master’ (I think we
should rename it to ‘main’ eventually, but I’d have written @code{main}
if I wanted to imply it’s called that way).

Toggle quote (13 lines)
>> +of Guix, without any additional channel, which is in general a newer
>> +revision of Guix than you have installed. Time travel works in both
>> +directions!
>
> Well, I would keep the previous example because the behaviour appears to
> me more prone-error. I mean, by default, there is no channels.scm file
> under ~/.config/guix/ or /etc/guix, therefore an explanation of the
> behaviour without any option at all appears to me worth. Moreover,
> since there is no channels.scm file by default, i.e., the default is
> %default-channels, it appears to me weird to explain the specific
> behaviour (without any option and reaching new revision) using an option
> turning off the channels.scm file.

I thought that we cannot easily describe what ‘guix time-machine --
build hello’ does, precisely because it depends on whether
‘channels.scm’ files are present and on what they do. Conversely,
explaining what happens with ‘-q’ is trivial because it doesn’t depend
on external state.

Anyway, I’ll try and reword that.

Toggle quote (14 lines)
>> diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
>
>> + (display (G_ "
>> + -q inhibit loading of user and system 'channels.scm'"))
>
> [...]
>
>> diff --git a/guix/scripts/time-machine.scm b/guix/scripts/time-machine.scm
>
>> + (display (G_ "
>> + -q inhibit loading of user and system 'channels.scm'"))
>
> No long option? As --no-channel-files or --ignore-channel-files ?

Yeah, I thought we’d follow ‘guix repl’ and ‘guile’, which have no long
option, but maybe we should add ‘--no-channel-files’.

Thanks you; I’ll send a new version.

Ludo’.
S
S
Simon Tournier wrote on 17 Aug 2023 11:59
(name . Ludovic Courtès)(address . ludo@gnu.org)
CAJ3okZ14gWMJ1tZONXVi6yEoJ8f3oovaQ-ufovKvxho7Vm0B5w@mail.gmail.com
Hi Ludo,

On Thu, 17 Aug 2023 at 10:57, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (13 lines)
> >> -will thus build the package @code{hello} as defined in the master branch,
> >> -which is in general a newer revision of Guix than you have installed.
> >> -Time travel works in both directions!
> >> +will thus build the package @code{hello} as defined in the main branch
> >
> > Why not the master branch? Is the branch renamed from ’master’ to
> > ’main’? If not, I would keep the explicit master branch in order to
> > avoid confusion.
>
> The “main branch” is the branch currently called ‘master’ (I think we
> should rename it to ‘main’ eventually, but I’d have written @code{main}
> if I wanted to imply it’s called that way).

I think the term "main branch" is confusing because many forges as
Gitlab propose by default to rename from @code{master} to
@code{main}. Well, if instead of @code{main}, these forges were
proposing @code{trunk} or @code{primary} or whatever else, it would be
fine.

Therefore, I propose the wording:

defined in the main branch of Guix (currently called @code{master}), without
any additional channel, [...]

Cheers,
simon
L
L
Ludovic Courtès wrote on 17 Aug 2023 12:17
[PATCH v2 2/2] pull, time-machine: Add '-q' to ignore channel files.
(address . 65229@debbugs.gnu.org)
d284f4657902327d599190b968e7f90ad522dd39.1692267211.git.ludo@gnu.org
From: Ludovic Courtès <ludovic.courtes@inria.fr>


* guix/scripts/pull.scm (show-help, %options): Add '-q'.
(channel-list): Honor it.
* guix/scripts/time-machine.scm (show-help, %options): Add '-q'.
* doc/guix.texi (Invoking guix pull, Invoking guix time-machine):
Document it.

Reported-by: Simon Tournier <zimon.toutoune@gmail.com>
---
doc/guix.texi | 47 +++++++++++++++++++++++++++--------
guix/scripts/pull.scm | 15 +++++++++--
guix/scripts/time-machine.scm | 8 +++++-
3 files changed, 57 insertions(+), 13 deletions(-)

Changes since v1:

• Add ‘--no-channel-files’.

• Join the two ‘time-machine’ examples, the one without ‘-q’ and
the one with ‘-q’ (I realized there was already one example
without ‘-q’ so I figured it was easier to clarify ‘channels.scm’
handling upfront).

• Document the <(echo %default-channels) trick.

Let me know what you think!

Ludo’.

Toggle diff (174 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 633d62bd98..2d54b92fa5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -4802,9 +4802,11 @@ Invoking guix pull
@item
the @option{--channels} option;
@item
-the user's @file{~/.config/guix/channels.scm} file;
+the user's @file{~/.config/guix/channels.scm} file, unless @option{-q}
+is passed;
@item
-the system-wide @file{/etc/guix/channels.scm} file;
+the system-wide @file{/etc/guix/channels.scm} file, unless @option{-q}
+is passed;
@item
the built-in default channels specified in the @code{%default-channels}
variable.
@@ -4906,6 +4908,11 @@ Invoking guix pull
evaluates to a list of channel objects. @xref{Channels}, for more
information.
+@item --no-channel-files
+@itemx -q
+Inhibit loading of the user and system channel files,
+@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.
+
@cindex channel news
@item --news
@itemx -N
@@ -5051,7 +5058,9 @@ Invoking guix time-machine
environment -C --ad-hoc guile -- guile
@end example
-The command above fetches Guix@tie{}1.2.0 and runs its @command{guix
+The command above fetches Guix@tie{}1.2.0 (and possibly other channels
+specified by your @file{channels.scm} configuration files---see
+below) and runs its @command{guix
environment} command to spawn an environment in a container running
@command{guile} (@command{guix environment} has since been subsumed by
@command{guix shell}; @pxref{Invoking guix shell}). It's like driving a
@@ -5061,6 +5070,21 @@ Invoking guix time-machine
large number of packages; the result is cached though and subsequent
commands targeting the same commit are almost instantaneous.
+As for @command{guix pull}, in the absence of any options,
+@command{time-machine} fetches the latest commits of the channels
+specified in @file{~/.config/guix/channels.scm},
+@file{/etc/guix/channels.scm}, or the default channels; the @option{-q}
+option lets you ignore these configuration files. The command:
+
+@example
+guix time-machine -q -- build hello
+@end example
+
+will thus build the package @code{hello} as defined in the main branch
+of Guix, without any additional channel, which is in general a newer
+revision of Guix than you have installed. Time travel works in both
+directions!
+
@quotation Note
The history of Guix is immutable and @command{guix time-machine}
provides the exact same software as they are in a specific Guix
@@ -5093,18 +5117,21 @@ Invoking guix time-machine
Read the list of channels from @var{file}. @var{file} must contain
Scheme code that evaluates to a list of channel objects.
@xref{Channels} for more information.
-@end table
-As for @command{guix pull}, the absence of any options means that the
-latest commit on the master branch will be used. The command
+@item --no-channel-files
+@itemx -q
+Inhibit loading of the user and system channel files,
+@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.
+
+Thus, @command{guix time-machine -q} is equivalent to the following Bash
+command, using the ``process substitution'' syntax (@pxref{Process
+Substitution,,, bash, The GNU Bash Reference Manual}):
@example
-guix time-machine -- build hello
+guix time-machine -C <(echo %default-channels) @dots{}
@end example
-will thus build the package @code{hello} as defined in the master branch,
-which is in general a newer revision of Guix than you have installed.
-Time travel works in both directions!
+@end table
Note that @command{guix time-machine} can trigger builds of channels and
their dependencies, and these are controlled by the standard build
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
index ecd264d3fa..3a8dd6ea01 100644
--- a/guix/scripts/pull.scm
+++ b/guix/scripts/pull.scm
@@ -84,6 +84,9 @@ (define (show-help)
Download and deploy the latest version of Guix.\n"))
(display (G_ "
-C, --channels=FILE deploy the channels defined in FILE"))
+ (display (G_ "
+ -q, --no-channel-files
+ inhibit loading of user and system 'channels.scm'"))
(display (G_ "
--url=URL download \"guix\" channel from the Git repository at URL"))
(display (G_ "
@@ -133,6 +136,9 @@ (define %options
(cons* (option '(#\C "channels") #t #f
(lambda (opt name arg result)
(alist-cons 'channel-file arg result)))
+ (option '(#\q "no-channel-files") #f #f
+ (lambda (opt name arg result)
+ (alist-cons 'ignore-channel-files? #t result)))
(option '(#\l "list-generations") #f #t
(lambda (opt name arg result)
(cons `(query list-generations ,arg)
@@ -735,6 +741,9 @@ (define (channel-list opts)
(define file
(assoc-ref opts 'channel-file))
+ (define ignore-channel-files?
+ (assoc-ref opts 'ignore-channel-files?))
+
(define default-file
(string-append (config-directory) "/channels.scm"))
@@ -750,9 +759,11 @@ (define (channel-list opts)
(define channels
(cond (file
(load-channels file))
- ((file-exists? default-file)
+ ((and (not ignore-channel-files?)
+ (file-exists? default-file))
(load-channels default-file))
- ((file-exists? global-file)
+ ((and (not ignore-channel-files?)
+ (file-exists? global-file))
(load-channels global-file))
(else
%default-channels)))
diff --git a/guix/scripts/time-machine.scm b/guix/scripts/time-machine.scm
index d7c71ef705..fa12e6f170 100644
--- a/guix/scripts/time-machine.scm
+++ b/guix/scripts/time-machine.scm
@@ -1,6 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Konrad Hinsen <konrad.hinsen@fastmail.net>
-;;; Copyright © 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019, 2020, 2021, 2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
;;;
;;; This file is part of GNU Guix.
@@ -51,6 +51,9 @@ (define (show-help)
Execute COMMAND ARGS... in an older version of Guix.\n"))
(display (G_ "
-C, --channels=FILE deploy the channels defined in FILE"))
+ (display (G_ "
+ -q, --no-channel-files
+ inhibit loading of user and system 'channels.scm'"))
(display (G_ "
--url=URL use the Git repository at URL"))
(display (G_ "
@@ -75,6 +78,9 @@ (define %options
(cons* (option '(#\C "channels") #t #f
(lambda (opt name arg result)
(alist-cons 'channel-file arg result)))
+ (option '(#\q "no-channel-files") #f #f
+ (lambda (opt name arg result)
+ (alist-cons 'ignore-channel-files? #t result)))
(option '("url") #t #f
(lambda (opt name arg result)
(alist-cons 'repository-url arg
--
2.41.0
L
L
Ludovic Courtès wrote on 17 Aug 2023 12:17
[PATCH v2 1/2] ui: 'load*' accepts /dev/fd/N files pointing to a pipe.
(address . 65229@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludovic.courtes@inria.fr)
f4b74d9d76b29436c1a4ce84fa3897bd274d524d.1692267211.git.ludo@gnu.org
From: Ludovic Courtès <ludovic.courtes@inria.fr>

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.
---
guix/ui.scm | 16 +++++++++++++++-
tests/guix-build.sh | 9 ++++++++-
2 files changed, 23 insertions(+), 2 deletions(-)

Toggle diff (63 lines)
diff --git a/guix/ui.scm b/guix/ui.scm
index 47a118364a..6f2d4fe245 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -200,6 +200,20 @@ (define-syntax-rule (without-compiler-optimizations exp)
(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 @@ (define* (load* file user-module
;; '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
diff --git a/tests/guix-build.sh b/tests/guix-build.sh
index 317c58ac42..4eab0e38b6 100644
--- a/tests/guix-build.sh
+++ b/tests/guix-build.sh
@@ -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

base-commit: 1bd44b425b79e9da160b33a9b19d01973b44772e
--
2.41.0
S
S
Simon Tournier wrote on 17 Aug 2023 13:20
Re: [PATCH v2 2/2] pull, time-machine: Add '-q' to ignore channel files.
(name . Ludovic Courtès)(address . ludo@gnu.org)
CAJ3okZ1HF4xH8Zg0X6Ex5eQYJLcAgtpuJF3KtkuGE9mGRqr35g@mail.gmail.com
Hi,

On Thu, 17 Aug 2023 at 12:17, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (2 lines)
> • Document the <(echo %default-channels) trick.

LGTM!

Well, it appears to me weird to document with this patch this track
and then introduce the implementation in the next commit. Anyway,
it's nitpicking. :-)
However, as I mentioned, I still find confusing the wording "main
branch" and I think "main branch of Guix (currently named
@code{master))" fixes the confusion.

Cheers,
simon
L
L
Ludovic Courtès wrote on 17 Aug 2023 19:10
Re: bug#65229: [PATCH 0/2] Add '-q' for 'pull' and 'time-machine'; support loading from pipes
(name . Simon Tournier)(address . zimon.toutoune@gmail.com)(address . 65229-done@debbugs.gnu.org)
87a5upvbma.fsf_-_@gnu.org
Simon Tournier <zimon.toutoune@gmail.com> skribis:

Toggle quote (6 lines)
> On Thu, 17 Aug 2023 at 12:17, Ludovic Courtès <ludo@gnu.org> wrote:
>
>> • Document the <(echo %default-channels) trick.
>
> LGTM!

Pushed as 9c8098424b5be3abf21144c74162ec39c0c2e799, thanks!

Ludo’.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 65229@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 65229
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch