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

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

[elpa] externals/vc-got 74b0000 138/145: install a custom process filter


From: ELPA Syncer
Subject: [elpa] externals/vc-got 74b0000 138/145: install a custom process filter for `got send'
Date: Thu, 9 Sep 2021 15:58:50 -0400 (EDT)

branch: externals/vc-got
commit 74b0000920b6527234aa4672c16b7c860042a3dc
Author: Omar Polo <op@omarpolo.com>
Commit: Omar Polo <op@omarpolo.com>

    install a custom process filter for `got send'
    
    `got send' uses \r to "update" the outputted text; it's nice and why
    don't support it?
    
    Without this, Emacs wait for a \n and output a long line with various
    ^M inside; it's ugly.
    
    While there, there's no need to call (vc-compilation-mode 'git), so
    replace it with 'got.
---
 vc-got.el | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/vc-got.el b/vc-got.el
index 3b657d6..20b73ed 100755
--- a/vc-got.el
+++ b/vc-got.el
@@ -654,6 +654,26 @@ If REV is t, checkout from the head."
     (when branch
       (vc-got--integrate branch))))
 
+(defun vc-got--proc-filter (proc s)
+  "Custom output filter for async process PROC.
+It's like `vc-process-filter' but supports \r inside S."
+  (let ((buffer (process-buffer proc)))
+    (when (buffer-live-p buffer)
+      (with-current-buffer buffer
+        (save-excursion
+          (let ((buffer-undo-list t)
+                (inhibit-read-only t))
+            (goto-char (process-mark proc))
+            (if (not (string-match ".*\r\\(.*\\)" s))
+                (insert s)
+              ;; handle \r
+              (end-of-line)
+              (let ((end (point)))
+                (beginning-of-line)
+                (delete-region (point) end))
+              (insert (match-string 1 s)))
+            (set-marker (process-mark proc) (point))))))))
+
 (defun vc-got--push-pull (cmd op prompt)
   "Execute CMD OP, or prompt the user if PROMPT is non-nil."
   (let ((buffer (format "*vc-got : %s*" (expand-file-name default-directory))))
@@ -668,14 +688,17 @@ If REV is t, checkout from the head."
       ;; part it makes sense, but we should revisit for full Got
       ;; support.
       (with-current-buffer buffer
-        (vc-compilation-mode 'git)
-        (let ((comp-cmd (mapconcat #'identity cmd " ")))
+        (vc-compilation-mode 'got)
+        (let ((comp-cmd (mapconcat #'identity cmd " "))
+              (proc (get-buffer-process buffer)))
           (setq-local compile-command comp-cmd)
           (setq-local compilation-directory default-directory)
           (setq-local compilation-arguments (list comp-cmd
                                                   nil
                                                   (lambda (_ign) buffer)
-                                                  nil))))
+                                                  nil))
+          ;; Setup a custom process filter that handles \r.
+          (set-process-filter proc #'vc-got--proc-filter)))
       (vc-set-async-update buffer))))
 
 ;; TODO: this could be expanded.  After a pull the worktree needs to



reply via email to

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