aboutsummaryrefslogtreecommitdiff
path: root/emacs/.emacs.d/lisp/my/my-codeberg.el
blob: fbff4535093b1290f039e2457e57f57c787a0f0b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
;;; my-codeberg.el -- client to codeberg/forgejo -*- lexical-binding: t -*-

;; Copyright (C) 2023  Free Software Foundation, Inc.

;; Author: Yuchen Pei <id@ypei.org>
;; Package-Requires: ((emacs "28.2"))

;; This file is part of dotted.

;; dotted is free software: you can redistribute it and/or modify it under
;; the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; dotted 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 Affero General
;; Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with dotted.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; client to codeberg/forgejo.

;;; Code:

(require 'subr-x)
(require 'my-net)
(defvar my-forgejo-host "codeberg.org" "The forgejo host.")

(defun my-forgejo-api-repos (owner repo)
  "Call the forgejo repos API with OWNER and REPO."
  (my-url-fetch-json (format "https://%s/api/v1/repos/%s/%s"
                             my-forgejo-host owner repo)))

(defun my-grok-codeberg (url)
  "Get info of codeberg project located at URL."
  (when (string-match (format "%s/\\([^/]+\\)/\\([^/]+\\)/?.*$" my-forgejo-host)
                      url)
    (let ((owner (match-string 1 url))
          (repo (match-string 2 url)))
      (my-grok-codeberg-make-info
       (my-forgejo-api-repos owner repo)))))

(defun my-grok-codeberg-make-info (raw)
  "Filter common properties from codeberg json response RAW"
  (list (cons "Title" (alist-get 'name raw))
        (cons "Description" (alist-get 'description raw))
        (cons "Source" (alist-get 'html_url raw))
        (cons "Website" (alist-get 'website raw))
        (cons "Released" (substring (alist-get 'created_at raw) 0 10))
        (cons "Updated" (substring (alist-get 'updated_at raw) 0 10))
        (cons "Location" (alist-get 'location raw))
        (cons "Subject" (string-join (alist-get 'topics raw) ", "))
        (cons "Language" (alist-get 'language raw))
        (cons "Developers" (alist-get 'username (alist-get 'owner raw)))))

(provide 'my-codeberg)
;;; my-codeberg.el ends here