aboutsummaryrefslogtreecommitdiff
path: root/buildbot-view.el
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot-view.el')
-rw-r--r--buildbot-view.el145
1 files changed, 141 insertions, 4 deletions
diff --git a/buildbot-view.el b/buildbot-view.el
index 846c0df..7d1b677 100644
--- a/buildbot-view.el
+++ b/buildbot-view.el
@@ -2,6 +2,13 @@
(require 'buildbot-utils)
(defvar buildbot-view-header-regex "^\\[.*\\]$")
+;; 'revision, 'build, 'step, or 'log
+(defvar-local buildbot-view-type nil)
+(defvar-local buildbot-view-data nil)
+;; (defvar-local buildbot-view-revision-id nil)
+;; (defvar-local buildbot-view-revision-info nil)
+;; (defvar-local buildbot-view-build nil)
+;; (defvar-local buildbot-view-step nil)
(define-derived-mode buildbot-view-mode special-mode "Buildbot view"
"Buildbot view, a base mode")
@@ -33,7 +40,7 @@
(alist-get 'comments revision-info)
(buildbot-view-format-build-stats
(alist-get 'build-stats revision-info)))
- 'revision-id (alist-get 'revision revision-info)))
+ 'revision-id (alist-get 'revision revision-info) 'type 'revision))
(defun buildbot-view-format-build-stats (stats)
(format "Build stats: Success - %d | Failure - %d | Pending - %d"
@@ -50,7 +57,7 @@
(mapcar (lambda (test) (alist-get 'test_name test))
(alist-get 'failed_tests build))
"\n"))
- 'build build))
+ 'build build 'type 'build))
(defun buildbot-view-format-step (step)
(propertize
@@ -58,12 +65,142 @@
(alist-get 'number step)
(alist-get 'name step)
(alist-get 'state_string step))
- 'step step))
+ 'step step 'type 'step))
(defun buildbot-view-format-log (log)
(propertize
(format "\n[%s]\n"
(alist-get 'name log))
- 'log log))
+ 'log log 'type 'log))
+
+(defun buildbot-revision-format (revision-info builds)
+ (concat
+ (buildbot-view-format-revision-info revision-info)
+ "\n"
+ (string-join
+ (mapcar 'buildbot-view-format-build builds)
+ "\n")))
+
+(defun buildbot-revision-get-info (change)
+ (list (cons 'revision (alist-get 'revision change))
+ (cons 'author (alist-get 'author change))
+ (cons 'created-at (buildbot-format-epoch-time
+ (alist-get 'created_at
+ (alist-get 'sourcestamp change))))
+ (cons 'comments (alist-get 'comments change))
+ (cons 'build-stats (buildbot-revision-get-build-stats
+ (alist-get 'builds change)))))
+
+(defun buildbot-revision-get-build-stats (builds)
+ (let ((results '((success . 0)
+ (failure . 0)
+ (pending . 0)))
+ status)
+ (seq-do
+ (lambda (build)
+ (setq status (buildbot-build-status build))
+ (setf (alist-get status results)
+ (1+ (alist-get status results))))
+ builds)
+ results))
+
+(defun buildbot-build-format (revision-info build steps)
+ (concat
+ (buildbot-view-format-revision-info revision-info)
+ "\n"
+ (buildbot-view-format-build build)
+ "\n"
+ (string-join
+ (mapcar 'buildbot-view-format-step steps)
+ "\n")))
+
+(defun buildbot-step-format (revision-info build step logs)
+ (concat
+ (buildbot-view-format-revision-info revision-info)
+ "\n"
+ (buildbot-view-format-build build)
+ "\n"
+ (buildbot-view-format-step step)
+ (string-join
+ (mapcar 'buildbot-view-format-log logs)
+ "\n")))
+
+(defun buildbot-view-buffer-name (type data)
+ (pcase type
+ ('revision (format "*buildbot revision %s"
+ (alist-get 'revision-id data)))
+ ('build (format "*buildbot build %d"
+ (alist-get 'id (alist-get 'build data))))
+ ('step (format "*buildbot step %d"
+ (alist-get 'stepid (alist-get 'step data))))))
+
+(defun buildbot-view-load (type data)
+ (let ((buffer-name (buildbot-view-buffer-name type data)))
+ (with-current-buffer (get-buffer-create buffer-name)
+ (buildbot-view-mode)
+ (setq buildbot-view-type type
+ buildbot-view-data data)
+ (buildbot-view-update))
+ (switch-to-buffer buffer-name)))
+
+(defun buildbot-view-reload ()
+ (interactive)
+ (buildbot-view-update))
+(define-key buildbot-view-mode-map "g" 'buildbot-view-reload)
+
+(defun buildbot-view-revision-open (revision-id)
+ (interactive "sRevision (commit hash): ")
+ (buildbot-view-load 'revision `((revision-id . ,revision-id))))
+
+(defun buildbot-view-update ()
+ (unless (derived-mode-p 'buildbot-view-mode)
+ (error "Not in buildbot view mode"))
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (pcase buildbot-view-type
+ ('revision
+ (let ((change
+ (buildbot-get-change-by-revision
+ (alist-get 'revision-id buildbot-view-data))))
+ (setf (alist-get 'revision-info buildbot-view-data)
+ (buildbot-revision-get-info change))
+ (insert (buildbot-revision-format
+ (alist-get 'revision-info buildbot-view-data)
+ (alist-get 'builds change)))))
+ ('build
+ (insert (buildbot-build-format
+ (alist-get 'revision-info buildbot-view-data)
+ (alist-get 'build buildbot-view-data)
+ (buildbot-get-steps-by-buildid
+ (alist-get 'id
+ (alist-get 'build buildbot-view-data))))))
+ ('step
+ (insert (buildbot-step-format
+ (alist-get 'revision-info buildbot-view-data)
+ (alist-get 'build buildbot-view-data)
+ (alist-get 'step buildbot-view-data)
+ (buildbot-get-logs-by-stepid
+ (alist-get 'stepid
+ (alist-get 'step buildbot-view-data)))))))
+ (goto-char (point-min))))
+
+(defun buildbot-view-open-thing-at-point ()
+ (interactive)
+ (let ((data (copy-tree buildbot-view-data)))
+ (pcase (get-text-property (point) 'type)
+ ('revision
+ (setf (alist-get 'revision-id data)
+ (get-text-property (point) 'revision-id))
+ (buildbot-view-load 'revision data))
+ ('build
+ (setf (alist-get 'build data)
+ (get-text-property (point) 'build))
+ (buildbot-view-load 'build data))
+ ('step
+ (setf (alist-get 'step data)
+ (get-text-property (point) 'step))
+ (buildbot-view-load 'step data)))))
+(define-key buildbot-view-mode-map (kbd "<return>")
+ 'buildbot-view-open-thing-at-point)
(provide 'buildbot-view)