branch: externals/srht commit d911ecddccf70497863ab3604d65eb9b2e29347d Author: Aleksandr Vityazev <avitya...@posteo.org> Commit: Aleksandr Vityazev <avitya...@posteo.org>
srht-git: srht-git-log: New command. * lisp/srht (srht-plist-get, srht--vtable, srht--view-log): New functions. * lisp/srht-git (srht-git-log): New command; (srht-git-repository-log): New function. --- lisp/srht-git.el | 47 ++++++++++++++++++++++----- lisp/srht.el | 97 ++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 109 insertions(+), 35 deletions(-) diff --git a/lisp/srht-git.el b/lisp/srht-git.el index 7b3071451a..7ddc93285d 100644 --- a/lisp/srht-git.el +++ b/lisp/srht-git.el @@ -74,12 +74,11 @@ Or CALLBACK may be `sync' to make a synchronous request." (srht-git-repositories-next nil))) (cursor "") (ac nil)) (if cursor - (pcase-let (((map (:data - (map (:me - (map (:repositories - (map (:cursor pointer) - (:results results)))))))) - (srht-git-request instance query))) + (let* ((resp (srht-git-request instance query)) + (results (srht-plist-get resp + :data :me :repositories :results)) + (pointer (srht-plist-get resp + :data :me :repositories :cursor))) (loop (srht-gql-query (srht-git-repositories-next pointer)) pointer (append results ac))) ac))) @@ -187,7 +186,7 @@ INITIAL-INPUT, HISTORY (see `read-from-minibuffer')." (transient-define-suffix srht-git-repo-create0 () "Create the NAME repository on an instance with the instance name INSTANCE. Set VISIBILITY and DESCRIPTION." - (interactive) + (interactive nil nil) (let ((instance (srht-git--transient-value "instance=")) (name (let ((val (srht-git--transient-value "name="))) (if (or (null val) (string-empty-p val)) @@ -288,6 +287,36 @@ Set VISIBILITY, NEW-NAME and DESCRIPTION." (srht-git--message instance "Sourcehut %s git repository deleted!" repo-name)))))) +(defun srht-git-repository-log (instance repo-name &optional cursor) + "Sourcehut INSTANCE repository REPO-NAME log. +If you pass value of CURSOR into repositories(cursor:\"...\") in a +subsequent request, you'll get the next page." + (let* ((log `(:type log + :arguments (:cursor ,cursor) + :fields (cursor + (:type results + :fields (shortId + message + (:type author + :fields (name email))))))) + (repository `(:type repository + :arguments (:name ,repo-name) + :fields (id name ,log) + ))) + (srht-git-request instance + (srht-gql-query + `(:query me + :fields (,repository)))))) + +;;;###autoload +(defun srht-git-log (instance repo-name) + "Display log of Sourcehut INSTANCE git repositories REPO-NAME." + (interactive nil nil) + (if-let ((resp (srht-git-repository-log instance repo-name)) + (log (srht-plist-get resp :data :me :repository :log :results))) + (srht--view-log log) + (user-error "No log"))) + ;;;###autoload (defun srht-git-repos-list (instance) "Display a list of Sourcehut INSTANCE git repositories." @@ -300,7 +329,9 @@ Set VISIBILITY, NEW-NAME and DESCRIPTION." (srht-git-repo-delete ,instance (plist-get obj :name))) "u" (lambda (obj) (srht-git-repo-update ,instance (plist-get obj :name))) - "c" (lambda (_obj) (srht-git-repo-create))))) + "c" (lambda (_obj) (srht-git-repo-create)) + "l" (lambda (obj) + (srht-git-log ,instance (plist-get obj :name)))))) ;;;;;;;;;;;;;;;;;;;LEGACY API;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/lisp/srht.el b/lisp/srht.el index 864e8cfcd6..540de1c815 100644 --- a/lisp/srht.el +++ b/lisp/srht.el @@ -273,11 +273,19 @@ PROMPT is a string to prompt with; normally it ends in a colon and a space." PROMPT, INITIAL-INPUT see `completing-read' doc." (completing-read prompt '("private" "public" "unlisted") nil t initial-input)) +(defun srht-plist-get (plist &rest kw-list) + "Extract a value for last keyword in KW-LIST from a property list. +PLIST nested property list." + (declare (indent 1)) + (seq-reduce (lambda (acc kw) + (setq acc (plist-get acc kw))) + kw-list plist)) + (defun srht-results-get (instance plist) "Extract the value for the :results property. For the existing PLIST for the INSTANCE instance name." (declare (indent 1)) - (plist-get (plist-get plist (intern instance)) :results)) + (srht-plist-get plist (intern instance) :results)) (defmacro srht-put (plist instance val) "Change value in PLIST of INSTANCE to VAL if is not nil." @@ -323,40 +331,75 @@ Return string in format DAY.MONTH.YEAR." (lambda (&rest _args) (error "Require define-keymap")))) -(defun srht--view (instance repositories &optional actions) - "Display a list of Sourcehut INSTANCE REPOSITORIES. -ACTIONS are simple commands that will be called with the -object under point." - (declare (indent 2)) - (let ((buffer (get-buffer-create "*Sourcehut repositories*"))) - (with-current-buffer buffer +(cl-defun srht--vtable (&key buffer + columns + objects + getter + separator-width + actions) + "" + (let ((buff (get-buffer-create buffer))) + (with-current-buffer buff (let ((inhibit-read-only t)) (srht--make-vtable - :columns '("Name" - (:name "Visibility" - :formatter (lambda (val) (when val (downcase val)))) - (:name "Created" - :formatter srht--format-date - :width 10) - (:name "Updated" - :formatter srht--format-date - :width 10)) - :objects (plist-get repositories (intern instance)) - :getter (lambda (object column vtable) - (pcase (srht--vtable-colum vtable column) - ("Name" (plist-get object :name)) - ("Visibility" (plist-get object :visibility)) - ("Created" (plist-get object :created)) - ("Updated" (plist-get object :updated)))) - :separator-width 5 - :actions actions + :columns columns + :objects objects + :getter getter + :separator-width separator-width :keymap (srht--define-keymap "q" #'kill-current-buffer "n" #'next-line - "p" #'previous-line))) + "p" #'previous-line) + :actions actions)) (read-only-mode) (hl-line-mode)) (switch-to-buffer buffer))) +(defun srht--view (instance repositories &optional actions) + "Display a list of Sourcehut INSTANCE REPOSITORIES. +ACTIONS are simple commands that will be called with the +object under point." + (declare (indent 2)) + (srht--vtable + :buffer "*Sourcehut repositories*" + :columns '("Name" + (:name "Visibility" + :formatter (lambda (val) (when val (downcase val)))) + (:name "Created" + :formatter srht--format-date + :width 10) + (:name "Updated" + :formatter srht--format-date + :width 10)) + :objects (plist-get repositories (intern instance)) + :getter (lambda (object column vtable) + (pcase (srht--vtable-colum vtable column) + ("Name" (plist-get object :name)) + ("Visibility" (plist-get object :visibility)) + ("Created" (plist-get object :created)) + ("Updated" (plist-get object :updated)))) + :separator-width 5 + :actions actions)) + +(defun srht--view-log (log &optional actions) + "" + (srht--vtable + :buffer "*Sourcehut log*" + :columns '("ShortId" + (:name "Message" + :width 40) + (:name "Author name") + (:name "Author email")) + :objects log + :getter (lambda (object column vtable) + (pcase (srht--vtable-colum vtable column) + ("ShortId" (plist-get object :shortId)) + ("Message" (replace-regexp-in-string + "\n" "" (plist-get object :message))) + ("Author name" (srht-plist-get object :author :name)) + ("Author email" (srht-plist-get object :author :email)))) + :separator-width 1 + :actions actions)) + (provide 'srht) ;;; srht.el ends here