From 4502de61f24a5d50a2eb8fdd073162fb939b1e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= Date: Sun, 9 Apr 2023 12:43:30 +0800 Subject: [PATCH] refresh: Support select packages SUBSET by module name. * guix/scripts/refresh.scm (%options): Support '--select module:NAME'. (show-help): Adjust accordingly. (options->update-specs): Honor the module passed by '--select'. * doc/guix.texi (Invoking guix refresh): Document it. --- doc/guix.texi | 9 +++++++-- guix/scripts/refresh.scm | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 9997aeb86e..1a16d6bb8d 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -14227,8 +14227,8 @@ $ ./pre-inst-env guix refresh -s non-core -u @item --select=[@var{subset}] @itemx -s @var{subset} -Select all the packages in @var{subset}, one of @code{core} or -@code{non-core}. +Select all the packages in @var{subset}, one of @code{core}, @code{non-core} +or @code{module:@var{name}}. The @code{core} subset refers to all the packages at the core of the distribution---i.e., packages that are used to build ``everything @@ -14241,6 +14241,11 @@ The @code{non-core} subset refers to the remaining packages. It is typically useful in cases where an update of the core packages would be inconvenient. +The @code{module:@var{name}} subset refers to all the packages in a +specified guile module. The module can be specified as +@code{module:guile} or @code{module:(gnu packages guile)}, the former is +a shorthand for the later. + @item --manifest=@var{file} @itemx -m @var{file} Select all the packages from the manifest in @var{file}. This is useful to diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm index bc6c24967a..47c4d55ec4 100644 --- a/guix/scripts/refresh.scm +++ b/guix/scripts/refresh.scm @@ -32,6 +32,7 @@ #:use-module ((guix scripts build) #:select (%standard-build-options)) #:use-module (guix store) #:use-module (guix utils) + #:use-module (guix discovery) #:use-module (guix packages) #:use-module (guix profiles) #:use-module (guix upstream) @@ -44,6 +45,7 @@ #:use-module ((gnu packages commencement) #:select (%final-inputs)) #:use-module (ice-9 match) #:use-module (ice-9 format) + #:use-module (ice-9 regex) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) @@ -71,8 +73,23 @@ ((or "core" "non-core") (alist-cons 'select (string->symbol arg) result)) + ((? (cut string-prefix? "module:" <>)) + (let ((mod (cond + ;; Shorthand name: "module:guile". + ((string-match "module:([^\( ]+)$" arg) => + (lambda (m) + `(gnu packages ,(string->symbol + (match:substring m 1))))) + ;; Full name : "module:(gnu packages guile)". + ((string-match "module:\\(([^)]+)\\)$" arg) => + (lambda (m) + (map string->symbol + (string-split + (match:substring m 1) #\space)))) + (else (leave (G_ "invalid module: ~a~%") arg))))) + (alist-cons 'select (cons 'module mod) result))) (x - (leave (G_ "~a: invalid selection; expected `core' or `non-core'~%") + (leave (G_ "~a: invalid selection; expected `core', `non-core' or `module:NAME'~%") arg))))) (option '(#\t "type") #t #f (lambda (opt name arg result) @@ -141,8 +158,10 @@ specified with `--select'.\n")) (display (G_ " -u, --update update source files in place")) (display (G_ " - -s, --select=SUBSET select all the packages in SUBSET, one of - `core' or `non-core'")) + -s, --select=SUBSET select all the packages in SUBSET, one of `core`, + `non-core' or `module:NAME' (eg: module:guile) + the module can also be fully specified as + 'module:(gnu packages guile)'")) (display (G_ " -m, --manifest=FILE select all the packages from the manifest in FILE")) (display (G_ " @@ -257,13 +276,20 @@ update would trigger a complete rebuild." (let ((select? (match (assoc-ref opts 'select) ('core core-package?) ('non-core (negate core-package?)) - (_ (const #t))))) + (_ (const #t)))) + (modules (match (assoc-ref opts 'select) + (('module . mod) + (list (resolve-interface mod))) + (_ (all-modules (%package-module-path) + #:warn + warn-about-load-error))))) (map update-spec (fold-packages (lambda (package result) (if (select? package) (keep-newest package result) result)) - '())))) + '() + modules)))) (some ;user-specified packages some)))