mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-25 22:08:16 -05:00
guix package: '--search-paths' can report combined search paths.
Partly fixes <http://bugs.gnu.org/20255>. * guix/scripts/package.scm (search-path-environment-variables): Change 'profile' to 'profiles'; expect it to be a list. (display-search-paths): Likewise. (%default-options): Remove 'profile' entry. (%options) <--profile>: Keep previous values associated with 'profile' in RESULT. (guix-package)[process-actions, process-query]: Handle the possible lack of 'profile' pair in OPTS.
This commit is contained in:
parent
21059b26b0
commit
fc2d233964
3 changed files with 60 additions and 30 deletions
|
@ -1347,6 +1347,20 @@ meaning that the returned environment variable definitions will either
|
||||||
be exact settings, or prefixes or suffixes of the current value of these
|
be exact settings, or prefixes or suffixes of the current value of these
|
||||||
variables. When omitted, @var{kind} defaults to @code{exact}.
|
variables. When omitted, @var{kind} defaults to @code{exact}.
|
||||||
|
|
||||||
|
This option can also be used to compute the @emph{combined} search paths
|
||||||
|
of several profiles. Consider this example:
|
||||||
|
|
||||||
|
@example
|
||||||
|
$ guix package -p foo -i guile
|
||||||
|
$ guix package -p bar -i guile-json
|
||||||
|
$ guix package -p foo -p bar --search-paths
|
||||||
|
@end example
|
||||||
|
|
||||||
|
The last command above reports about the @code{GUILE_LOAD_PATH}
|
||||||
|
variable, even though, taken individually, neither @file{foo} nor
|
||||||
|
@file{bar} would lead to that recommendation.
|
||||||
|
|
||||||
|
|
||||||
@item --profile=@var{profile}
|
@item --profile=@var{profile}
|
||||||
@itemx -p @var{profile}
|
@itemx -p @var{profile}
|
||||||
Use @var{profile} instead of the user's default profile.
|
Use @var{profile} instead of the user's default profile.
|
||||||
|
|
|
@ -186,11 +186,11 @@ (define (upgradeable? name current-version current-path)
|
||||||
;;; Search paths.
|
;;; Search paths.
|
||||||
;;;
|
;;;
|
||||||
|
|
||||||
(define* (search-path-environment-variables entries profile
|
(define* (search-path-environment-variables entries profiles
|
||||||
#:optional (getenv getenv)
|
#:optional (getenv getenv)
|
||||||
#:key (kind 'exact))
|
#:key (kind 'exact))
|
||||||
"Return environment variable definitions that may be needed for the use of
|
"Return environment variable definitions that may be needed for the use of
|
||||||
ENTRIES, a list of manifest entries, in PROFILE. Use GETENV to determine the
|
ENTRIES, a list of manifest entries, in PROFILES. Use GETENV to determine the
|
||||||
current settings and report only settings not already effective. KIND
|
current settings and report only settings not already effective. KIND
|
||||||
must be one of 'exact, 'prefix, or 'suffix, depending on the kind of search
|
must be one of 'exact, 'prefix, or 'suffix, depending on the kind of search
|
||||||
path definition to be returned."
|
path definition to be returned."
|
||||||
|
@ -205,15 +205,15 @@ (define* (search-path-environment-variables entries profile
|
||||||
(environment-variable-definition variable value
|
(environment-variable-definition variable value
|
||||||
#:separator sep
|
#:separator sep
|
||||||
#:kind kind))))
|
#:kind kind))))
|
||||||
(evaluate-search-paths search-paths (list profile)
|
(evaluate-search-paths search-paths profiles
|
||||||
getenv))))
|
getenv))))
|
||||||
|
|
||||||
(define* (display-search-paths entries profile
|
(define* (display-search-paths entries profiles
|
||||||
#:key (kind 'exact))
|
#:key (kind 'exact))
|
||||||
"Display the search path environment variables that may need to be set for
|
"Display the search path environment variables that may need to be set for
|
||||||
ENTRIES, a list of manifest entries, in the context of PROFILE."
|
ENTRIES, a list of manifest entries, in the context of PROFILE."
|
||||||
(let* ((profile (user-friendly-profile profile))
|
(let* ((profiles (map user-friendly-profile profiles))
|
||||||
(settings (search-path-environment-variables entries profile
|
(settings (search-path-environment-variables entries profiles
|
||||||
#:kind kind)))
|
#:kind kind)))
|
||||||
(unless (null? settings)
|
(unless (null? settings)
|
||||||
(format #t (_ "The following environment variable definitions may be needed:~%"))
|
(format #t (_ "The following environment variable definitions may be needed:~%"))
|
||||||
|
@ -226,8 +226,7 @@ (define* (display-search-paths entries profile
|
||||||
|
|
||||||
(define %default-options
|
(define %default-options
|
||||||
;; Alist of default option values.
|
;; Alist of default option values.
|
||||||
`((profile . ,%current-profile)
|
`((max-silent-time . 3600)
|
||||||
(max-silent-time . 3600)
|
|
||||||
(verbosity . 0)
|
(verbosity . 0)
|
||||||
(substitutes? . #t)))
|
(substitutes? . #t)))
|
||||||
|
|
||||||
|
@ -386,7 +385,7 @@ (define %options
|
||||||
(option '(#\p "profile") #t #f
|
(option '(#\p "profile") #t #f
|
||||||
(lambda (opt name arg result arg-handler)
|
(lambda (opt name arg result arg-handler)
|
||||||
(values (alist-cons 'profile (canonicalize-profile arg)
|
(values (alist-cons 'profile (canonicalize-profile arg)
|
||||||
(alist-delete 'profile result))
|
result)
|
||||||
#f)))
|
#f)))
|
||||||
(option '(#\n "dry-run") #f #f
|
(option '(#\n "dry-run") #f #f
|
||||||
(lambda (opt name arg result arg-handler)
|
(lambda (opt name arg result arg-handler)
|
||||||
|
@ -601,7 +600,7 @@ (define (process-actions opts)
|
||||||
;; Process any install/remove/upgrade action from OPTS.
|
;; Process any install/remove/upgrade action from OPTS.
|
||||||
|
|
||||||
(define dry-run? (assoc-ref opts 'dry-run?))
|
(define dry-run? (assoc-ref opts 'dry-run?))
|
||||||
(define profile (assoc-ref opts 'profile))
|
(define profile (or (assoc-ref opts 'profile) %current-profile))
|
||||||
|
|
||||||
(define (build-and-use-profile manifest)
|
(define (build-and-use-profile manifest)
|
||||||
(let* ((bootstrap? (assoc-ref opts 'bootstrap?)))
|
(let* ((bootstrap? (assoc-ref opts 'bootstrap?)))
|
||||||
|
@ -645,7 +644,7 @@ (define (build-and-use-profile manifest)
|
||||||
"~a packages in profile~%"
|
"~a packages in profile~%"
|
||||||
count)
|
count)
|
||||||
count)
|
count)
|
||||||
(display-search-paths entries profile)))))))))
|
(display-search-paths entries (list profile))))))))))
|
||||||
|
|
||||||
;; First roll back if asked to.
|
;; First roll back if asked to.
|
||||||
(cond ((and (assoc-ref opts 'roll-back?)
|
(cond ((and (assoc-ref opts 'roll-back?)
|
||||||
|
@ -674,12 +673,12 @@ (define (build-and-use-profile manifest)
|
||||||
(not dry-run?))
|
(not dry-run?))
|
||||||
(for-each
|
(for-each
|
||||||
(match-lambda
|
(match-lambda
|
||||||
(('delete-generations . pattern)
|
(('delete-generations . pattern)
|
||||||
(delete-matching-generations (%store) profile pattern)
|
(delete-matching-generations (%store) profile pattern)
|
||||||
|
|
||||||
(process-actions
|
(process-actions
|
||||||
(alist-delete 'delete-generations opts)))
|
(alist-delete 'delete-generations opts)))
|
||||||
(_ #f))
|
(_ #f))
|
||||||
opts))
|
opts))
|
||||||
((assoc-ref opts 'manifest)
|
((assoc-ref opts 'manifest)
|
||||||
(let* ((file-name (assoc-ref opts 'manifest))
|
(let* ((file-name (assoc-ref opts 'manifest))
|
||||||
|
@ -709,7 +708,14 @@ (define (build-and-use-profile manifest)
|
||||||
(define (process-query opts)
|
(define (process-query opts)
|
||||||
;; Process any query specified by OPTS. Return #t when a query was
|
;; Process any query specified by OPTS. Return #t when a query was
|
||||||
;; actually processed, #f otherwise.
|
;; actually processed, #f otherwise.
|
||||||
(let ((profile (assoc-ref opts 'profile)))
|
(let* ((profiles (match (filter-map (match-lambda
|
||||||
|
(('profile . p) p)
|
||||||
|
(_ #f))
|
||||||
|
opts)
|
||||||
|
(() (list %current-profile))
|
||||||
|
(lst lst)))
|
||||||
|
(profile (match profiles
|
||||||
|
((head tail ...) head))))
|
||||||
(match (assoc-ref opts 'query)
|
(match (assoc-ref opts 'query)
|
||||||
(('list-generations pattern)
|
(('list-generations pattern)
|
||||||
(define (list-generation number)
|
(define (list-generation number)
|
||||||
|
@ -718,7 +724,7 @@ (define (list-generation number)
|
||||||
(display-profile-content profile number)
|
(display-profile-content profile number)
|
||||||
(newline)))
|
(newline)))
|
||||||
|
|
||||||
(cond ((not (file-exists? profile)) ; XXX: race condition
|
(cond ((not (file-exists? profile)) ; XXX: race condition
|
||||||
(raise (condition (&profile-not-found-error
|
(raise (condition (&profile-not-found-error
|
||||||
(profile profile)))))
|
(profile profile)))))
|
||||||
((string-null? pattern)
|
((string-null? pattern)
|
||||||
|
@ -741,11 +747,11 @@ (define (list-generation number)
|
||||||
(installed (manifest-entries manifest)))
|
(installed (manifest-entries manifest)))
|
||||||
(leave-on-EPIPE
|
(leave-on-EPIPE
|
||||||
(for-each (match-lambda
|
(for-each (match-lambda
|
||||||
(($ <manifest-entry> name version output path _)
|
(($ <manifest-entry> name version output path _)
|
||||||
(when (or (not regexp)
|
(when (or (not regexp)
|
||||||
(regexp-exec regexp name))
|
(regexp-exec regexp name))
|
||||||
(format #t "~a\t~a\t~a\t~a~%"
|
(format #t "~a\t~a\t~a\t~a~%"
|
||||||
name (or version "?") output path))))
|
name (or version "?") output path))))
|
||||||
|
|
||||||
;; Show most recently installed packages last.
|
;; Show most recently installed packages last.
|
||||||
(reverse installed)))
|
(reverse installed)))
|
||||||
|
@ -793,12 +799,12 @@ (define (list-generation number)
|
||||||
#t))
|
#t))
|
||||||
|
|
||||||
(('search-paths kind)
|
(('search-paths kind)
|
||||||
(let* ((manifest (profile-manifest profile))
|
(let* ((manifests (map profile-manifest profiles))
|
||||||
(entries (manifest-entries manifest))
|
(entries (append-map manifest-entries manifests))
|
||||||
(profile (user-friendly-profile profile))
|
(profiles (map user-friendly-profile profiles))
|
||||||
(settings (search-path-environment-variables entries profile
|
(settings (search-path-environment-variables entries profiles
|
||||||
(const #f)
|
(const #f)
|
||||||
#:kind kind)))
|
#:kind kind)))
|
||||||
(format #t "~{~a~%~}" settings)
|
(format #t "~{~a~%~}" settings)
|
||||||
#t))
|
#t))
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,10 @@ fi
|
||||||
|
|
||||||
|
|
||||||
profile="t-profile-$$"
|
profile="t-profile-$$"
|
||||||
|
profile_alt="t-profile-alt-$$"
|
||||||
rm -f "$profile"
|
rm -f "$profile"
|
||||||
|
|
||||||
trap 'rm -f "$profile" "$profile-"[0-9]* ; rm -rf t-home-'"$$" EXIT
|
trap 'rm -f "$profile" "$profile_alt" "$profile-"[0-9]* ; rm -rf t-home-'"$$" EXIT
|
||||||
|
|
||||||
|
|
||||||
guix package --bootstrap -p "$profile" -i guile-bootstrap
|
guix package --bootstrap -p "$profile" -i guile-bootstrap
|
||||||
|
@ -156,6 +157,15 @@ guix package -p "$profile" --switch-generation=2
|
||||||
guix package -p "$profile" --delete-generations=3
|
guix package -p "$profile" --delete-generations=3
|
||||||
test -z "`guix package -p "$profile" -l 3`"
|
test -z "`guix package -p "$profile" -l 3`"
|
||||||
|
|
||||||
|
# Search path of combined profiles. 'LIBRARY_PATH' should show up only in the
|
||||||
|
# combination, not in the individual profiles.
|
||||||
|
rm "$profile"
|
||||||
|
guix package --bootstrap -p "$profile" -i guile-bootstrap
|
||||||
|
guix package --bootstrap -p "$profile_alt" -i gcc-bootstrap
|
||||||
|
if guix package -p "$profile" --search-paths | grep LIBRARY_PATH
|
||||||
|
then false; fi
|
||||||
|
guix package -p "$profile" -p "$profile_alt" --search-paths \
|
||||||
|
| grep "LIBRARY_PATH.*$profile/lib"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Try with the default profile.
|
# Try with the default profile.
|
||||||
|
|
Loading…
Reference in a new issue