summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rwxr-xr-xbuild-aux/list-packages.scm161
2 files changed, 162 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index 189b637be3..4236de4fce 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -130,6 +130,7 @@ EXTRA_DIST =					\
   .dir-locals.el				\
   build-aux/hydra/gnu-system.scm		\
   build-aux/download.scm			\
+  build-aux/list-packages.scm			\
   build-aux/sync-synopses.scm			\
   srfi/srfi-64.scm				\
   srfi/srfi-64.upstream.scm			\
diff --git a/build-aux/list-packages.scm b/build-aux/list-packages.scm
new file mode 100755
index 0000000000..cdefa1ba97
--- /dev/null
+++ b/build-aux/list-packages.scm
@@ -0,0 +1,161 @@
+#!/bin/sh
+exec guile -l "$0"                              \
+  -c '(apply (@ (list-packages) list-packages)
+             (cdr (command-line)))'
+!#
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (list-packages)
+  #:use-module (guix utils)
+  #:use-module (guix packages)
+  #:use-module (guix licenses)
+  #:use-module (guix gnu-maintenance)
+  #:use-module (gnu packages)
+  #:use-module (sxml simple)
+  #:use-module (web uri)
+  #:use-module (ice-9 match)
+  #:export (list-packages))
+
+;;; Commentary:
+;;;
+;;; Emit an HTML representation of the packages available in GNU Guix.
+;;;
+;;; Code:
+
+(define (package->sxml package)
+  "Return HTML-as-SXML representing PACKAGE."
+  (define (source-url package)
+    (let ((loc (package-location package)))
+      (and loc
+           (string-append "http://git.savannah.gnu.org/cgit/guix.git/tree/"
+                          (location-file loc) "#n"
+                          (number->string (location-line loc))))))
+
+  (define (license package)
+    (define ->sxml
+      (match-lambda
+       ((lst ...)
+        `(div ,(map ->sxml lst)))
+       ((? license? license)
+        (let ((uri (license-uri license)))
+          (case (and=> (and uri (string->uri uri)) uri-scheme)
+            ((http https)
+             `(div (a (@ (href ,uri))
+                      ,(license-name license))))
+            (else
+             `(div ,(license-name license) " ("
+                   ,(license-comment license) ")")))))
+       (#f "")))
+
+    (->sxml (package-license package)))
+
+  (let ((description-id (symbol->string
+                         (gensym (package-name package)))))
+   `(tr (td ,(if (gnu-package? package)
+                 `(img (@ (src "/graphics/gnu-head-mini.png")))
+                 ""))
+        (td (a (@ (href ,(source-url package)))
+               ,(package-name package) " "
+               ,(package-version package)))
+        (td (@ (colspan "2") (height "0"))
+            (a (@ (href "javascript:void(0)")
+                  (title "show/hide package description")
+                  (onClick ,(format #f "javascript:show_hide('~a')"
+                                    description-id)))
+               ,(package-synopsis package))
+            (div (@ (id ,description-id)
+                    (style "position: relative; display: none;"))
+                 (p ,(package-description package))
+                 ,(license package)
+                 (a (@ (href ,(package-home-page package)))
+                    ,(package-home-page package)))))))
+
+(define (packages->sxml packages)
+  "Return an HTML page as SXML describing PACKAGES."
+  `(div
+    (h2 "GNU Guix Package List")
+    (div (@ (style "margin-bottom: 5em;"))
+         (div
+          (img (@ (src "graphics/guix-logo.small.png")
+                  (alt "GNU Guix and the GNU System")
+                  (height "83em"))))
+         "This web page lists the packages currently provided by the "
+         (a (@ (href "manual/guix.html#GNU-Distribution"))
+            "GNU system distribution")
+         " of "
+         (a (@ (href "/software/guix/guix.html")) "GNU Guix") ".")
+    (table (@ (style "border: none;"))
+           ,@(map package->sxml packages))))
+
+
+(define (list-packages . args)
+  "Return an HTML page listing all the packages found in the GNU distribution,
+with gnu.org server-side include and all that."
+  (let ((packages (sort (fold-packages cons '())
+                        (lambda (p1 p2)
+                          (string<? (package-name p1) (package-name p2))))))
+   (format #t "<!--#include virtual=\"/server/html5-header.html\" -->
+<!-- Parent-Version: 1.70 $ -->
+
+<title>GNU Guix - GNU Distribution - GNU Project</title>
+<!--#include virtual=\"/server/banner.html\" -->
+
+<script language=\"javascript\" type=\"text/javascript\">
+// license: CC0
+function show_hide(idThing)
+{
+  var thing = document.getElementById(idThing);
+  if (thing) {
+    if (thing.style.display == \"none\") {
+      thing.style.display = \"\";
+    } else {
+      thing.style.display = \"none\";
+    }
+  }
+}
+</script>")
+   (display (sxml->xml (packages->sxml packages)))
+   (format #t "<!--#include virtual=\"/server/footer.html\" -->
+<div id=\"footer\">
+
+<p>Please send general FSF &amp; GNU inquiries to
+<a href=\"mailto:gnu@gnu.org\">&lt;gnu@gnu.org&gt;</a>.
+There are also <a href=\"/contact/\">other ways to contact</a>
+the FSF.  Broken links and other corrections or suggestions can be sent
+to <a href=\"mailto:bug-guix@gnu.org\">&lt;bug-guix@gnu.org&gt;</a>.</p>
+
+<p>Copyright &copy; 2013 Free Software Foundation, Inc.</p>
+
+<p>This page is licensed under a <a rel=\"license\"
+href=\"http://creativecommons.org/licenses/by-nd/3.0/us/\">Creative
+Commons Attribution-NoDerivs 3.0 United States License</a>.</p>
+
+<p>Updated:
+<!-- timestamp start -->
+$Date$
+<!-- timestamp end -->
+</p>
+</div>
+</div>
+</body>
+</html>
+"))
+  )
+
+;;; list-packages.scm ends here