]> git.eshelyaron.com Git - emacs.git/commitdiff
Refactor tramp-*-process-file functions
authorMichael Albinus <michael.albinus@gmx.de>
Tue, 11 Jun 2024 12:43:28 +0000 (14:43 +0200)
committerEshel Yaron <me@eshelyaron.com>
Wed, 12 Jun 2024 09:28:56 +0000 (11:28 +0200)
* lisp/net/tramp-adb.el (tramp-adb-handle-make-process):
* lisp/net/tramp-sh.el (tramp-sh-handle-make-process): Don't compute
process name, this is done in `tramp-skeleton-make-process'.

* lisp/net/tramp-adb.el (tramp-adb-handle-process-file):
* lisp/net/tramp-sh.el (tramp-sh-handle-process-file):
* lisp/net/tramp-sshfs.el (tramp-sshfs-handle-process-file):
Use `tramp-skeleton-process-file'.

* lisp/net/tramp.el (tramp-get-unique-process-name): New defun.
(tramp-skeleton-make-process): Use it.
(tramp-skeleton-process-file): New defmacro.

(cherry picked from commit 5ecff95993d5edbffb27e14c2815d2b23003bcb4)

lisp/net/tramp-adb.el
lisp/net/tramp-sh.el
lisp/net/tramp-sshfs.el
lisp/net/tramp.el

index 89695793f3b0908b13eb0ee8c25c6af44060ca1d..fb728dadd2d021ba01400d3ec497d032ac00a096 100644 (file)
@@ -729,63 +729,11 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
 (defun tramp-adb-handle-process-file
   (program &optional infile destination display &rest args)
   "Like `process-file' for Tramp files."
-  ;; The implementation is not complete yet.
-  (when (and (numberp destination) (zerop destination))
-    (error "Implementation does not handle immediate return"))
-
-  (with-parsed-tramp-file-name (expand-file-name default-directory) nil
-    (let (command input tmpinput stderr tmpstderr outbuf ret)
+  (tramp-skeleton-process-file program infile destination display args
       ;; Compute command.
       (setq command (mapconcat #'tramp-shell-quote-argument
                               (cons program args) " "))
-      ;; Determine input.
-      (if (null infile)
-         (setq input (tramp-get-remote-null-device v))
-       (setq infile (file-name-unquote (expand-file-name infile)))
-       (if (tramp-equal-remote default-directory infile)
-           ;; INFILE is on the same remote host.
-           (setq input (tramp-unquote-file-local-name infile))
-         ;; INFILE must be copied to remote host.
-         (setq input (tramp-make-tramp-temp-file v)
-               tmpinput (tramp-make-tramp-file-name v input))
-         (copy-file infile tmpinput t)))
       (when input (setq command (format "%s <%s" command input)))
-
-      ;; Determine output.
-      (cond
-       ;; Just a buffer.
-       ((bufferp destination)
-       (setq outbuf destination))
-       ;; A buffer name.
-       ((stringp destination)
-       (setq outbuf (get-buffer-create destination)))
-       ;; (REAL-DESTINATION ERROR-DESTINATION)
-       ((consp destination)
-       ;; output.
-       (cond
-        ((bufferp (car destination))
-         (setq outbuf (car destination)))
-        ((stringp (car destination))
-         (setq outbuf (get-buffer-create (car destination))))
-        ((car destination)
-         (setq outbuf (current-buffer))))
-       ;; stderr.
-       (cond
-        ((stringp (cadr destination))
-         (setcar (cdr destination) (expand-file-name (cadr destination)))
-         (if (tramp-equal-remote default-directory (cadr destination))
-             ;; stderr is on the same remote host.
-             (setq stderr (tramp-unquote-file-local-name (cadr destination)))
-           ;; stderr must be copied to remote host.  The temporary
-           ;; file must be deleted after execution.
-           (setq stderr (tramp-make-tramp-temp-file v)
-                 tmpstderr (tramp-make-tramp-file-name v stderr))))
-        ;; stderr to be discarded.
-        ((null (cadr destination))
-         (setq stderr (tramp-get-remote-null-device v)))))
-       ;; 't
-       (destination
-       (setq outbuf (current-buffer))))
       (when stderr (setq command (format "%s 2>%s" command stderr)))
 
       ;; Send the command.  It might not return in time, so we protect
@@ -819,21 +767,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
       ;; since Emacs 28.1.
       (when (and (bound-and-true-p process-file-return-signal-string)
                 (natnump ret) (> ret 128))
-       (setq ret (nth (- ret 128) (tramp-adb-get-signal-strings v))))
-
-      ;; Provide error file.
-      (when tmpstderr (rename-file tmpstderr (cadr destination) t))
-
-      ;; Cleanup.  We remove all file cache values for the connection,
-      ;; because the remote process could have changed them.
-      (when tmpinput (delete-file tmpinput))
-      (when process-file-side-effects
-        (tramp-flush-directory-properties v "/"))
-
-      ;; Return exit status.
-      (if (equal ret -1)
-         (keyboard-quit)
-       ret))))
+       (setq ret (nth (- ret 128) (tramp-adb-get-signal-strings v))))))
 
 ;; We use BUFFER also as connection buffer during setup.  Because of
 ;; this, its original contents must be saved, and restored once
