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,7 +450,7 @@ 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)))
@ -475,7 +479,9 @@ package modules, while attempting to retain user package modules."
(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
(parse-command-line args %options
(list %default-options) (list %default-options)
#:build-options? #f)) #:build-options? #f))
(backend (assoc-ref opts 'backend)) (define backend
(type (assoc-ref opts 'node-type)) (assoc-ref opts 'backend))
(define type
(assoc-ref opts 'node-type))
(with-store store
(let* ((transform (options->transformation opts))
(items (filter-map (match-lambda (items (filter-map (match-lambda
(('argument . (? store-path? item)) (('argument . (? store-path? item))
item) item)
(('argument . spec) (('argument . spec)
(specification->package spec)) (transform store
(specification->package spec)))
(('expression . exp) (('expression . exp)
(read/eval-package-expression exp)) (transform store
(read/eval-package-expression exp)))
(_ #f)) (_ #f))
opts))) opts)))
(with-store store
;; 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