summaryrefslogtreecommitdiff
path: root/guix/lint.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2020-06-14 15:06:53 +0200
committerLudovic Courtès <ludo@gnu.org>2020-06-14 15:34:42 +0200
commit993023a28e52c87647fb78a5aa94a524f42ceb71 (patch)
tree96ac647a62225501c09c46f53841aabe9789e8d5 /guix/lint.scm
parent9acac9f9c6452cd76a21e52c7e5a33e8384b82b4 (diff)
downloadguix-993023a28e52c87647fb78a5aa94a524f42ceb71.tar.gz
guix-993023a28e52c87647fb78a5aa94a524f42ceb71.tar.xz
lint: Add 'check-for-collisions' checker.
Suggested by Edouard Klein <edk@beaver-labs.com>. * guix/profiles.scm (check-for-collisions): Export. * guix/lint.scm (check-profile-collisions): New procedure. (%local-checkers): Add 'profile-collisions' checker. * tests/lint.scm ("profile-collisions: no warnings") ("profile-collisions: propagated inputs collide") ("profile-collisions: propagated inputs collide, store items"): New tests. * doc/guix.texi (Invoking guix lint): Document it.
Diffstat (limited to 'guix/lint.scm')
-rw-r--r--guix/lint.scm40
1 files changed, 40 insertions, 0 deletions
diff --git a/guix/lint.scm b/guix/lint.scm
index 82861b8a27..fa507546f5 100644
--- a/guix/lint.scm
+++ b/guix/lint.scm
@@ -41,6 +41,8 @@
#:use-module (guix upstream)
#:use-module (guix utils)
#:use-module (guix memoization)
+ #:use-module (guix profiles)
+ #:use-module (guix monads)
#:use-module (guix scripts)
#:use-module ((guix ui) #:select (texi->plain-text fill-paragraph))
#:use-module (guix gnu-maintenance)
@@ -84,6 +86,7 @@
check-for-updates
check-formatting
check-archival
+ check-profile-collisions
lint-warning
lint-warning?
@@ -970,6 +973,38 @@ descriptions maintained upstream."
(with-store store
(check-with-store store))))
+(define* (check-profile-collisions package #:key store)
+ "Check for collisions that would occur when installing PACKAGE as a result
+of the propagated inputs it pulls in."
+ (define (do-check store)
+ (guard (c ((profile-collision-error? c)
+ (let ((first (profile-collision-error-entry c))
+ (second (profile-collision-error-conflict c)))
+ (define format
+ (if (string=? (manifest-entry-version first)
+ (manifest-entry-version second))
+ manifest-entry-item
+ (lambda (entry)
+ (string-append (manifest-entry-name entry) "@"
+ (manifest-entry-version entry)))))
+
+ (list (make-warning package
+ (G_ "propagated inputs ~a and ~a collide")
+ (list (format first)
+ (format second)))))))
+ ;; Disable grafts to avoid building PACKAGE and its dependencies.
+ (parameterize ((%graft? #f))
+ (run-with-store store
+ (mbegin %store-monad
+ (check-for-collisions (packages->manifest (list package))
+ (%current-system))
+ (return '()))))))
+
+ (if store
+ (do-check store)
+ (with-store store
+ (do-check store))))
+
(define (check-license package)
"Warn about type errors of the 'license' field of PACKAGE."
(match (package-license package)
@@ -1350,6 +1385,11 @@ or a list thereof")
(check check-derivation)
(requires-store? #t))
(lint-checker
+ (name 'profile-collisions)
+ (description "Report collisions that would occur due to propagated inputs")
+ (check check-profile-collisions)
+ (requires-store? #t))
+ (lint-checker
(name 'patch-file-names)
(description "Validate file names and availability of patches")
(check check-patch-file-names))