;;; my-gitlab.el -- gitlab client -*- lexical-binding: t -*- ;; Copyright (C) 2023 Free Software Foundation. ;; Author: Yuchen Pei ;; Package-Requires: ((emacs "28.2")) ;; This file is part of dotfiles. ;; dotfiles 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. ;; dotfiles 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 dotfiles. If not, see . ;;; Commentary: ;; gitlab client. ;;; Code: (defun my-get-gitlab-project-id (url) (with-current-buffer (url-retrieve-synchronously (replace-regexp-in-string "\\.git$" "" url)) (let ((dom (libxml-parse-html-region (point-min) (point-max)))) (dom-attr (car (dom-search dom (lambda (n) (dom-attr n 'data-project-id)))) 'data-project-id)))) (defun my-grok-gitlab (url) (when-let* ((urlobj (url-generic-parse-url url)) (project-id (my-get-gitlab-project-id url))) (with-current-buffer (url-retrieve-synchronously (concat (url-type urlobj) "://" (url-host urlobj) "/api/v4/projects/" project-id)) (set-buffer-multibyte t) (my-delete-http-header) (my-grok-gitlab-make-info (json-read))))) (defun my-grok-gitlab-make-info (raw) (list (cons "Title" (alist-get 'name raw)) (cons "Description" (my-clean-property-value (alist-get 'description raw))) (cons "Source" (alist-get 'web_url raw)) (cons "Subject" (string-join (alist-get 'tag_list raw) ", ")) (cons "Released" (substring (alist-get 'created_at raw) 0 10)) (cons "Last-activity" (substring (alist-get 'last_activity_at raw) 0 10)) (cons "Developers" (alist-get 'name (alist-get 'namespace raw))))) (provide 'my-gitlab) ;;; my-gitlab.el ends here