emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] scratch/elpa-admin eb6ab35c5d 3/3: Merge make-atom-feed, add batc


From: Stefan Monnier
Subject: [elpa] scratch/elpa-admin eb6ab35c5d 3/3: Merge make-atom-feed, add batch-make-atom-feed
Date: Wed, 8 May 2024 14:24:11 -0400 (EDT)

branch: scratch/elpa-admin
commit eb6ab35c5d3a9c2c2c388c28879c97dca36e3b8e
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    Merge make-atom-feed, add batch-make-atom-feed
---
 elpa-admin.el | 108 +++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 62 insertions(+), 46 deletions(-)

diff --git a/elpa-admin.el b/elpa-admin.el
index 1fb325a5c0..5867b3bd7b 100644
--- a/elpa-admin.el
+++ b/elpa-admin.el
@@ -1877,34 +1877,6 @@ arbitrary code."
          ))
       (insert "</dd>\n"))))
 
-(defun elpaa--make-atom-feed (pkg pkg-spec srcdir files)
-  (let* ((name (symbol-name (car pkg)))
-         (metadata (elpaa--metadata srcdir pkg-spec))
-         (filename (concat name ".xml"))
-         (desc (nth 2 metadata)))
-    (with-temp-buffer
-      (elpaa--render-atom
-       (format "Update feed for %s" name)
-       filename
-       (mapcan
-        (lambda (file)
-          (let ((version (car file)))
-            `(( :title ,(format "%s ELPA: Release of \"%s\", Version %s"
-                                elpaa--name name version)
-                :time ,(file-attribute-modification-time
-                        (file-attributes (cdr file)))
-                :path ,(format "%s.xml#v%s" name version)
-                :content
-                ((p nil
-                    ,(concat "Version " version " of package ")
-                    (a ((href . ,(elpaa--default-url name))) ,name)
-                    ,(concat " has just been released in " elpaa--name " 
ELPA."))
-                 (p nil "You can now find it in " (kbd nil "M-x list-packages 
RET") ".")
-                 (p nil ,(concat name " describes itself as:"))
-                 (blockquote nil ,desc))))))
-        files))
-      (write-region (point-min) (point-max) filename))))
-
 (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)))
@@ -3201,18 +3173,24 @@ relative to elpa root."
     (concat "tag:" domain "," (format-time-string "%F" time)
             ":" specific)))
 
-(defun elpaa--render-atom (title filename articles)
-  "Insert an Atom feed at point.
-TITLE sets the title of the feed, FILENAME is where the Atom feed will be
-stored.  ARTICLES is a list of plists, consisting of the keys
-`:title' for an article title, `:time' a timestamp in in
-`current-time'-format, `:path' is a relative HTTP path to
-the article."
-  (cl-flet ((newer-p (a1 a2)
-              (time-less-p (plist-get a1 :time) (plist-get a2 :time))))
-    ;; FIXME: Why do we need to split elpaa--url into a domain and a path?
-    (let* ((articles (sort articles #'newer-p))
-           (self (concat elpaa--url filename)))
+(defun elpaa--make-atom-feed (pkg pkg-spec srcdir files)
+  (let* ((name (symbol-name (car pkg)))
+         (metadata (elpaa--metadata srcdir pkg-spec))
+         (filename (concat name ".xml"))
+         (desc (nth 2 metadata))
+         ;; RFC4287 says "This specification assigns no significance
+         ;; to the order of atom:entry elements within the feed", but we
+         ;; sort them from oldest to newest.
+         (sorted (sort (mapcar
+                        (lambda (file)
+                          (cons (file-attribute-modification-time
+                                 (file-attributes (cdr file)))
+                                file))
+                        files)
+                       (lambda (a1 a2) (time-less-p (car a1) (car a2)))))
+         (title (format "Update feed for %s" name))
+         (self (concat elpaa--url filename)))
+    (with-temp-buffer
       (insert "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
       (xml-print
        ;; See https://validator.w3.org/feed/docs/rfc4287.html
@@ -3223,12 +3201,24 @@ the article."
           (id nil ,self)
           (updated nil ,(elpaa--rfc3339 (current-time)))
           ,@(mapcar
-             (pcase-lambda ((map (:title title) (:time time)
-                                 (:path path) (:content content)))
-               (let ((self (concat elpaa--url path)))
+             (pcase-lambda (`(,time ,version . ,_file))
+               (let ((self (concat elpaa--url
+                                   (format "%s.xml#v%s" name version)))
+                     (content
+                      `((p nil
+                           ,(concat "Version " version " of package ")
+                           (a ((href . ,(elpaa--default-url name))) ,name)
+                           ,(concat " has just been released in " elpaa--name
+                                    " ELPA."))
+                        (p nil "You can now find it in "
+                           (kbd nil "M-x list-packages RET") ".")
+                        (p nil ,(concat name " describes itself as:"))
+                        (blockquote nil ,desc))))
                  `(entry
                    nil
-                   (title nil ,title)
+                   (title nil
+                          ,(format "%s ELPA: Release of \"%s\", Version %s"
+                                   elpaa--name name version))
                    (updated nil ,(elpaa--rfc3339 time))
                    (author
                     nil
@@ -3237,12 +3227,38 @@ the article."
                    (id nil ,(elpaa--rfc4151 self time))
                    (link ((href . ,self) (rel . "self")))
                    (content
-                    ((type . "html"))
+                    ((type . "html") (base . ,elpaa--url))
                     ,(with-temp-buffer
                        (xml-print content)
                        (buffer-string))))))
-             articles)))))))
+             sorted))))
+      (write-region (point-min) (point-max) filename))))
 
+(defun elpaa--package-oldfiles (pkgname dir)
+  ;; FIXME: Use it in `elpaa--make-one-tarball-1'.
+  (let ((re (concat "\\`" (regexp-quote pkgname)
+                      "-\\([0-9].*\\)\\.\\(tar\\|el\\)\\(\\.[a-z]*z\\)?\\'")))
+    (mapcar
+     (lambda (file)
+       (string-match re file)
+       (cons (match-string 1 file) file))
+     (directory-files dir nil re))))
+
+(defun elpaa--batch-make-atom-feed ()
+  (let* ((filename (pop command-line-args-left))
+         (devel (string-match "devel" (file-name-directory filename)))
+         (elpaa--url (if devel elpaa--devel-url elpaa--url))
+         (pkgname (file-name-sans-extension
+                       (file-name-nondirectory filename)))
+         (pkg (intern pkgname))
+         (pkg-spec (assoc-string pkg (elpaa--get-specs) t))
+         (srcdir (format "packages/%s" pkg))
+         (files 
+          (elpaa--package-oldfiles
+           pkgname
+           (file-name-directory (expand-file-name filename)))))
+    (elpaa--make-atom-feed pkg pkg-spec srcdir files)))
+            
 (defun elpaa--make-aggregated-atom-feed (filename)
   (let* ((files (sort
                  (directory-files "." nil "\\.xml\\'" 'nosort)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]