;;; guix-hydra-jobset.el --- Interface for Hydra jobsets -*- lexical-binding: t -*- ;; Copyright © 2015 Alex Kost ;; 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 this program. If not, see . ;;; Commentary: ;; This file provides an interface for displaying Hydra jobsets in ;; 'list' and 'info' buffers. ;;; Code: (require 'cl-lib) (require 'guix-buffer) (require 'guix-list) (require 'guix-info) (require 'guix-hydra) (require 'guix-hydra-build) (require 'guix-utils) (guix-hydra-define-entry-type hydra-jobset :search-types '((project . guix-hydra-jobset-api-url)) :filters '(guix-hydra-jobset-filter-id) :filter-names '((nrscheduled . scheduled) (nrsucceeded . succeeded) (nrfailed . failed) (nrtotal . total))) (defun guix-hydra-jobset-get-display (search-type &rest args) "Search for Hydra builds and show results." (apply #'guix-list-get-display-entries 'hydra-jobset search-type args)) ;;; Defining URLs (defun guix-hydra-jobset-url (project jobset) "Return Hydra URL of a PROJECT's JOBSET." (guix-hydra-url "jobset/" project "/" jobset)) (defun guix-hydra-jobset-api-url (project) "Return Hydra API URL for jobsets by PROJECT." (guix-hydra-api-url "jobsets" `(("project" . ,project)))) ;;; Filters for processing raw entries (defun guix-hydra-jobset-filter-id (entry) "Add 'ID' parameter to 'hydra-jobset' ENTRY." (cons `(id . ,(guix-entry-value entry 'name)) entry)) ;;; Hydra jobset 'info' (guix-hydra-info-define-interface hydra-jobset :mode-name "Hydra-Jobset-Info" :buffer-name "*Guix Hydra Jobset Info*" :format '((name ignore (simple guix-info-heading)) ignore guix-hydra-jobset-info-insert-url (project format guix-hydra-jobset-info-insert-project) (scheduled format (format guix-hydra-jobset-info-scheduled)) (succeeded format (format guix-hydra-jobset-info-succeeded)) (failed format (format guix-hydra-jobset-info-failed)) (total format (format guix-hydra-jobset-info-total)))) (defface guix-hydra-jobset-info-scheduled '((t)) "Face used for the number of scheduled builds." :group 'guix-hydra-jobset-info-faces) (defface guix-hydra-jobset-info-succeeded '((t :inherit guix-hydra-build-status-succeeded)) "Face used for the number of succeeded builds." :group 'guix-hydra-jobset-info-faces) (defface guix-hydra-jobset-info-failed '((t :inherit guix-hydra-build-status-failed)) "Face used for the number of failed builds." :group 'guix-hydra-jobset-info-faces) (defface guix-hydra-jobset-info-total '((t)) "Face used for the total number of builds." :group 'guix-hydra-jobset-info-faces) (defun guix-hydra-jobset-info-insert-project (project entry) "Insert PROJECT button for the jobset ENTRY." (let ((jobset (guix-entry-value entry 'name))) (guix-insert-button project 'guix-hydra-build-project 'action (lambda (btn) (let ((args (guix-hydra-build-latest-prompt-args :project (button-get btn 'project) :jobset (button-get btn 'jobset)))) (apply #'guix-hydra-build-get-display 'latest args))) 'project project 'jobset jobset))) (defun guix-hydra-jobset-info-insert-url (entry) "Insert Hydra URL for the jobset ENTRY." (guix-insert-button (guix-hydra-jobset-url (guix-entry-value entry 'project) (guix-entry-value entry 'name)) 'guix-url)) ;;; Hydra jobset 'list' (guix-hydra-list-define-interface hydra-jobset :mode-name "Hydra-Jobset-List" :buffer-name "*Guix Hydra Jobset List*" :format '((name nil 25 t) (project nil 10 t) (scheduled nil 12 t) (succeeded nil 12 t) (failed nil 9 t) (total nil 10 t))) (let ((map guix-hydra-jobset-list-mode-map)) (define-key map (kbd "B") 'guix-hydra-jobset-list-latest-builds)) (defun guix-hydra-jobset-list-latest-builds (number &rest args) "Display latest NUMBER of Hydra builds of the current jobset. Interactively, prompt for NUMBER. With prefix argument, prompt for all ARGS." (interactive (let ((entry (guix-list-current-entry))) (guix-hydra-build-latest-prompt-args :project (guix-entry-value entry 'project) :jobset (guix-entry-value entry 'name)))) (apply #'guix-hydra-latest-builds number args)) ;;; Interactive commands ;;;###autoload (defun guix-hydra-jobsets (project) "Display jobsets of PROJECT." (interactive (list (guix-hydra-read-project))) (guix-hydra-jobset-get-display 'project project)) (provide 'guix-hydra-jobset) ;;; guix-hydra-jobset.el ends here e. * tests/lint.scm ("home-page: 200") ("home-page: 200 but short length") ("home-page: 404", "home-page: 301, invalid"): ("home-page: 301 -> 200", "home-page: 301 -> 404") ("source: 200", "source: 200 but short length") ("source: 404", "source: 404 and 200") ("source: 301 -> 200", "source: 301 -> 404"): ("github-url", github-url): Likewise. * tests/swh.scm (with-json-result) ("lookup-origin, not found"): Likewise. Ludovic Courtès 2019-07-22swh: Add basic tests....* guix/swh.scm (%swh-base-url): Turn into a parameter and export it. * tests/swh.scm: New file. * Makefile.am (SCM_TESTS): Add it. Ludovic Courtès