emacs-diffs
[Top][All Lists]
Advanced

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

master 259f4613bde: Improve implementation of built-in Eshell "kill" com


From: Jim Porter
Subject: master 259f4613bde: Improve implementation of built-in Eshell "kill" command
Date: Thu, 18 Jul 2024 15:34:01 -0400 (EDT)

branch: master
commit 259f4613bdea27abf330b58a9683ca4a9e936777
Author: Jim Porter <jporterbugs@gmail.com>
Commit: Jim Porter <jporterbugs@gmail.com>

    Improve implementation of built-in Eshell "kill" command
    
    * lisp/eshell/esh-proc.el (eshell/kill): Fix handling of commands like
    "kill 123".  Use REMOTE when signalling PIDs in remote directories.
    Signal using process objects when possible.  Report errors when failing
    to signal.
    
    * test/lisp/eshell/esh-proc-tests.el (esh-proc-test/kill/process-id)
    (esh-proc-test/kill/process-object): New tests (bug#72013).
---
 lisp/eshell/esh-proc.el            | 48 +++++++++++++++++---------------------
 test/lisp/eshell/esh-proc-tests.el | 24 +++++++++++++++++++
 2 files changed, 45 insertions(+), 27 deletions(-)

diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el
index fbeb13362f3..ed417ab0f12 100644
--- a/lisp/eshell/esh-proc.el
+++ b/lisp/eshell/esh-proc.el
@@ -237,40 +237,34 @@ Wait until PROCESS(es) have completed execution.")
 Usage: kill [-<signal>] <pid>|<process> ...
 Accepts PIDs and process objects.  Optionally accept signals
 and signal names."
-  ;; The implementation below only supports local PIDs.  For remote
-  ;; connections, fall back to the external "kill" command.
-  (when (file-remote-p default-directory)
-    (declare-function eshell-external-command "esh-ext" (command args))
-    (throw 'eshell-external (eshell-external-command "kill" args)))
-  ;; If the first argument starts with a dash, treat it as the signal
-  ;; specifier.
   (let ((signum 'SIGINT))
     (let ((arg (car args))
           (case-fold-search nil))
       (when (stringp arg)
+        ;; If the first argument starts with a dash, treat it as the
+        ;; signal specifier.
         (cond
          ((string-match "\\`-[[:digit:]]+\\'" arg)
-          (setq signum (abs (string-to-number arg))))
+          (setq signum (abs (string-to-number arg)))
+          (pop args))
          ((string-match "\\`-\\([[:upper:]]+\\|[[:lower:]]+\\)\\'" arg)
-          (setq signum (intern (substring arg 1)))))
-        (setq args (cdr args))))
-    (while args
-      (let ((arg (if (eshell-processp (car args))
-                     (process-id (car args))
-                   (string-to-number (car args)))))
-        (when arg
-          (cond
-           ((null arg)
-            (error "kill: null pid.  Process may actually be a network 
connection."))
-           ((not (numberp arg))
-            (error "kill: invalid argument type: %s" (type-of arg)))
-           ((and (numberp arg)
-                 (<= arg 0))
-            (error "kill: bad pid: %d" arg))
-           (t
-            (signal-process arg signum)))))
-      (setq args (cdr args))))
-  nil)
+          (setq signum (intern (substring arg 1)))
+          (pop args)))))
+    (dolist (proc args)
+      (when (stringp proc)
+        (setq proc (string-to-number proc)))
+      (let ((result
+             (cond
+              ((numberp proc)
+               (when (<= proc 0)
+                 (error "kill: bad pid: %d" proc))
+               (signal-process proc signum (file-remote-p default-directory)))
+              ((eshell-processp proc)
+               (signal-process proc signum))
+              (t
+               (error "kill: invalid argument type: %s" (type-of proc))))))
+        (when (= result -1)
+          (error "kill: failed to kill process %s" proc))))))
 
 (put 'eshell/kill 'eshell-no-numeric-conversions t)
 
diff --git a/test/lisp/eshell/esh-proc-tests.el 
b/test/lisp/eshell/esh-proc-tests.el
index 85b02845ab3..d46004688f9 100644
--- a/test/lisp/eshell/esh-proc-tests.el
+++ b/test/lisp/eshell/esh-proc-tests.el
@@ -344,6 +344,30 @@ write the exit status to the pipe.  See bug#54136."
                         output-start (eshell-end-of-output))
                        ""))))))
 
+(ert-deftest esh-proc-test/kill/process-id ()
+  "Test killing processes with the \"kill\" built-in using PIDs."
+  (skip-unless (executable-find "sleep"))
+  (with-temp-eshell
+    (eshell-insert-command "sleep 100 &")
+    (string-match (rx (group (+ digit)) eol) (eshell-last-output))
+    (let ((pid (match-string 1 (eshell-last-output))))
+      (should (= (length eshell-process-list) 1))
+      (eshell-insert-command (format "kill %s" pid))
+      (should (= eshell-last-command-status 0))
+      (eshell-wait-for-subprocess t)
+      (should (= (length eshell-process-list) 0)))))
+
+(ert-deftest esh-proc-test/kill/process-object ()
+  "Test killing processes with the \"kill\" built-in using process objects."
+  (skip-unless (executable-find "sleep"))
+  (with-temp-eshell
+    (eshell-insert-command "sleep 100 &")
+    (should (= (length eshell-process-list) 1))
+    (eshell-insert-command "kill (caar eshell-process-list)")
+    (should (= eshell-last-command-status 0))
+    (eshell-wait-for-subprocess t)
+    (should (= (length eshell-process-list) 0))))
+
 
 ;; Remote processes
 



reply via email to

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