With this patch, it is possible to work on remote filesystems which
were made accessible by tramp.

For example, 'M-x git-status /remote-host:/repository' will show the
status of /repository on 'remote-host' and usual operations like add
or commit are supported there.

First part of the is patch is trivial and replaces 'call-process' with
the network transparent 'process-file'.

The second one is more extensive and implements a tramp wrapper for
'call-process-region'.

Signed-off-by: Enrico Scholz <enrico.sch...@sigma-chemnitz.de>
---
 contrib/emacs/git.el | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
index 5ffc506..3d9d691 100644
--- a/contrib/emacs/git.el
+++ b/contrib/emacs/git.el
@@ -190,8 +190,8 @@ if there is already one that displays the same directory."
   (mapcar (lambda (entry) (concat (car entry) "=" (cdr entry))) env))
 
 (defun git-call-process (buffer &rest args)
-  "Wrapper for call-process that sets environment strings."
-  (apply #'call-process "git" nil buffer nil args))
+  "Wrapper for process-file that sets environment strings."
+  (apply #'process-file "git" nil buffer nil args))
 
 (defun git-call-process-display-error (&rest args)
   "Wrapper for call-process that displays error messages."
@@ -221,14 +221,34 @@ the process output as a string, or nil if the git command 
failed."
       (display-message-or-buffer (current-buffer))
       nil)))
 
+(defun git-tramp-call-process-region (start end program
+                                            &optional delete buffer display
+                                            &rest args)
+  "call-process-region variant for tramp"
+  (let ((tmpfile (tramp-compat-make-temp-file "")))
+    (unwind-protect
+        (progn
+          (write-region start end tmpfile)
+          (when delete (delete-region start end))
+          (apply #'process-file program tmpfile buffer display args))
+      (delete-file tmpfile))))
+
 (defun git-run-process-region (buffer start end program args)
   "Run a git process with a buffer region as input."
-  (let ((output-buffer (current-buffer))
-        (dir default-directory))
+  (let ((dir default-directory)
+        (fh (find-file-name-handler default-directory 'call-process-region))
+        (fnargs (apply 'list start end program
+                       nil (list (current-buffer) t) nil args)))
     (with-current-buffer buffer
       (cd dir)
-      (apply #'call-process-region start end program
-             nil (list output-buffer t) nil args))))
+      (case fh
+        ;; special handling for tramp
+        (tramp-file-name-handler
+         (apply #'git-tramp-call-process-region fnargs))
+        ;; the default (local-file) handler
+        ((nil) (apply #'call-process-region fnargs))
+        ;; else, when there is a handler, call it
+        (t (apply fh #'call-process-region fnargs))))))
 
 (defun git-run-command-buffer (buffer-name &rest args)
   "Run a git command, sending the output to a buffer named BUFFER-NAME."
-- 
2.9.5

Reply via email to