branch: externals/buildbot
commit 6583303218c19c394eac34a792e4a326e1c19b0d
Author: Yuchen Pei <[email protected]>
Commit: Yuchen Pei <[email protected]>

    Adding support for more instances
    
    - Pass buildbot-host between buffers
    - Set buildbot-builders automatically
    - When the Changes API does not return builds, fetch the builds in a
      separate call
    
    This last change allows `buildbot-revision-open' to work with more
    instances, including python and buildbot.
    
    Also updated README with these changes, as well as ELPA installation
    info.
---
 README.org         | 35 +++++++++++++++++++++++++++++++----
 buildbot-client.el | 28 +++++++++++++++++++++++++---
 buildbot-utils.el  | 20 +++++++++++---------
 buildbot-view.el   | 34 ++++++++++++++++++++++++++++------
 4 files changed, 95 insertions(+), 22 deletions(-)

diff --git a/README.org b/README.org
index 7139b66c56..f46e6608e1 100644
--- a/README.org
+++ b/README.org
@@ -8,18 +8,37 @@ instance. It supports 
[[https://docs.buildbot.net/latest/relnotes/0.9.0.html][ne
 older versions (<0.9.0) and shows views for branches, revisions,
 builds, steps, logs and builders.
 
+It has been tested for the following instances:
+- [[https://buildbot.mariadb.org][mariadb]]
+- [[https://buildbot.python.org/all][python]]
+- [[https://buildbot.buildbot.net][buildbot]]
+
 *: The linked release notes describes the significant changes at
 0.9.0.
 
 * Install
 
+** From ELPA
+   :PROPERTIES:
+   :UPDATED:  [2023-07-15 Sat 16:16]
+   :END:
+
+Buildbot is currently available at elpa-devel:
+
+#+begin_src elisp
+(add-to-list 'package-archives
+             ("elpa-devel" . "https://elpa.gnu.org/devel/";))
+(package-refresh-contents)
+(package-install 'buildbot)
+#+end_src
+
 ** Manual install
    :PROPERTIES:
-   :UPDATED:  [2023-06-26 Mon 16:44]
+   :UPDATED:  [2023-07-15 Sat 16:24]
    :END:
 
 Clone this repo, and add to load path (assuming you clone to
-~~/.emacs.d~):
+=~/.emacs.d=):
 
 #+begin_src sh
 cd ~/.emacs.d
@@ -34,11 +53,16 @@ After that, require buildbot and set the host and builders, 
like so
 
 #+begin_src elisp
 (require 'buildbot)
-(setq buildbot-host "https://buildbot.mariadb.org";)
-(setq buildbot-builders (buildbot-get-all-builders))
+(setq buildbot-default-host "https://buildbot.mariadb.org";)
 #+end_src
 
+#+RESULTS:
+: https://buildbot.python.org/all
+
 * Use
+  :PROPERTIES:
+  :UPDATED:  [2023-07-15 Sat 16:11]
+  :END:
 
 Entry points:
 - ~M-x buildbot-revision-open~ prompts for a revision id (e.g. commit
@@ -49,6 +73,9 @@ Entry points:
 - ~M-x buildbot-builder-open~ prompts for a builder name from a list
   of available builders, and opens up a view of recent builds by this
   builder.
+- The first time any of these commands is invoked it may take a bit
+  longer than usual because it needs to make an extra call to get all
+  builders.
 
 * TODOs
   :PROPERTIES:
diff --git a/buildbot-client.el b/buildbot-client.el
index 0d4cf41e82..1aaf55fba9 100644
--- a/buildbot-client.el
+++ b/buildbot-client.el
@@ -30,7 +30,12 @@
 (defvar-local buildbot-host nil "Buildbot instance host.")
 (defvar-local buildbot-builders nil
   "Buildbot builders.
-Can be generated with `(buildbot-get-all-builders)'.")
+Can be generated with `buildbot-get-all-builders'.")
+(defgroup buildbot () "A Buildbot client." :group 'web)
+(defcustom buildbot-default-host nil
+  "The default Buildbot instance host."
+  :group 'buildbot
+  :type 'string)
 
 (defun buildbot-api-change (attr)
   "Call the Changes API with ATTR."
@@ -39,6 +44,13 @@ Can be generated with `(buildbot-get-all-builders)'.")
     "%s/api/v2/changes?%s"
     buildbot-host (buildbot-format-attr attr))))
 
