lint: 'patch-file-names' checks for file name length.

Reported at <https://bugs.gnu.org/27943>
by Danny Milosavljevic <dannym@scratchpost.org>.

* guix/scripts/lint.scm (%distro-directory): New variable.
(check-patch-file-names): Add check for the file name length.
* tests/lint.scm ("patches: file name too long"): New test.
This commit is contained in:
Ludovic Courtès 2017-11-28 15:05:55 +01:00
parent 1da3d2a3a1
commit eef01cfe8e
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 39 additions and 4 deletions

View File

@ -587,24 +587,46 @@ from ~a")
(package-home-page package)) (package-home-page package))
'home-page))))) 'home-page)))))
(define %distro-directory
(dirname (search-path %load-path "gnu.scm")))
(define (check-patch-file-names package) (define (check-patch-file-names package)
"Emit a warning if the patches requires by PACKAGE are badly named or if the "Emit a warning if the patches requires by PACKAGE are badly named or if the
patch could not be found." patch could not be found."
(guard (c ((message-condition? c) ;raised by 'search-patch' (guard (c ((message-condition? c) ;raised by 'search-patch'
(emit-warning package (condition-message c) (emit-warning package (condition-message c)
'patch-file-names))) 'patch-file-names)))
(define patches
(or (and=> (package-source package) origin-patches)
'()))
(unless (every (match-lambda ;patch starts with package name? (unless (every (match-lambda ;patch starts with package name?
((? string? patch) ((? string? patch)
(and=> (string-contains (basename patch) (and=> (string-contains (basename patch)
(package-name package)) (package-name package))
zero?)) zero?))
(_ #f)) ;must be an <origin> or something like that. (_ #f)) ;must be an <origin> or something like that.
(or (and=> (package-source package) origin-patches) patches)
'()))
(emit-warning (emit-warning
package package
(G_ "file names of patches should start with the package name") (G_ "file names of patches should start with the package name")
'patch-file-names)))) 'patch-file-names))
;; Check whether we're reaching tar's maximum file name length.
(let ((prefix (string-length %distro-directory))
(margin (string-length "guix-0.13.0-10-123456789/"))
(max 99))
(for-each (match-lambda
((? string? patch)
(when (> (+ margin (- (string-length patch) prefix))
max)
(emit-warning
package
(format #f (G_ "~a: file name is too long")
(basename patch))
'patch-file-names)))
(_ #f))
patches))))
(define (escape-quotes str) (define (escape-quotes str)
"Replace any quote character in STR by an escaped quote character." "Replace any quote character in STR by an escaped quote character."

View File

@ -1,7 +1,7 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Cyril Roelandt <tipecaml@gmail.com> ;;; Copyright © 2012, 2013 Cyril Roelandt <tipecaml@gmail.com>
;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org>
;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org> ;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com> ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
;;; Copyright © 2017 Alex Kost <alezost@gmail.com> ;;; Copyright © 2017 Alex Kost <alezost@gmail.com>
@ -331,6 +331,19 @@
(check-patch-file-names pkg))) (check-patch-file-names pkg)))
"file names of patches should start with the package name"))) "file names of patches should start with the package name")))
(test-assert "patches: file name too long"
(->bool
(string-contains
(with-warnings
(let ((pkg (dummy-package "x"
(source
(dummy-origin
(patches (list (string-append "x-"
(make-string 100 #\a)
".patch"))))))))
(check-patch-file-names pkg)))
"file name is too long")))
(test-assert "patches: not found" (test-assert "patches: not found"
(->bool (->bool
(string-contains (string-contains