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
---
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