system: Do not delete all nss-certs packages when they are the same object.

Calling 'delete' on the list of packages would delete *all* occurrences of a
given object, not just the first one.  This meant that if the user had
something like:

  (packages (cons nss-certs %base-packages))

In their operating system declaration, no nss-certs would end up in the final
list.  To guard against this, guard against this by checking that more than
one nss-certs package exist even after deduplication.

* gnu/system.scm (operating-system-packages): Guard against deleting all
nss-certs when a single nss-certs package object is listed multiple times.

Fixes: https://issues.guix.gnu.org/70850
Change-Id: Id93be9242e026fd2e96a442941df80b94664ef9a
This commit is contained in:
Maxim Cournoyer 2024-05-15 22:47:59 -04:00
parent e66b8d0534
commit 35ae95061e
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -339,7 +339,13 @@ (define (operating-system-packages os)
(G_ "multiple 'nss-certs' packages found; 'nss-certs' \ (G_ "multiple 'nss-certs' packages found; 'nss-certs' \
is now included by default in '%base-packages'; ensure it is not explicitly \ is now included by default in '%base-packages'; ensure it is not explicitly \
listed in the operating system 'packages' field~%")) listed in the operating system 'packages' field~%"))
(fold delete packages (drop nss-certs-packages 1))) (let ((nss-certs-packages (delete-duplicates nss-certs-packages eq?)))
(if (> (length nss-certs-packages) 1)
;; Only mismatched nss-certs packages need to be handled to
;; avoid profile collisions; same objects are later
;; deduplicated in `packages->profile-entry'.
(fold delete packages (drop nss-certs-packages 1))
packages))) ;no-op
packages))) packages)))
(define* (operating-system-kernel-arguments (define* (operating-system-kernel-arguments