guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] guix environment: Add --ad-hoc option.


From: David Thompson
Subject: [PATCH] guix environment: Add --ad-hoc option.
Date: Thu, 28 May 2015 08:47:00 -0400
User-agent: Notmuch/0.19 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-unknown-linux-gnu)

I find myself frequently wanting to quickly create an environment with
just a few packages in it, without having to go through the song and
dance of creating a package expression for it.  This patch addresses
this use-case.

>From 30a5b0f61e5c4a0e0244015f127ba3255f834139 Mon Sep 17 00:00:00 2001
From: David Thompson <address@hidden>
Date: Thu, 28 May 2015 08:41:04 -0400
Subject: [PATCH] guix environment: Add --ad-hoc option.

* guix/scripts/environment.scm (%options): Add "ad-hoc" option.
  (show-help): Display help for "--ad-hoc".
  (packages+propagated-inputs): New procedure.
  (guix-environment): Create ad hoc environment when asked.
* doc/guix.texi ("invoking guix environment"): Document it.
---
 doc/guix.texi                |  8 +++++++-
 guix/scripts/environment.scm | 27 ++++++++++++++++++++++++---
 2 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 1956dbc..2a9f61e 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2381,7 +2381,7 @@ the @code{#:haddock-flags} parameter.  If the file 
@code{Setup.hs} is
 not found, the build system looks for @code{Setup.lhs} instead.
 
 Which Haskell compiler is used can be specified with the @code{#:haskell}
-parameter which defaults to @code{ghc}. 
+parameter which defaults to @code{ghc}.
 @end defvr
 
 Lastly, for packages that do not need anything as sophisticated, a
@@ -3932,6 +3932,12 @@ evaluates to.
 @item -E @var{command}
 Execute @var{command} in the new environment.
 
address@hidden --ad-hoc
+Include all specified packages in the resulting environment, as if an ad
+hoc package were defined with them as inputs.  This option is useful for
+quickly creating an environment without having to write a package
+expression to contain the desired inputs.
+
 @item --pure
 Unset existing environment variables when building the new environment.
 This has the effect of creating an environment in which search paths
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index d053daf..4217809 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 David Thompson <address@hidden>
+;;; Copyright © 2014, 2015 David Thompson <address@hidden>
 ;;; Copyright © 2015 Ludovic Courtès <address@hidden>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -103,6 +103,9 @@ shell command in that environment.\n"))
   (display (_ "
   -E, --exec=COMMAND     execute COMMAND in new environment"))
   (display (_ "
+      --ad-hoc           include all specified packages in the environment 
instead
+                         of only their inputs"))
+  (display (_ "
       --pure             unset existing environment variables"))
   (display (_ "
       --search-paths     display needed environment variable definitions"))
@@ -147,6 +150,9 @@ shell command in that environment.\n"))
          (option '(#\e "expression") #t #f
                  (lambda (opt name arg result)
                    (alist-cons 'expression arg result)))
+         (option '("ad-hoc") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'ad-hoc? #t result)))
          (option '(#\n "dry-run") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'dry-run? #t result)))
@@ -191,6 +197,18 @@ packages."
   (delete-duplicates
    (append-map transitive-inputs packages)))
 
+(define (packages+propagated-inputs packages)
+  "Return a list containing PACKAGES plus all of their propagated inputs."
+  (delete-duplicates
+   (append packages
+           (map (match-lambda
+                  ((or (_ (? package? package))
+                       (_ (? package? package) _))
+                   package)
+                  (_ #f))
+                (append-map package-transitive-propagated-inputs
+                            packages)))))
+
 (define (build-inputs inputs opts)
   "Build the packages in INPUTS using the build options in OPTS."
   (let ((substitutes? (assoc-ref opts 'substitutes?))
@@ -218,9 +236,12 @@ packages."
       (let* ((opts  (parse-command-line args %options (list %default-options)
                                         #:argument-handler handle-argument))
              (pure? (assoc-ref opts 'pure))
+             (ad-hoc? (assoc-ref opts 'ad-hoc?))
              (command (assoc-ref opts 'exec))
-             (inputs (packages->transitive-inputs
-                      (pick-all (options/resolve-packages opts) 'package)))
+             (packages (pick-all (options/resolve-packages opts) 'package))
+             (inputs (if ad-hoc?
+                         (packages+propagated-inputs packages)
+                         (packages->transitive-inputs packages)))
              (drvs (run-with-store store
                      (mbegin %store-monad
                        (set-guile-for-build (default-guile))
-- 
2.2.1

-- 
David Thompson
GPG Key: 0FF1D807

reply via email to

[Prev in Thread] Current Thread [Next in Thread]