emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/srht d911ecddcc 7/7: srht-git: srht-git-log: New comman


From: ELPA Syncer
Subject: [elpa] externals/srht d911ecddcc 7/7: srht-git: srht-git-log: New command.
Date: Thu, 16 Nov 2023 09:58:40 -0500 (EST)

branch: externals/srht
commit d911ecddccf70497863ab3604d65eb9b2e29347d
Author: Aleksandr Vityazev <avityazev@posteo.org>
Commit: Aleksandr Vityazev <avityazev@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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]