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

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

[elpa] externals/ggtags ecd751dcc0 1/2: Use call-process to run global s


From: ELPA Syncer
Subject: [elpa] externals/ggtags ecd751dcc0 1/2: Use call-process to run global synchronously with xref backend
Date: Thu, 1 Jun 2023 21:58:25 -0400 (EDT)

branch: externals/ggtags
commit ecd751dcc0a69661822336118aa2da265be1432b
Author: Gonzalo Larumbe <gonzalomlarumbe@gmail.com>
Commit: Leo Liu <sdl.web@gmail.com>

    Use call-process to run global synchronously with xref backend
---
 ggtags.el | 31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/ggtags.el b/ggtags.el
index ba14d88396..792184de7d 100644
--- a/ggtags.el
+++ b/ggtags.el
@@ -1976,10 +1976,9 @@ ggtags: history match invalid, jump to first match 
instead")
     (and buffer-file-name ggtags-update-on-save
          (ggtags-update-tags-single buffer-file-name 'nowait))))
 
-(defun ggtags-global-output (buffer cmds callback &optional cutoff sync)
+(defun ggtags-global-output (buffer cmds callback &optional cutoff)
   "Asynchronously pipe the output of running CMDS to BUFFER.
-When finished invoke CALLBACK in BUFFER with process exit status.
-If SYNC is non-nil, synchronously run CMDS and call CALLBACK."
+When finished invoke CALLBACK in BUFFER with process exit status."
   (or buffer (error "Output buffer required"))
   (when (get-buffer-process (get-buffer buffer))
     ;; Notice running multiple processes in the same buffer so that we
@@ -2016,10 +2015,24 @@ If SYNC is non-nil, synchronously run CMDS and call 
CALLBACK."
     (and cutoff (set-process-filter proc filter))
     (set-process-sentinel proc sentinel)
     (process-put proc :callback-done nil)
-    (process-put proc :nlines 0)
-    (if sync (while (not (process-get proc :callback-done))
-               (accept-process-output proc 1))
-      proc)))
+    (process-put proc :nlines 0)))
+
+(defun ggtags-global-output-sync (buffer cmds callback)
+  "Synchronously run CMDS and show output in BUFFER.
+When finished invoke CALLBACK in BUFFER with process exit status."
+  ;; Same as `ggtags-global-output'
+  (or buffer (error "Output buffer required"))
+  (when (get-buffer-process (get-buffer buffer))
+    ;; Notice running multiple processes in the same buffer so that we
+    ;; can fix the caller. See for example `ggtags-eldoc-function'.
+    (message "Warning: detected %S already running in %S; interrupting..."
+             (get-buffer-process buffer) buffer)
+    (interrupt-process (get-buffer-process buffer)))
+  (let* ((program (car cmds))
+         (args (cdr cmds))
+         (status (apply #'call-process program nil buffer nil args)))
+    (with-current-buffer buffer
+      (funcall callback status))))
 
 (cl-defun ggtags-fontify-code (code &optional (mode major-mode))
   (cl-check-type mode function)
@@ -2451,12 +2464,12 @@ Return the list of xrefs for TAG."
             (kill-buffer (current-buffer)))))
     (ggtags-with-current-project
       (let ((default-directory (ggtags-current-project-root)))
-        (ggtags-global-output
+        (ggtags-global-output-sync
          (get-buffer-create " *ggtags-xref*")
          (append
           (split-string (ggtags-global-build-command cmd))
           (list "--" (shell-quote-argument tag)))
-         collect ggtags--xref-limit 'sync))
+         collect))
       xrefs)))
 
 (cl-defmethod xref-backend-definitions ((_backend (eql ggtags)) tag)



reply via email to

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