@@ -868,20 +802,12 @@ will be used."
             (tramp-process-connection-type
              (or (null program) tramp-process-connection-type))
             (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
-            (name1 name)
-            (i 0)
             p)
 
        (when (string-match-p (rx multibyte) command)
          (tramp-error
           v 'file-error "Cannot apply multibyte command `%s'" command))
 
-       (while (get-process name1)
-         ;; NAME must be unique as process name.
-         (setq i (1+ i)
-               name1 (format "%s<%d>" name i)))
-       (setq name name1)
-
        (with-tramp-saved-connection-properties
            v '("process-name" "process-buffer")
          ;; Set the new process properties.
index 4acc2fc8de9d1d87d368656c0b07eda8999c9bd4..58886392dda317000f8e177b2b00050c2a052c6a 100644 (file)
@@ -2590,10 +2590,6 @@ The method used must be an out-of-band method."
                      (tramp-get-connection-name v)
                      (tramp-get-connection-buffer v)
                      copy-program copy-args)))
-               ;; This is needed for ssh or PuTTY based processes,
-               ;; and only if the respective options are set.
-               ;; Perhaps, the setting could be more fine-grained.
-               ;; (process-put p 'tramp-shared-socket t)
                (tramp-post-process-creation p v)
 
                ;; We must adapt `tramp-local-end-of-line' for sending
@@ -3049,8 +3045,6 @@ will be used."
             (tramp-process-connection-type
              (or (null program) tramp-process-connection-type))
             (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
-            (name1 name)
-            (i 0)
             ;; We do not want to raise an error when `make-process'
             ;; has been started several times in `eshell' and
             ;; friends.
@@ -3079,12 +3073,6 @@ will be used."
           :sentinel #'ignore
           :file-handler t))
 
-       (while (get-process name1)
-         ;; NAME must be unique as process name.
-         (setq i (1+ i)
-               name1 (format "%s<%d>" name i)))
-       (setq name name1)
-
        (with-tramp-saved-connection-properties
            v '("process-name"  "process-buffer")
          ;; Set the new process properties.
@@ -3256,12 +3244,8 @@ will be used."
 (defun tramp-sh-handle-process-file
   (program &optional infile destination display &rest args)
   "Like `process-file' for Tramp files."
-  ;; The implementation is not complete yet.
-  (when (and (numberp destination) (zerop destination))
-    (error "Implementation does not handle immediate return"))
-
-  (with-parsed-tramp-file-name (expand-file-name default-directory) nil
-    (let (command env uenv input tmpinput stderr tmpstderr outbuf ret)
+  (tramp-skeleton-process-file program infile destination display args
+    (let (env uenv)
       ;; Compute command.
       (setq command (mapconcat #'tramp-shell-quote-argument
                               (cons program args) " "))
@@ -3282,54 +3266,7 @@ will be used."
               (format
                "unset %s && %s"
                (mapconcat #'tramp-shell-quote-argument uenv " ") command)))
-      ;; Determine input.
-      (if (null infile)
-         (setq input (tramp-get-remote-null-device v))
-       (setq infile (file-name-unquote (expand-file-name infile)))
-       (if (tramp-equal-remote default-directory infile)
-           ;; INFILE is on the same remote host.
-           (setq input (tramp-unquote-file-local-name infile))
-         ;; INFILE must be copied to remote host.
-         (setq input (tramp-make-tramp-temp-file v)
-               tmpinput (tramp-make-tramp-file-name v input))
-         (copy-file infile tmpinput t)))
       (when input (setq command (format "%s <%s" command input)))
-
-      ;; Determine output.
-      (cond
-       ;; Just a buffer.
-       ((bufferp destination)
-       (setq outbuf destination))
-       ;; A buffer name.
-       ((stringp destination)
-       (setq outbuf (get-buffer-create destination)))
-       ;; (REAL-DESTINATION ERROR-DESTINATION)
-       ((consp destination)
-       ;; output.
-       (cond
-        ((bufferp (car destination))
-         (setq outbuf (car destination)))
-        ((stringp (car destination))
-         (setq outbuf (get-buffer-create (car destination))))
-        ((car destination)
-         (setq outbuf (current-buffer))))
-       ;; stderr.
-       (cond
-        ((stringp (cadr destination))
-         (setcar (cdr destination) (expand-file-name (cadr destination)))
-         (if (tramp-equal-remote default-directory (cadr destination))
-             ;; stderr is on the same remote host.
-             (setq stderr (tramp-unquote-file-local-name (cadr destination)))
-           ;; stderr must be copied to remote host.  The temporary
-           ;; file must be deleted after execution.
-           (setq stderr (tramp-make-tramp-temp-file v)
-                 tmpstderr (tramp-make-tramp-file-name v stderr))))
-        ;; stderr to be discarded.
-        ((null (cadr destination))
-         (setq stderr (tramp-get-remote-null-device v)))))
-       ;; 't
-       (destination
-       (setq outbuf (current-buffer))))
       (when stderr (setq command (format "%s 2>%s" command stderr)))
 
       ;; Send the command.  It might not return in time, so we protect
@@ -3364,21 +3301,7 @@ will be used."
       ;; since Emacs 28.1.
       (when (and (bound-and-true-p process-file-return-signal-string)
                 (natnump ret) (>= ret 128))
-       (setq ret (nth (- ret 128) (tramp-sh-get-signal-strings v))))
-
-      ;; Provide error file.
-      (when tmpstderr (rename-file tmpstderr (cadr destination) t))
-
-      ;; Cleanup.  We remove all file cache values for the connection,
-      ;; because the remote process could have changed them.
-      (when tmpinput (delete-file tmpinput))
-      (when process-file-side-effects
-        (tramp-flush-directory-properties v "/"))
-
-      ;; Return exit status.
-      (if (equal ret -1)
-         (keyboard-quit)
-       ret))))
+       (setq ret (nth (- ret 128) (tramp-sh-get-signal-strings v)))))))
 
 (defun tramp-sh-handle-exec-path ()
   "Like `exec-path' for Tramp files."
@@ -3890,10 +3813,6 @@ Fall back to normal file name handler if no Tramp handler exists."
           v 'file-notify-error
           "`%s' failed to start on remote host"
           (string-join sequence " "))
