Re: [PATCH] guix package: allow multiple arguments after -i, -r, and -u

2013-12-14 Thread Mark H Weaver
l...@gnu.org (Ludovic Courtès) writes:
 Looks great to me!

Excellent!  Here's an updated patch incorporating your suggestions,
and also with the following additional changes:

* Arguments to install and remove are now optional, so --install a b
  works without the '='.

* I fixed a bug where --upgrade gcc (without the '=') would upgrade
  everything.

* I updated the manual to reflect the new syntax, by adding @dots{}
  in a few places with small changes to the text.

What do you think?

  Mark


From 178bbd252b1b6b5b9b0d775af3d98992188f9849 Mon Sep 17 00:00:00 2001
From: Mark H Weaver m...@netris.org
Date: Fri, 13 Dec 2013 15:37:57 -0500
Subject: [PATCH] guix package: allow multiple arguments after -i, -r, and -u.

* guix/scripts/package.scm (%options): Adapt option processors to accept and
  return a second seed value: 'arg-handler', which handles bare arguments (if
  not false).  The install, remove, and upgrade option processors return an
  arg-handler that repeat the same operation.  All other option processors
  return #f as the arg-handler.  Make the arguments to install and remove
  optional.  The upgrade option processor deletes (upgrade . #f) from the
  alist before adding a new entry.
  (guix-package): Procedures passed to 'args-fold*' accept the new seed value
  'arg-handler'.  The 'operand-proc' uses 'arg-handler' (if not false).

* doc/guix.texi (Invoking guix package): Update docs.

* tests/guix-package.sh: Add test.
---
 doc/guix.texi|   32 +++
 guix/scripts/package.scm |  136 --
 tests/guix-package.sh|3 +
 3 files changed, 107 insertions(+), 64 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 8483dbb..36297db 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -501,6 +501,13 @@ the transaction.  Upon completion, a new profile is created, but
 previous generations of the profile remain available, should the user
 want to roll back.
 
+For example, to remove @code{lua} and install @code{guile} and
+@code{guile-cairo} in a single transaction:
+
+@example
+guix package -r lua -i guile guile-cairo
+@end example
+
 For each user, a symlink to the user's default profile is automatically
 created in @file{$HOME/.guix-profile}.  This symlink always points to the
 current generation of the user's default profile.  Thus, users can add
@@ -522,11 +529,11 @@ The @var{options} can be among the following:
 
 @table @code
 
-@item --install=@var{package}
-@itemx -i @var{package}
-Install @var{package}.
+@item --install=@var{package} @dots{}
+@itemx -i @var{package} @dots{}
+Install the specified @var{package}s.
 
-@var{package} may specify either a simple package name, such as
+Each @var{package} may specify either a simple package name, such as
 @code{guile}, or a package name followed by a hyphen and version number,
 such as @code{guile-1.8.8}.  If no version number is specified, the
 newest available version will be selected.  In addition, @var{package}
@@ -568,19 +575,20 @@ Note that this option installs the first output of the specified
 package, which may be insufficient when needing a specific output of a
 multiple-output package.
 
-@item --remove=@var{package}
-@itemx -r @var{package}
-Remove @var{package}.
+@item --remove=@var{package} @dots{}
+@itemx -r @var{package} @dots{}
+Remove the specified @var{package}s.
 
-As for @code{--install}, @var{package} may specify a version number
+As for @code{--install}, each @var{package} may specify a version number
 and/or output name in addition to the package name.  For instance,
 @code{-r glibc:debug} would remove the @code{debug} output of
 @code{glibc}.
 
-@item --upgrade[=@var{regexp}]
-@itemx -u [@var{regexp}]
-Upgrade all the installed packages.  When @var{regexp} is specified, upgrade
-only installed packages whose name matches @var{regexp}.
+@item --upgrade[=@var{regexp} @dots{}]
+@itemx -u [@var{regexp} @dots{}]
+Upgrade all the installed packages.  If one or more @var{regexp}s are
+specified, upgrade only installed packages whose name matches a
+@var{regexp}.
 
 Note that this upgrades package to the latest version of packages found
 in the distribution currently installed.  To update your distribution,
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 2890d54..49fa457 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -523,70 +523,99 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n))
 (lambda args
   (show-version-and-exit guix package)))
 
-(option '(#\i install) #t #f
-(lambda (opt name arg result)
-  (alist-cons 'install arg result)))
+(option '(#\i install) #f #t
+(lambda (opt name arg result arg-handler)
+  (let arg-handler ((arg arg) (result result))
+(values (if arg
+(alist-cons 'install arg result)
+

Re: [PATCH] guix package: allow multiple arguments after -i, -r, and -u

2013-12-14 Thread Ludovic Courtès
Mark H Weaver m...@netris.org skribis:

 Excellent!  Here's an updated patch incorporating your suggestions,
 and also with the following additional changes:

 * Arguments to install and remove are now optional, so --install a b
   works without the '='.

 * I fixed a bug where --upgrade gcc (without the '=') would upgrade
   everything.

 * I updated the manual to reflect the new syntax, by adding @dots{}
   in a few places with small changes to the text.

 What do you think?

Looks good to me, please push!

Ludo’.



Re: [PATCH] guix package: allow multiple arguments after -i, -r, and -u

2013-12-13 Thread Ludovic Courtès
Mark H Weaver m...@netris.org skribis:

 From 95c205364cd0cececb0a464fea6f4a328467ef54 Mon Sep 17 00:00:00 2001
 From: Mark H Weaver m...@netris.org
 Date: Fri, 13 Dec 2013 15:37:57 -0500
 Subject: [PATCH] guix package: allow multiple arguments after -i, -r, and -u.

 * guix/scripts/package.scm (%options): Adapt option processors to accept and
   return a second seed value: 'arg-handler', which handles bare arguments (if
   not false).  The install, remove, and upgrade option processors return an
   arg-handler that repeat the same operation.  All other option processors
   return #f as the arg-handler.
   (guix-package): Procedures passed to 'args-fold*' accept the new seed value
   'arg-handler'.  The 'operand-proc' uses 'arg-handler' (if not false).

Looks great to me!

Could you add a test in guix-package.sh, which could be just

  guix package -i guile gcc -n

or similar?

Likewise, could you add an example in guix.texi that uses this syntax,
say just after “@var{options} specifies...”?

Thanks!

Ludo’.