From 372f02ddeec2fa208eb497e54058186cedeff3f4 Mon Sep 17 00:00:00 2001 From: Pieter Hijma Date: Sat, 24 Jun 2023 20:51:54 +0200 Subject: [PATCH] Add support for latest releases from Gitea --- quicklisp-controller.asd | 1 + upstream-gitea.lisp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 upstream-gitea.lisp diff --git a/quicklisp-controller.asd b/quicklisp-controller.asd index 5bba6db..984e09b 100644 --- a/quicklisp-controller.asd +++ b/quicklisp-controller.asd @@ -39,6 +39,7 @@ (:file "upstream-git") (:file "upstream-github") (:file "upstream-gitlab") + (:file "upstream-gitea") (:file "upstream-mercurial") (:file "upstream-svn") (:file "upstream-bzr") diff --git a/upstream-gitea.lisp b/upstream-gitea.lisp new file mode 100644 index 0000000..e567670 --- /dev/null +++ b/upstream-gitea.lisp @@ -0,0 +1,38 @@ +;;;; upstream-gitea.lisp +;;;; +;;;; Fetch some basic info about a source from a gitea/forgejo instance +;;;; + +(in-package #:quicklisp-controller) + +(defun gitea-project-data (url) + (ppcre:register-groups-bind (host owner repo) + ("//([^/]+?)/([^/]+?)/([^/]+?)(\\.git)?$" url) + (values host owner repo))) + +(defun gitea-latest-release-uri (repo-url) + "Given a URL from a Gitea repo, give a URI to the latest release" + (multiple-value-bind (host owner repo) (gitea-project-data repo-url) + (format nil "https://~A/api/v1/repos/~A/~A/releases/latest" + host owner repo))) + + +(defun gitea-project-release-json (url) + (let* ((uri (gitea-latest-release-uri url)) + (request (make-instance 'githappy::request + :uri uri)) + (response (githappy::submit request)) + (json (yason:parse (githappy::utf8-string (githappy::body response))))) + json)) + +(defun gitea-latest-release-info (url) + (let ((json (gitea-project-release-json url))) + (when json + (list :tag (githappy:jref json "tag_name") + :url (githappy:jref json "tarball_url"))))) + +(defclass latest-gitea-release-source (latest-github-release-source) + ()) + +(defmethod github-info-plist ((source latest-gitea-release-source)) + (gitea-latest-release-info (location source)))