-       ;; This is needed for ssh or PuTTY based processes, and only if
-       ;; the respective options are set.  Perhaps, the setting could
-       ;; be more fine-grained.
-       ;; (process-put p 'tramp-shared-socket t)
        ;; Needed for process filter.
        (process-put p 'tramp-events events)
        (process-put p 'tramp-watch-name localname)
@@ -5266,10 +5185,6 @@ connection if a previous connection has died for some reason."
                            (and tramp-encoding-command-interactive
                                 `(,tramp-encoding-command-interactive)))))))
 
-               ;; This is needed for ssh or PuTTY based processes,
-               ;; and only if the respective options are set.
-               ;; Perhaps, the setting could be more fine-grained.
-               ;; (process-put p 'tramp-shared-socket t)
                ;; Set sentinel.  Initialize variables.
                (set-process-sentinel p #'tramp-process-sentinel)
                (tramp-post-process-creation p vec)
index 218cf30dea5154e19a6758c2df91235bc536a220..c75796d3b36da2a230f757dd089049cb99b5af8c 100644 (file)
@@ -250,96 +250,34 @@ arguments to pass to the OPERATION."
 (defun tramp-sshfs-handle-process-file
   (program &optional infile destination display &rest args)
   "Like `process-file' for Tramp files."
-  ;; The implementation is not complete yet.
-  (when (and (numberp destination) (zerop destination))
-    (error "Implementation does not handle immediate return"))
+  (tramp-skeleton-process-file program infile destination display args
+    (let ((coding-system-for-read 'utf-8-dos)) ; Is this correct?
 
-  (with-parsed-tramp-file-name (expand-file-name default-directory) nil
-    (let ((coding-system-for-read 'utf-8-dos) ; Is this correct?
-         (command
+      (setq command
           (format
            "cd %s && exec %s"
            (tramp-unquote-shell-quote-argument localname)
            (mapconcat #'tramp-shell-quote-argument (cons program args) " ")))
-         input tmpinput stderr tmpstderr outbuf)
-
-      ;; Determine input.
-      (if (null infile)
-         (setq input (tramp-get-remote-null-device v))
-       (setq infile (file-name-unquote (expand-file-name infile)))
-       (if (tramp-equal-remote default-directory infile)
-           ;; INFILE is on the same remote host.
-           (setq input (tramp-unquote-file-local-name infile))
-         ;; INFILE must be copied to remote host.
-         (setq input (tramp-make-tramp-temp-file v)
-               tmpinput (tramp-make-tramp-file-name v input))
-         (copy-file infile tmpinput t)))
       (when input (setq command (format "%s <%s" command input)))
-
-      ;; Determine output.
-      (cond
-       ;; Just a buffer.
-       ((bufferp destination)
-       (setq outbuf destination))
-       ;; A buffer name.
-       ((stringp destination)
-       (setq outbuf (get-buffer-create destination)))
-       ;; (REAL-DESTINATION ERROR-DESTINATION)
-       ((consp destination)
-       ;; output.
-       (cond
-        ((bufferp (car destination))
-         (setq outbuf (car destination)))
-        ((stringp (car destination))
-         (setq outbuf (get-buffer-create (car destination))))
-        ((car destination)
-         (setq outbuf (current-buffer))))
-       ;; stderr.
-       (cond
-        ((stringp (cadr destination))
-         (setcar (cdr destination) (expand-file-name (cadr destination)))
-         (if (tramp-equal-remote default-directory (cadr destination))
-             ;; stderr is on the same remote host.
-             (setq stderr (tramp-unquote-file-local-name (cadr destination)))
-           ;; stderr must be copied to remote host.  The temporary
-           ;; file must be deleted after execution.
-           (setq stderr (tramp-make-tramp-temp-file v)
-                 tmpstderr (tramp-make-tramp-file-name v stderr))))
-        ;; stderr to be discarded.
-        ((null (cadr destination))
-         (setq stderr (tramp-get-remote-null-device v)))))
-       ;; 't
-       (destination
-       (setq outbuf (current-buffer))))
       (when stderr (setq command (format "%s 2>%s" command stderr)))
 
       (unwind-protect
-         (apply
-          #'tramp-call-process
-          v (tramp-get-method-parameter v 'tramp-login-program)
-          nil outbuf display
-          (tramp-expand-args
-           v 'tramp-login-args nil
-           ?h (or (tramp-file-name-host v) "")
-           ?u (or (tramp-file-name-user v) "")
-           ?p (or (tramp-file-name-port v) "")
-            ?a "-t" ?l command))
+         (setq ret
+               (apply
+                #'tramp-call-process
+                v (tramp-get-method-parameter v 'tramp-login-program)
+                nil outbuf display
+                (tramp-expand-args
+                 v 'tramp-login-args nil
+                 ?h (or (tramp-file-name-host v) "")
+                 ?u (or (tramp-file-name-user v) "")
+                 ?p (or (tramp-file-name-port v) "")
+                 ?a "-t" ?l command)))
 
        ;; Synchronize stderr.
        (when tmpstderr
          (tramp-cleanup-connection v 'keep-debug 'keep-password)
-         (tramp-fuse-unmount v))
-
-       ;; Provide error file.
-       (when tmpstderr
-         (rename-file tmpstderr (cadr destination) t))
-
-       ;; Cleanup.  We remove all file cache values for the
-       ;; connection, because the remote process could have changed
-       ;; them.
-       (when tmpinput (delete-file tmpinput))
-       (when process-file-side-effects
-          (tramp-flush-directory-properties v "/"))))))
+         (tramp-fuse-unmount v))))))
 
 (defun tramp-sshfs-handle-rename-file
     (filename newname &optional ok-if-already-exists)
index a65fd45dd9d7693d1dd51abf86abe4c86f259a91..fb49e57f78160b2b1627f8518bad0254f14d101b 100644 (file)
@@ -1961,6 +1961,16 @@ from the default one."
   (or (tramp-get-connection-property vec "process-name")
       (tramp-buffer-name vec)))
 
+(defun tramp-get-unique-process-name (name)
+  "Return a unique process name, based on NAME."
+  (let ((name1 name)
+       (i 0))
+    (while (get-process name1)
+      ;; NAME must be unique as process name.
+      (setq i (1+ i)
+           name1 (format "%s<%d>" name i)))
+    name1))
+
 (defun tramp-get-process (vec-or-proc)
   "Get the default connection process to be used for VEC-OR-PROC.
 Return `tramp-cache-undefined' in case it doesn't exist."
@@ -3558,6 +3568,7 @@ that a stederr file is supported.  BODY is the backend specific code."
           (signal 'file-error (list "Wrong stderr" stderr)))
 
         (let ((default-directory tramp-compat-temporary-file-directory)
+              (name (tramp-get-unique-process-name name))
               (buffer
                (if buffer
                    (get-buffer-create buffer)
@@ -3610,6 +3621,82 @@ on the same host.  Otherwise, TARGET is quoted."
 
        ,@body)))
 
+(defmacro tramp-skeleton-process-file
+    (_program &optional infile destination _display _args &rest body)
+  "Skeleton for `tramp-*-handle-process-file'.
+BODY is the backend specific code."
+  (declare (indent 5) (debug t))
+  `(with-parsed-tramp-file-name (expand-file-name default-directory) nil
+     ;; The implementation is not complete yet.
+     (when (and (numberp ,destination) (zerop ,destination))
+       (tramp-error
+       v 'file-error "Implementation does not handle immediate return"))
+
+     (let (command input tmpinput stderr tmpstderr outbuf ret)
+       ;; Determine input.
+       (if (null ,infile)
+          (setq input (tramp-get-remote-null-device v))
+        (setq ,infile (file-name-unquote (expand-file-name ,infile)))
+        (if (tramp-equal-remote default-directory ,infile)
+            ;; INFILE is on the same remote host.
+            (setq input (tramp-unquote-file-local-name ,infile))
+          ;; ,INFILE must be copied to remote host.
+          (setq input (tramp-make-tramp-temp-file v)
+                tmpinput (tramp-make-tramp-file-name v input))
+          (copy-file ,infile tmpinput t)))
+
+       ;; Determine output.
+       (cond
+       ;; Just a buffer.
+       ((bufferp ,destination)
+        (setq outbuf ,destination))
+       ;; A buffer name.
+       ((stringp ,destination)
+        (setq outbuf (get-buffer-create ,destination)))
+       ;; (REAL-,DESTINATION ERROR-,DESTINATION)
+       ((consp ,destination)
+        ;; output.
+        (cond
+         ((bufferp (car ,destination))
+          (setq outbuf (car ,destination)))
+         ((stringp (car ,destination))
+          (setq outbuf (get-buffer-create (car ,destination))))
+         ((car ,destination)
+          (setq outbuf (current-buffer))))
+        ;; stderr.
+        (cond
+         ((stringp (cadr ,destination))
+          (setcar (cdr ,destination) (expand-file-name (cadr ,destination)))
+          (if (tramp-equal-remote default-directory (cadr ,destination))
+              ;; stderr is on the same remote host.
+              (setq stderr (tramp-unquote-file-local-name (cadr ,destination)))
+            ;; stderr must be copied to remote host.  The temporary
+            ;; file must be deleted after execution.
+            (setq stderr (tramp-make-tramp-temp-file v)
+                  tmpstderr (tramp-make-tramp-file-name v stderr))))
+         ;; stderr to be discarded.
+         ((null (cadr ,destination))
+          (setq stderr (tramp-get-remote-null-device v)))))
+       ;; t
+       (,destination
+       (setq outbuf (current-buffer))))
+
+       ,@body
+
+       ;; Provide error file.
+       (when tmpstderr (rename-file tmpstderr (cadr ,destination) t))
+
+       ;; Cleanup.  We remove all file cache values for the connection,
+       ;; because the remote process could have changed them.
+       (when tmpinput (delete-file tmpinput))
+       (when process-file-side-effects
+         (tramp-flush-directory-properties v "/"))
+
+       ;; Return exit status.
+       (if (equal ret -1)
+          (keyboard-quit)
+        ret))))
+
 (defcustom tramp-inhibit-errors-if-setting-file-attributes-fail nil
   "Whether to warn only if `tramp-*-set-file-{modes,times,uid-gid}' fails."
   :version "30.1"
@@ -5055,10 +5142,6 @@ should be set connection-local.")
       ;; Query flag is overwritten in `tramp-post-process-creation',
       ;; so we reset it.
       (set-process-query-on-exit-flag p (null noquery))
-      ;; This is needed for ssh or PuTTY based processes, and only if
-      ;; the respective options are set.  Perhaps, the setting could
-      ;; be more fine-grained.
-      ;; (process-put p 'tramp-shared-socket t)
       (process-put p 'remote-command orig-command)
       (tramp-set-connection-property p "remote-command" orig-command)
       (when (bufferp stderr)
@@ -6926,18 +7009,13 @@ If VEC is `tramp-null-hop', return local null device."
 ;;   <https://www.mail-archive.com/tramp-devel@nongnu.org/msg01041.html>.
 ;;   (Bug#6850)
 ;;
-;; * Refactor code from different handlers.  Start with
-;;   *-process-file.  One idea is to generalize `tramp-send-command'
-;;   and friends, for most of the handlers this is the major
-;;   difference between the different backends.  Other handlers but
-;;   *-process-file would profit from this as well.
-;;
 ;; * Implement file name abbreviation for a different user.  That is,
 ;;   (abbreviate-file-name "/ssh:user1@host:/home/user2") =>
 ;;   "/ssh:user1@host:~user2".
 ;;
 ;; * Implement file name abbreviation for user and host names.
 ;;
-;; * Implement user and host name completion for multi-hops.
+;; * Implement user and host name completion for multi-hops.  Some
+;;   methods in tramp-container.el have it already.
 
 ;;; tramp.el ends here