Skip to content
Snippets Groups Projects
Commit 17a7b75c authored by Cyril Roelandt's avatar Cyril Roelandt
Browse files

lint: add 'source' checker.

* guix/scripts/lint.scm (validate-uri?): New procedure.
  (%checkers): Add 'source' checker
parent 03c27765
No related branches found
No related tags found
No related merge requests found
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
(define-module (guix scripts lint) (define-module (guix scripts lint)
#:use-module (guix base32) #:use-module (guix base32)
#:use-module (guix download)
#:use-module (guix packages) #:use-module (guix packages)
#:use-module (guix records) #:use-module (guix records)
#:use-module (guix ui) #:use-module (guix ui)
...@@ -31,12 +32,14 @@ (define-module (guix scripts lint) ...@@ -31,12 +32,14 @@ (define-module (guix scripts lint)
#:use-module (ice-9 format) #:use-module (ice-9 format)
#:use-module (web uri) #:use-module (web uri)
#:use-module ((guix build download) #:use-module ((guix build download)
#:select (open-connection-for-uri)) #:select (maybe-expand-mirrors
open-connection-for-uri))
#:use-module (web request) #:use-module (web request)
#:use-module (web response) #:use-module (web response)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
#:use-module (srfi srfi-11) #:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-37) #:use-module (srfi srfi-37)
#:export (guix-lint #:export (guix-lint
check-description-style check-description-style
...@@ -254,45 +257,53 @@ (define response ...@@ -254,45 +257,53 @@ (define response
(_ (_
(values 'not-http #f))))) (values 'not-http #f)))))
(define (validate-uri uri package field)
"Return #t if the given URI can be reached, otherwise emit a
warning for PACKAGE mentionning the FIELD."
(let-values (((status argument)
(probe-uri uri)))
(case status
((http-response)
(unless (= 200 (response-code argument))
(emit-warning package
(format #f
(_ "URI ~a not reachable: ~a (~s)")
(uri->string uri)
(response-code argument)
(response-reason-phrase argument))
field)))
((getaddrinfo-error)
(emit-warning package
(format #f
(_ "URI ~a domain not found: ~a")
(uri->string uri)
(gai-strerror (car argument)))
field))
((system-error)
(emit-warning package
(format #f
(_ "URI ~a unreachable: ~a")
(uri->string uri)
(strerror
(system-error-errno
(cons status argument))))
field))
((invalid-http-response gnutls-error)
;; Probably a misbehaving server; ignore.
#f)
((not-http) ;nothing we can do
#f)
(else
(error "internal linter error" status)))
#t))
(define (check-home-page package) (define (check-home-page package)
"Emit a warning if PACKAGE has an invalid 'home-page' field, or if that "Emit a warning if PACKAGE has an invalid 'home-page' field, or if that
'home-page' is not reachable." 'home-page' is not reachable."
(let ((uri (and=> (package-home-page package) string->uri))) (let ((uri (and=> (package-home-page package) string->uri)))
(cond (cond
((uri? uri) ((uri? uri)
(let-values (((status argument) (validate-uri uri package 'home-page))
(probe-uri uri)))
(case status
((http-response)
(unless (= 200 (response-code argument))
(emit-warning package
(format #f
(_ "home page ~a not reachable: ~a (~s)")
(uri->string uri)
(response-code argument)
(response-reason-phrase argument))
'home-page)))
((getaddrinfo-error)
(emit-warning package
(format #f
(_ "home page domain not found: ~a")
(gai-strerror (car argument)))
'package))
((system-error)
(emit-warning package
(format #f
(_ "home page unreachable: ~a")
(strerror
(system-error-errno
(cons status argument))))
'home-page))
((invalid-http-response gnutls-error)
;; Probably a misbehaving server; ignore.
#f)
((not-http) ;nothing we can do
#f)
(else
(error "internal home-page linter error" status)))))
((not (package-home-page package)) ((not (package-home-page package))
(unless (or (string-contains (package-name package) "bootstrap") (unless (or (string-contains (package-name package) "bootstrap")
(string=? (package-name package) "ld-wrapper")) (string=? (package-name package) "ld-wrapper"))
...@@ -375,6 +386,21 @@ (define (check-gnu-synopsis+description package) ...@@ -375,6 +386,21 @@ (define (check-gnu-synopsis+description package)
(location->string loc) (package-full-name package) (location->string loc) (package-full-name package)
(fill-paragraph (escape-quotes upstream) 77 7))))))) (fill-paragraph (escape-quotes upstream) 77 7)))))))
(define (check-source package)
"Emit a warning if PACKAGE has an invalid 'source' field, or if that
'source' is not reachable."
(let ((origin (package-source package)))
(when (and origin
(eqv? (origin-method origin) url-fetch))
(let* ((strings (origin-uri origin))
(uris (if (list? strings)
(map string->uri strings)
(list (string->uri strings)))))
(for-each
(cut validate-uri <> package 'source)
(append-map (cut maybe-expand-mirrors <> %mirrors) uris))))))
;;; ;;;
;;; List of checkers. ;;; List of checkers.
...@@ -402,6 +428,10 @@ (define %checkers ...@@ -402,6 +428,10 @@ (define %checkers
(name 'home-page) (name 'home-page)
(description "Validate home-page URLs") (description "Validate home-page URLs")
(check check-home-page)) (check check-home-page))
(lint-checker
(name 'source)
(description "Validate source URLs")
(check check-source))
(lint-checker (lint-checker
(name 'synopsis) (name 'synopsis)
(description "Validate package synopses") (description "Validate package synopses")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment