[PATCH] environment: Allow starting from existing profile

  • Done
  • quality assurance status badge
Details
2 participants
  • ???
  • Lars-Dominik Braun
Owner
unassigned
Submitted by
Lars-Dominik Braun
Severity
normal
L
L
Lars-Dominik Braun wrote on 4 Feb 2021 11:13
(address . guix-patches@gnu.org)
YBvIwN1VVibJ2XHb@noor.fritz.box
Hi everyone,

the attched patch allows starting a `guix environment` from an existing
profile. Our use-case is this: We have profiles, created by

guix package -p /path -i …

because we need to parse desktop files in /path/share/applications. Also
this does the heavy-lifting (substitutes/building/grafting) upfront once
and not when starting an environment. Then we start an application from
this profile using

guix environment -C […] -p /path -- jupyterlab […]

This is much faster (10x) for large profiles (i.e. JupyterLab) than

guix environment -C […] -m manifest.scm -- jupyterlab […]

and makes sure the environment is exactly the same as

source /path/etc/profile

I think there have been many discussions about how `guix environment`
should work and this is certainly not the silver bullet, but it’s a huge
improvement for us with very limited code changes required.

Cheers,
Lars
From 3010cea7273f02e33f65dd5d78390f0f5b7e4698 Mon Sep 17 00:00:00 2001
From: Lars-Dominik Braun <lars@6xq.net>
Date: Thu, 4 Feb 2021 10:43:45 +0100
Subject: [PATCH] environment: Allow starting from existing profile

* guix/scripts/environment.scm (%options): Add -p/--profile switch.
(show-help): Document new switch.
(guix-environment): Handle new 'profile switch.
---
guix/scripts/environment.scm | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)

Toggle diff (70 lines)
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index f4d12f89bf..25bc208489 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -21,6 +21,7 @@
(define-module (guix scripts environment)
#:use-module (guix ui)
#:use-module (guix store)
+ #:use-module (guix utils)
#:use-module ((guix status) #:select (with-status-verbosity))
#:use-module (guix grafts)
#:use-module (guix derivations)
@@ -136,6 +137,8 @@ COMMAND or an interactive shell in that environment.\n"))
FILE evaluates to"))
(display (G_ "
-m, --manifest=FILE create environment with the manifest from FILE"))
+ (display (G_ "
+ -p, --profile=PATH create environment from profile at PATH"))
(display (G_ "
--ad-hoc include all specified packages in the environment instead
of only their inputs"))
@@ -269,6 +272,10 @@ use '--preserve' instead~%"))
(option '(#\P "link-profile") #f #f
(lambda (opt name arg result)
(alist-cons 'link-profile? #t result)))
+ (option '(#\p "profile") #t #f
+ (lambda (opt name arg result)
+ (alist-cons 'profile arg
+ (alist-delete 'profile result eq?))))
(option '(#\u "user") #t #f
(lambda (opt name arg result)
(alist-cons 'user arg
@@ -706,6 +713,7 @@ message if any test fails."
(user (assoc-ref opts 'user))
(bootstrap? (assoc-ref opts 'bootstrap?))
(system (assoc-ref opts 'system))
+ (profile (assoc-ref opts 'profile))
(command (or (assoc-ref opts 'exec)
;; Spawn a shell if the user didn't specify
;; anything in particular.
@@ -735,8 +743,15 @@ message if any test fails."
#:dry-run?
(assoc-ref opts 'dry-run?))
(with-status-verbosity (assoc-ref opts 'verbosity)
- (define manifest
+ (define manifest-from-opts
(options/resolve-packages store opts))
+ (when (and profile (> (length (manifest-entries manifest-from-opts)) 0))
+ (leave (G_ "'--profile' cannot be used with package options~%")))
+
+ (define manifest
+ (if profile
+ (profile-manifest profile)
+ manifest-from-opts))
(set-build-options-from-command-line store opts)
@@ -755,7 +770,9 @@ message if any test fails."
system))
(prof-drv (manifest->derivation
manifest system bootstrap?))
- (profile -> (derivation->output-path prof-drv))
+ (profile -> (if profile
+ (readlink* profile)
+ (derivation->output-path prof-drv)))
(gc-root -> (assoc-ref opts 'gc-root)))
;; First build the inputs. This is necessary even for
--
2.26.2
?
(name . Lars-Dominik Braun)(address . lars@6xq.net)(address . 46291-done@debbugs.gnu.org)
OSZP286MB066474D57DC1F59E3D191508A38C9@OSZP286MB0664.JPNP286.PROD.OUTLOOK.COM
Lars-Dominik Braun <lars@6xq.net> writes:

Toggle quote (26 lines)
> Hi everyone,
>
> the attched patch allows starting a `guix environment` from an existing
> profile. Our use-case is this: We have profiles, created by
>
> guix package -p /path -i &
>
> because we need to parse desktop files in /path/share/applications. Also
> this does the heavy-lifting (substitutes/building/grafting) upfront once
> and not when starting an environment. Then we start an application from
> this profile using
>
> guix environment -C [&] -p /path -- jupyterlab [&]
>
> This is much faster (10x) for large profiles (i.e. JupyterLab) than
>
> guix environment -C [&] -m manifest.scm -- jupyterlab [&]
>
> and makes sure the environment is exactly the same as
>
> source /path/etc/profile
>
> I think there have been many discussions about how `guix environment`
> should work and this is certainly not the silver bullet, but it.s a huge
> improvement for us with very limited code changes required.

Look excellent to me, pushed, thank you!
Closed
?
Your comment

This issue is archived.

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

To respond to this issue using the mumi CLI, first switch to it
mumi current 46291
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