From 84b0e85c3ce82e904389a5b77cbfc383215829e9 Mon Sep 17 00:00:00 2001 From: Hugo Buddelmeijer Date: Tue, 18 Aug 2026 21:39:21 +0200 Subject: scripts: lint: Add --manifest option. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * guix/scrips/lint.scm (show-help): Describe option. (%options): Add 'manifest'option. (guix-lint): Run checkers on packages defined in manifest. * doc/guix.texi (Invoking guix lint): Document option. * tests/guix-lint.sh: Test option. Normalize whitespace. * guix/scripts/refresh.scm: Export packages-from-manifest. Signed-off-by: Ludovic Courtès Modified-by: Ludovic Courtès Merges: #10653 --- doc/guix.texi | 10 ++++++++++ guix/scripts/lint.scm | 22 ++++++++++++++++------ guix/scripts/refresh.scm | 3 ++- tests/guix-lint.sh | 12 ++++++++++-- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 73d616aa1b6..8f09adf9506 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -16927,6 +16927,12 @@ guix lint @var{options} @var{package}@dots{} @end example If no package is given on the command line, then all packages are checked. +To check packages in a particular manifest, use: + +@example +guix lint @var{options} --manifest=@var{file} @dots{} +@end example + To check packages in particular source files, the syntax is: @example @@ -16961,6 +16967,10 @@ This is useful to unambiguously designate packages, as in this example: guix lint -c archival -e '(@@ (gnu packages guile) guile-3.0)' @end example +@item --manifest=@var{file} +@itemx -m @var{file} +Run checkers on packages in manifest @var{file} (@pxref{Writing Manifests}). + @item --no-network @itemx -n Only enable the checkers that do not depend on Internet access. diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm index 6a317bf64d5..40df87e5234 100644 --- a/guix/scripts/lint.scm +++ b/guix/scripts/lint.scm @@ -37,6 +37,8 @@ #:use-module (guix store) #:use-module (guix scripts) #:use-module (guix scripts build) + #:autoload (guix scripts refresh) (packages-from-manifest) + #:use-module (guix scripts refresh) #:use-module (gnu packages) #:use-module (ice-9 match) #:use-module (ice-9 format) @@ -136,6 +138,9 @@ run the checkers on all packages.\n")) (display (G_ " -e, --expression=EXPR consider the package EXPR evaluates to")) + (display (G_ " + -m, --manifest=FILE build the packages that the manifest given in FILE + evaluates to")) (display (G_ " -L, --load-path=DIR prepend DIR to the package module search path")) (newline) @@ -198,6 +203,9 @@ run the checkers on all packages.\n")) (option '(#\e "expression") #t #f (lambda (opt name arg result) (alist-cons 'expression arg result))) + (option '(#\m "manifest") #t #f + (lambda (opt name arg result) + (alist-cons 'manifest arg result))) (option '(#\V "version") #f #f (lambda args @@ -219,16 +227,18 @@ run the checkers on all packages.\n")) (let* ((opts (parse-options)) (whole-file? (assoc-ref opts 'whole-file?)) - (args (filter-map (if whole-file? + (args (append-map (if whole-file? (match-lambda - (('argument . file) file) - (_ #f)) + (('argument . file) (list file)) + (_ '())) (match-lambda (('argument . spec) - (specification->package spec)) + (list (specification->package spec))) (('expression . exp) - (read/eval-package-expression exp)) - (_ #f))) + (list (read/eval-package-expression exp))) + (('manifest . man) + (packages-from-manifest man)) + (_ '()))) (reverse opts))) (no-checkers (or (assoc-ref opts 'exclude) '())) (the-checkers (filter (lambda (checker) diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm index 60fba71c3ef..4b0044d0ea2 100644 --- a/guix/scripts/refresh.scm +++ b/guix/scripts/refresh.scm @@ -52,7 +52,8 @@ #:use-module (srfi srfi-26) #:use-module (srfi srfi-37) #:use-module (srfi srfi-71) - #:export (guix-refresh)) + #:export (guix-refresh + packages-from-manifest)) ;;; diff --git a/tests/guix-lint.sh b/tests/guix-lint.sh index 4a77315b3a2..2b36649a8b2 100644 --- a/tests/guix-lint.sh +++ b/tests/guix-lint.sh @@ -52,6 +52,10 @@ cat > "$module_dir/foo.scm"< "${module_dir}/foomanifest.scm"<manifest '("dummy")) +EOF + GUIX_PACKAGE_PATH="$module_dir" export GUIX_PACKAGE_PATH @@ -64,8 +68,8 @@ grep_warning () # Issues with the dummy package: # 1) the synopsis starts with the package name; # 2) the synopsis starts with a lower-case letter; -# 3) the description has a single space following the end-of-sentence period; -# 4) the alphabetically lesser bar package succeeds it. +# 3) the description has a single space following the end-of-sentence period; +# 4) the alphabetically lesser bar package succeeds it. out=`guix lint -c synopsis,description dummy 2>&1` test `grep_warning "$out"` -eq 3 @@ -79,6 +83,10 @@ test `grep_warning "$out"` -eq 1 out=`guix lint -c description,synopsis dummy 2>&1` test `grep_warning "$out"` -eq 3 +# Test specifying a manifest. +out=`guix lint -c synopsis,description -m ${module_dir}/foomanifest.scm 2>&1` +test `grep_warning "$out"` -eq 3 + working_dir="$(pwd)" cd "$module_dir" out=`guix lint -c name -f foo.scm 2>&1` -- cgit v1.2.3