+(defun buildbot-api-change-builds (change-id)
+  "Call the Changes API with CHANGE-ID to get all builds."
+  (buildbot-url-fetch-json
+   (format
+    "%s/api/v2/changes/%s/builds"
+    buildbot-host change-id)))
+
 (defun buildbot-api-log (stepid)
   "Call the Logs API with STEPID."
   (buildbot-url-fetch-json
@@ -120,8 +132,18 @@ Can be generated with `(buildbot-get-all-builders)'.")
 
 (defun buildbot-get-changes-by-revision (revision)
   "Get the changes from a REVISION."
-  (alist-get 'changes
-             (buildbot-api-change `((revision . ,revision)))))
+  (let ((changes
+         (alist-get 'changes
+                    (buildbot-api-change `((revision . ,revision))))))
+    (mapcar
+     (lambda (change)
+       (if (assq 'builds change)
+           change
+         (cons
+          (assq 'builds (buildbot-api-change-builds
+                         (alist-get 'changeid change)))
+          change)))
+     changes)))
 
 (defun buildbot-get-build-by-buildid (buildid)
   "Get a build with BUILDID."
diff --git a/buildbot-utils.el b/buildbot-utils.el
index d0163305c8..f28ab7597d 100644
--- a/buildbot-utils.el
+++ b/buildbot-utils.el
@@ -170,15 +170,17 @@ The changes should be of the same revision."
   (let* ((first-change (elt changes 0))
          (revision-info (buildbot-get-revision-info-from-change first-change))
          (changes-info
-          (mapcar (lambda (change)
-                    (list
-                     (assq 'branch change)
-                     (assq 'builds change)
-                     (cons 'build-stats
-                           (buildbot-get-build-stats
-                            (alist-get 'builds change)))
-                     (assq 'revision first-change)))
-                  changes)))
+          (mapcar
+           (lambda (change)
+             (append
+              (list
+               (assq 'branch change)
+               (assq 'builds change)
+               (assq 'revision first-change))
+              (when-let ((builds (assq 'builds change)))
+                `((build-stats . ,(buildbot-get-build-stats
+                                   (cdr builds)))))))
+           changes)))
     `((revision-info . ,revision-info) (changes-info . ,changes-info))))
 
 (provide 'buildbot-utils)
diff --git a/buildbot-view.el b/buildbot-view.el
index 323d3bc372..1db4b87e6d 100644
--- a/buildbot-view.el
+++ b/buildbot-view.el
@@ -128,10 +128,12 @@
 
 (defun buildbot-view-format-build-stats (stats)
   "Format build STATS in the view."
-  (format "Build stats: Success - %d | Failure - %d | Pending - %d"
-          (alist-get 'success stats)
-          (alist-get 'failure stats)
-          (alist-get 'pending stats)))
+  (if stats
+      (format "Build stats: Success - %d | Failure - %d | Pending - %d"
+              (alist-get 'success stats)
+              (alist-get 'failure stats)
+              (alist-get 'pending stats))
+    "Build stats: Unknown"))
 
 (defun buildbot-view-format-build (revision build &optional show-revision)
   "Format a BUILD header associated with REVISION in the view.
@@ -305,6 +307,22 @@ With a non-nil NO-BRANCH, do not show branch info."
     ('log (format "*buildbot log %d*"
                   (alist-get 'logid (alist-get 'log data))))))
 
+(defun buildbot-builders-same-host (host)
+  "Get `buildbot-builders' from a buffer with HOST.
+
+Find the first `buildbot-view-mode' buffer whose `buildbot-host'
+has value HOST and whose `buildbot-builders' is nonnil, and
+return `buildbot-builders' from that buffer."
+  (when-let ((found-buffer
+              (cl-find-if
+               (lambda (buffer)
+                 (with-current-buffer buffer
+                   (and (derived-mode-p 'buildbot-view-mode)
+                        (equal buildbot-host host)
+                        buildbot-builders)))
+               (buffer-list))))
+    (buffer-local-value 'buildbot-builders found-buffer)))
+
 (defun buildbot-view-open (type data &optional force)
   "Open a view of TYPE using DATA.
 
@@ -317,8 +335,12 @@ With a non-nil FORCE, reload the view buffer if exists."
         (buildbot-view-mode)
         (setq buildbot-view-type type
               buildbot-view-data data
-              buildbot-host host
-              buildbot-builders builders)
+              buildbot-host
+              (or host buildbot-default-host)
+              buildbot-builders
+              (or builders
+                  (buildbot-builders-same-host buildbot-host)
+                  (buildbot-get-all-builders)))
         (buildbot-view-update)))
     (switch-to-buffer buffer-name)))
 

Reply via email to