~ruther/guix-local

b7f1b4c1d072c6da92e20ddadb24e54da0ddd142 — Ludovic Courtès 5 years ago 8524349
lint: Add 'input-labels' checker.

* guix/lint.scm (check-input-labels): New procedure.
(%local-checkers): Add 'input-labels' checker.
* tests/lint.scm ("input labels: no warnings")
("input labels: one warning"): New tests.
* doc/guix.texi (Invoking guix lint): Mention it.
3 files changed, 56 insertions(+), 0 deletions(-)

M doc/guix.texi
M guix/lint.scm
M tests/lint.scm
M doc/guix.texi => doc/guix.texi +6 -0
@@ 12158,6 12158,12 @@ declare them as in this example:
@item formatting
Warn about obvious source code formatting issues: trailing white space,
use of tabulations, etc.

@item input-labels
Report old-style input labels that do not match the name of the
corresponding package.  This aims to help migrate from the ``old input
style''.  @xref{package Reference}, for more information on package
inputs and input styles.
@end table

The general syntax is:

M guix/lint.scm => guix/lint.scm +36 -0
@@ 79,6 79,7 @@
  #:export (check-description-style
            check-inputs-should-be-native
            check-inputs-should-not-be-an-input-at-all
            check-input-labels
            check-patch-file-names
            check-patch-headers
            check-synopsis-style


@@ 416,6 417,37 @@ of a package, and INPUT-NAMES, a list of package specifications such as
         (package-input-intersection (package-direct-inputs package)
                                     input-names))))

(define (check-input-labels package)
  "Emit a warning for labels that differ from the corresponding package name."
  (define (check input-kind package-inputs)
    (define (warning label name)
      (make-warning package
                    (G_ "label '~a' does not match package name '~a'")
                    (list label name)
                    #:field input-kind))

    (append-map (match-lambda
                  (((? string? label) (? package? dependency))
                   (if (string=? label (package-name dependency))
                       '()
                       (list (warning label (package-name dependency)))))
                  (((? string? label) (? package? dependency) output)
                   (let ((expected (string-append (package-name dependency)
                                                  ":" output)))
                     (if (string=? label expected)
                         '()
                         (list (warning label expected)))))
                  (_
                   '()))
                (package-inputs package)))

  (append-map (match-lambda
                ((kind proc)
                 (check kind proc)))
              `((native-inputs ,package-native-inputs)
                (inputs ,package-inputs)
                (propagated-inputs ,package-propagated-inputs))))

(define (package-name-regexp package)
  "Return a regexp that matches PACKAGE's name as a word at the beginning of a
line."


@@ 1584,6 1616,10 @@ them for PACKAGE."
     (description "Identify inputs that shouldn't be inputs at all")
     (check       check-inputs-should-not-be-an-input-at-all))
   (lint-checker
     (name        'input-labels)
     (description "Identify input labels that do not match package names")
     (check       check-input-labels))
   (lint-checker
     (name        'license)
     ;; TRANSLATORS: <license> is the name of a data type and must not be
     ;; translated.

M tests/lint.scm => tests/lint.scm +14 -0
@@ 356,6 356,20 @@
                              `(("python-setuptools" ,python-setuptools))))))
     (check-inputs-should-not-be-an-input-at-all pkg))))

(test-assert "input labels: no warnings"
  (let ((pkg (dummy-package "x"
               (inputs `(("glib" ,glib)
                         ("pkg-config" ,pkg-config))))))
    (null? (check-input-labels pkg))))

(test-equal "input labels: one warning"
  "label 'pkgkonfig' does not match package name 'pkg-config'"
  (single-lint-warning-message
   (let ((pkg (dummy-package "x"
                (inputs `(("glib" ,glib)
                          ("pkgkonfig" ,pkg-config))))))
     (check-input-labels pkg))))

(test-equal "file patches: different file name -> warning"
  "file names of patches should start with the package name"
  (single-lint-warning-message