graph: Support package transformation options.

* guix/scripts/graph.scm (%options): Append %TRANSFORMATION-OPTIONS.
(show-help): Call 'show-transformation-options-help'.
(guix-graph): Call 'options->transformation' and use it.
* tests/guix-graph.sh: Add test.
* doc/guix.texi (Invoking guix graph): Document it.
This commit is contained in:
Ludovic Courtès 2019-11-07 18:15:55 +01:00
parent 7de9471707
commit 3e962e59d8
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
3 changed files with 78 additions and 46 deletions

View File

@ -9907,7 +9907,18 @@ The package dependency graph is largely architecture-independent, but there
are some architecture-dependent bits that this option allows you to visualize. are some architecture-dependent bits that this option allows you to visualize.
@end table @end table
On top of that, @command{guix graph} supports all the usual package
transformation options (@pxref{Package Transformation Options}). This
makes it easy to view the effect of a graph-rewriting transformation
such as @option{--with-input}. For example, the command below outputs
the graph of @code{git} once @code{openssl} has been replaced by
@code{libressl} everywhere in the graph:
@example
guix graph git --with-input=openssl=libressl
@end example
So many possibilities, so much fun!
@node Invoking guix publish @node Invoking guix publish
@section Invoking @command{guix publish} @section Invoking @command{guix publish}

View File

@ -32,6 +32,10 @@
#:use-module (gnu packages) #:use-module (gnu packages)
#:use-module (guix sets) #:use-module (guix sets)
#:use-module ((guix utils) #:select (location-file)) #:use-module ((guix utils) #:select (location-file))
#:use-module ((guix scripts build)
#:select (show-transformation-options-help
options->transformation
%transformation-options))
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (srfi srfi-34) #:use-module (srfi srfi-34)
@ -446,36 +450,38 @@ package modules, while attempting to retain user package modules."
;;; ;;;
(define %options (define %options
(list (option '(#\t "type") #t #f (cons* (option '(#\t "type") #t #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'node-type (lookup-node-type arg) (alist-cons 'node-type (lookup-node-type arg)
result))) result)))
(option '("list-types") #f #f (option '("list-types") #f #f
(lambda (opt name arg result) (lambda (opt name arg result)
(list-node-types) (list-node-types)
(exit 0))) (exit 0)))
(option '(#\b "backend") #t #f (option '(#\b "backend") #t #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'backend (lookup-backend arg) (alist-cons 'backend (lookup-backend arg)
result))) result)))
(option '("list-backends") #f #f (option '("list-backends") #f #f
(lambda (opt name arg result) (lambda (opt name arg result)
(list-backends) (list-backends)
(exit 0))) (exit 0)))
(option '(#\e "expression") #t #f (option '(#\e "expression") #t #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'expression arg result))) (alist-cons 'expression arg result)))
(option '(#\s "system") #t #f (option '(#\s "system") #t #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'system arg (alist-cons 'system arg
(alist-delete 'system result eq?)))) (alist-delete 'system result eq?))))
(option '(#\h "help") #f #f (option '(#\h "help") #f #f
(lambda args (lambda args
(show-help) (show-help)
(exit 0))) (exit 0)))
(option '(#\V "version") #f #f (option '(#\V "version") #f #f
(lambda args (lambda args
(show-version-and-exit "guix edit"))))) (show-version-and-exit "guix graph")))
%transformation-options))
(define (show-help) (define (show-help)
;; TRANSLATORS: Here 'dot' is the name of a program; it must not be ;; TRANSLATORS: Here 'dot' is the name of a program; it must not be
@ -495,6 +501,8 @@ Emit a representation of the dependency graph of PACKAGE...\n"))
(display (G_ " (display (G_ "
-s, --system=SYSTEM consider the graph for SYSTEM--e.g., \"i686-linux\"")) -s, --system=SYSTEM consider the graph for SYSTEM--e.g., \"i686-linux\""))
(newline) (newline)
(show-transformation-options-help)
(newline)
(display (G_ " (display (G_ "
-h, --help display this help and exit")) -h, --help display this help and exit"))
(display (G_ " (display (G_ "
@ -514,21 +522,28 @@ Emit a representation of the dependency graph of PACKAGE...\n"))
(define (guix-graph . args) (define (guix-graph . args)
(with-error-handling (with-error-handling
(let* ((opts (parse-command-line args %options (define opts
(list %default-options) (parse-command-line args %options
#:build-options? #f)) (list %default-options)
(backend (assoc-ref opts 'backend)) #:build-options? #f))
(type (assoc-ref opts 'node-type)) (define backend
(items (filter-map (match-lambda (assoc-ref opts 'backend))
(('argument . (? store-path? item)) (define type
item) (assoc-ref opts 'node-type))
(('argument . spec)
(specification->package spec)) (with-store store
(('expression . exp) (let* ((transform (options->transformation opts))
(read/eval-package-expression exp)) (items (filter-map (match-lambda
(_ #f)) (('argument . (? store-path? item))
opts))) item)
(with-store store (('argument . spec)
(transform store
(specification->package spec)))
(('expression . exp)
(transform store
(read/eval-package-expression exp)))
(_ #f))
opts)))
;; Ask for absolute file names so that .drv file names passed from the ;; Ask for absolute file names so that .drv file names passed from the
;; user to 'read-derivation' are absolute when it returns. ;; user to 'read-derivation' are absolute when it returns.
(with-fluids ((%file-port-name-canonicalization 'absolute)) (with-fluids ((%file-port-name-canonicalization 'absolute))

View File

@ -1,5 +1,5 @@
# GNU Guix --- Functional package management for GNU # GNU Guix --- Functional package management for GNU
# Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org> # Copyright © 2015, 2016, 2019 Ludovic Courtès <ludo@gnu.org>
# #
# This file is part of GNU Guix. # This file is part of GNU Guix.
# #
@ -53,3 +53,9 @@ cmp "$tmpfile1" "$tmpfile2"
guix graph -t derivation coreutils > "$tmpfile1" guix graph -t derivation coreutils > "$tmpfile1"
guix graph -t derivation `guix build -d coreutils` > "$tmpfile2" guix graph -t derivation `guix build -d coreutils` > "$tmpfile2"
cmp "$tmpfile1" "$tmpfile2" cmp "$tmpfile1" "$tmpfile2"
# Try package transformation options.
guix graph git | grep 'label = "openssl'
guix graph git --with-input=openssl=libressl | grep 'label = "libressl'
if guix graph git --with-input=openssl=libressl | grep 'label = "openssl'
then false; else true; fi