branch: elpa-admin
commit fb294033548dc4898e1e5134c433254bba6ac498
Author: Philip Kaludercic <[email protected]>
Commit: Philip Kaludercic <[email protected]>

    List and link to all dependencies of a package
    
    * elpa-admin.el (elpaa--collect-reqs-1, elpaa--collect-reqs)
    (elpaa--html-insert-reqs): New functions.
    (elpaa--html-make-pkg): Inject dependency list.
---
 elpa-admin.el | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/elpa-admin.el b/elpa-admin.el
index dd36fe947f..f2823adffb 100644
--- a/elpa-admin.el
+++ b/elpa-admin.el
@@ -1957,6 +1957,39 @@ arbitrary code."
          ))
       (insert "</dd>\n"))))
 
+(defun elpaa--collect-reqs-1 (pkg-name seen)
+  "Collect all dependencies of PKG-NAME, without sanitising results.
+The optional argument SEEN is used to avoid unbounded recursion
+in case of cyclic dependencies."
+  (with-demoted-errors "Failed to infer dependencies %S"
+    (when-let*
+        (((not (memq pkg-name seen)))
+         (attr (alist-get pkg-name (elpaa--get-specs)))
+         (spec (cons pkg-name attr))
+         (meta (elpaa--metadata (elpaa--pkg-root spec) spec))
+         (reqs (nth 3 meta)))
+      (append reqs
+              (mapcan (lambda (pkg)
+                        (elpaa--collect-reqs-1
+                         (car pkg)
+                         (cons (car pkg) seen)))
+                      reqs)))))
+
+(defun elpaa--collect-reqs (pkg-name)
+  "Collect all dependencies of PKG-NAME."
+  (let ((reqs (elpaa--collect-reqs-1 pkg-name '())))
+    (delq 'emacs (delete-dups (mapcar #'car reqs)))))
+
+(defun elpaa--html-insert-reqs (pkg-spec)
+  (when-let* ((reqs (elpaa--collect-reqs (car pkg-spec))))
+    (insert "<dt>All Dependencies</dt><dd>"
+            (mapconcat
+             (lambda (pkg-name)
+               (format "<a href=\"%s.html\">%s</a> (<a 
href=\"%s.tar\">.tar</a>)"
+                       pkg-name pkg-name pkg-name))
+             reqs ", ")
+            "</dd>\n")))
+
 (defun elpaa--html-make-pkg (pkg pkg-spec files srcdir plain-readme)
   (let* ((name (symbol-name (car pkg)))
          (latest (package-version-join (aref (cdr pkg) 0)))
@@ -2010,6 +2043,10 @@ arbitrary code."
        pkg-spec
        (or (cdr (assoc :url (aref (cdr pkg) 4)))
            (elpaa--get-prop "URL" name srcdir mainsrcfile)))
+      (let ((default-directory (expand-file-name "..")))
+        ;; FIXME: Avoid having to move up a directory to access
+        ;; elpa-archive and the package metadata.
+        (elpaa--html-insert-reqs pkg-spec))
       (insert (format "<dt>Badge</dt><dd><img src=\"%s.svg\"/></dd>\n" 
(elpaa--html-quote name)))
       (elpaa--html-insert-docs pkg-spec)
       (insert "</dl>")

Reply via email to