summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHilton Chain <hako@ultrarare.space>2025-05-11 01:08:40 +0800
committerHilton Chain <hako@ultrarare.space>2025-05-15 21:22:42 +0800
commit38d420fa5ae4b69e8ef118ffffba50a68d3d9893 (patch)
treeb28cbaaf62bc5c94add1ad47f5a8ed1fcbeb077e
parent457b17de16d599f27c279a322ac820eaf15704e9 (diff)
nongnu: Add all-nongnu-packages.
* nongnu/packages.scm (%nongnu-package-module-path): New variable. (all-nongnu-packages): New procedure.
-rw-r--r--nongnu/packages.scm37
1 files changed, 36 insertions, 1 deletions
diff --git a/nongnu/packages.scm b/nongnu/packages.scm
index 756f6cfd..f2a2b71d 100644
--- a/nongnu/packages.scm
+++ b/nongnu/packages.scm
@@ -5,12 +5,18 @@
(define-module (nongnu packages)
#:use-module (gnu packages)
#:use-module (guix diagnostics)
+ #:use-module (guix discovery)
#:use-module (guix i18n)
+ #:use-module (guix memoization)
+ #:use-module (guix packages)
+ #:use-module (guix ui)
#:use-module (ice-9 match)
#:use-module (srfi srfi-34)
#:replace (%patch-path
search-patch)
- #:export (nongnu-patches))
+ #:export (nongnu-patches
+ %nongnu-package-module-path
+ all-nongnu-packages))
;;; Commentary:
;;;
@@ -40,6 +46,9 @@
(try ("nongnu/packages/firmware.scm" nongnu/ packages/)
("nongnu/ci.scm" nongnu/))))
+(define %nongnu-package-module-path
+ `((,%nongnu-root-directory . "nongnu/packages")))
+
(define %patch-path
;; Define it after '%package-module-path' so that '%load-path' contains user
;; directories, allowing patches in $GUIX_PACKAGE_PATH to be found.
@@ -64,3 +73,29 @@
"Return the list of absolute file names corresponding to each
FILE-NAME found in %PATCH-PATH."
(list (search-patch file-name) ...))
+
+;; Adapted from (@ (gnu packages) all-packages).
+(define all-nongnu-packages
+ (mlambda ()
+ "Return the list of all public packages, including replacements and hidden
+packages, excluding superseded packages."
+ ;; Note: 'fold-packages' never traverses the same package twice but
+ ;; replacements break that (they may or may not be visible to
+ ;; 'fold-packages'), hence this hash table to track visited packages.
+ (define visited (make-hash-table))
+
+ (fold-packages (lambda (package result)
+ (if (hashq-ref visited package)
+ result
+ (begin
+ (hashq-set! visited package #t)
+ (match (package-replacement package)
+ ((? package? replacement)
+ (hashq-set! visited replacement #t)
+ (cons* replacement package result))
+ (#f
+ (cons package result))))))
+ '()
+ (all-modules %nongnu-package-module-path #:warn warn-about-load-error)
+ ;; Dismiss deprecated packages but keep hidden packages.
+ #:select? (negate package-superseded))))