branch: externals/vc-got
commit 74b0000920b6527234aa4672c16b7c860042a3dc
Author: Omar Polo <[email protected]>
Commit: Omar Polo <[email protected]>
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