From: Michael Albinus <michael.albinus@gmx.de>
To: Neal Becker <ndbecker2@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: tramp: remote-to-remote hangs
Date: Thu, 30 Jul 2009 06:46:17 +0200 [thread overview]
Message-ID: <87my6mwzfq.fsf@gmx.de> (raw)
In-Reply-To: <h4phh9$nqm$1@ger.gmane.org> (Neal Becker's message of "Wed, 29 Jul 2009 09:06:49 -0400")
[-- Attachment #1: Type: text/plain, Size: 259 bytes --]
Neal Becker <ndbecker2@gmail.com> writes:
> Where could I grab said fix (I'm using 23.0.96,1, not cvs)
Enclosed is the patch I have applied to the trunk. Maybe you can apply
it to your version; it shall differ only in line numbers.
Best regards, Michael.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 10860 bytes --]
*** /tmp/ediff3455tBf 2009-07-30 06:41:36.000000000 +0200
--- /tmp/ediff34556Ll 2009-07-30 06:41:36.000000000 +0200
***************
*** 3118,3123 ****
--- 3118,3126 ----
(tramp-error
v 'file-already-exists "File %s already exists" newname)))
+ (with-parsed-tramp-file-name (if t1 filename newname) nil
+ (tramp-message v 0 "Transferring %s to %s..." filename newname))
+
(prog1
(cond
;; Both are Tramp files.
***************
*** 3133,3145 ****
op filename newname
ok-if-already-exists keep-date preserve-uid-gid))
! ;; If both source and target are Tramp files,
! ;; both are using the same copy-program, then we
! ;; can invoke rcp directly. Note that
! ;; default-directory should point to a local
! ;; directory if we want to invoke rcp.
! ((and (equal v1-method v2-method)
! (tramp-method-out-of-band-p v1)
(> (nth 7 (file-attributes filename))
tramp-copy-size-limit))
(tramp-do-copy-or-rename-file-out-of-band
--- 3136,3143 ----
op filename newname
ok-if-already-exists keep-date preserve-uid-gid))
! ;; Try out-of-band operation.
! ((and (tramp-method-out-of-band-p v1)
(> (nth 7 (file-attributes filename))
tramp-copy-size-limit))
(tramp-do-copy-or-rename-file-out-of-band
***************
*** 3192,3198 ****
;; When newname did exist, we have wrong cached values.
(when t2
(with-parsed-tramp-file-name newname nil
! (tramp-flush-file-property v localname))))))
(defun tramp-do-copy-or-rename-file-via-buffer (op filename newname keep-date)
"Use an Emacs buffer to copy or rename a file.
--- 3190,3199 ----
;; When newname did exist, we have wrong cached values.
(when t2
(with-parsed-tramp-file-name newname nil
! (tramp-flush-file-property v localname)))
!
! (with-parsed-tramp-file-name (if t1 filename newname) nil
! (tramp-message v 0 "Transferring %s to %s...done" filename newname)))))
(defun tramp-do-copy-or-rename-file-via-buffer (op filename newname keep-date)
"Use an Emacs buffer to copy or rename a file.
***************
*** 3376,3481 ****
(defun tramp-do-copy-or-rename-file-out-of-band (op filename newname keep-date)
"Invoke rcp program to copy.
! One of FILENAME and NEWNAME must be a Tramp name, the other must
! be a local filename. The method used must be an out-of-band method."
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
copy-program copy-args copy-keep-date port spec
source target)
(with-parsed-tramp-file-name (if t1 filename newname) nil
! ;; Expand hops. Might be necessary for gateway methods.
! (setq v (car (tramp-compute-multi-hops v)))
! (aset v 3 localname)
!
! ;; Check which ones of source and target are Tramp files.
! (setq source (if t1 (tramp-make-copy-program-file-name v) filename)
! target (if t2 (tramp-make-copy-program-file-name v) newname))
!
! ;; Check for port number. Until now, there's no need for handling
! ;; like method, user, host.
! (setq host (tramp-file-name-real-host v)
! port (tramp-file-name-port v)
! port (or (and port (number-to-string port)) ""))
!
! ;; Compose copy command.
! (setq spec `((?h . ,host) (?u . ,user) (?p . ,port)
! (?t . ,(tramp-get-connection-property
! (tramp-get-connection-process v) "temp-file" ""))
! (?k . ,(if keep-date " " "")))
! copy-program (tramp-get-method-parameter
! method 'tramp-copy-program)
! copy-keep-date (tramp-get-method-parameter
! method 'tramp-copy-keep-date)
! copy-args
! (delq
! nil
! (mapcar
! '(lambda (x)
! (setq
! ;; " " is indication for keep-date argument.
! x (delete " " (mapcar '(lambda (y) (format-spec y spec)) x)))
! (unless (member "" x) (mapconcat 'identity x " ")))
! (tramp-get-method-parameter method 'tramp-copy-args))))
!
! ;; Check for program.
! (when (and (fboundp 'executable-find)
! (not (let ((default-directory
! (tramp-compat-temporary-file-directory)))
! (executable-find copy-program))))
! (tramp-error
! v 'file-error "Cannot find copy program: %s" copy-program))
!
! (tramp-message v 0 "Transferring %s to %s..." filename newname)
! (unwind-protect
! (with-temp-buffer
! ;; The default directory must be remote.
! (let ((default-directory
! (file-name-directory (if t1 filename newname))))
! ;; Set the transfer process properties.
! (tramp-set-connection-property
! v "process-name" (buffer-name (current-buffer)))
! (tramp-set-connection-property
! v "process-buffer" (current-buffer))
!
! ;; Use an asynchronous process. By this, password can
! ;; be handled. The default directory must be local, in
! ;; order to apply the correct `copy-program'. We don't
! ;; set a timeout, because the copying of large files can
! ;; last longer than 60 secs.
! (let ((p (let ((default-directory
! (tramp-compat-temporary-file-directory)))
! (apply 'start-process
! (tramp-get-connection-property
! v "process-name" nil)
! (tramp-get-connection-property
! v "process-buffer" nil)
! copy-program
! (append copy-args (list source target))))))
! (tramp-message
! v 6 "%s" (mapconcat 'identity (process-command p) " "))
! (tramp-set-process-query-on-exit-flag p nil)
! (tramp-process-actions p v tramp-actions-copy-out-of-band))))
!
! ;; Reset the transfer process properties.
! (tramp-set-connection-property v "process-name" nil)
! (tramp-set-connection-property v "process-buffer" nil))
!
! (tramp-message v 0 "Transferring %s to %s...done" filename newname)
!
! ;; Handle KEEP-DATE argument.
! (when (and keep-date (not copy-keep-date))
! (set-file-times newname (nth 5 (file-attributes filename))))
!
! ;; Set the mode.
! (unless (and keep-date copy-keep-date)
! (set-file-modes newname (tramp-default-file-modes filename))))
!
! ;; If the operation was `rename', delete the original file.
! (unless (eq op 'copy)
! (delete-file filename))))
(defun tramp-handle-make-directory (dir &optional parents)
"Like `make-directory' for Tramp files."
--- 3377,3493 ----
(defun tramp-do-copy-or-rename-file-out-of-band (op filename newname keep-date)
"Invoke rcp program to copy.
! The method used must be an out-of-band method."
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
copy-program copy-args copy-keep-date port spec
source target)
(with-parsed-tramp-file-name (if t1 filename newname) nil
+ (if (and t1 t2)
! ;; Both are Tramp files. We shall optimize it, when the
! ;; methods for filename and newname are the same.
! (let ((tmpfile (tramp-compat-make-temp-file localname)))
! (unwind-protect
! (progn
! (tramp-do-copy-or-rename-file-out-of-band
! op filename tmpfile keep-date)
! (tramp-do-copy-or-rename-file-out-of-band
! 'rename tmpfile newname keep-date))
! ;; Save exit.
! (condition-case nil
! (delete-file tmpfile)
! (error))))
!
! ;; Expand hops. Might be necessary for gateway methods.
! (setq v (car (tramp-compute-multi-hops v)))
! (aset v 3 localname)
!
! ;; Check which ones of source and target are Tramp files.
! (setq source (if t1 (tramp-make-copy-program-file-name v) filename)
! target (if t2 (tramp-make-copy-program-file-name v) newname))
!
! ;; Check for port number. Until now, there's no need for handling
! ;; like method, user, host.
! (setq host (tramp-file-name-real-host v)
! port (tramp-file-name-port v)
! port (or (and port (number-to-string port)) ""))
!
! ;; Compose copy command.
! (setq spec `((?h . ,host) (?u . ,user) (?p . ,port)
! (?t . ,(tramp-get-connection-property
! (tramp-get-connection-process v) "temp-file" ""))
! (?k . ,(if keep-date " " "")))
! copy-program (tramp-get-method-parameter
! method 'tramp-copy-program)
! copy-keep-date (tramp-get-method-parameter
! method 'tramp-copy-keep-date)
! copy-args
! (delq
! nil
! (mapcar
! '(lambda (x)
! (setq
! x
! ;; " " is indication for keep-date argument.
! (delete " " (mapcar '(lambda (y) (format-spec y spec)) x)))
! (unless (member "" x) (mapconcat 'identity x " ")))
! (tramp-get-method-parameter method 'tramp-copy-args))))
!
! ;; Check for program.
! (when (and (fboundp 'executable-find)
! (not (let ((default-directory
! (tramp-compat-temporary-file-directory)))
! (executable-find copy-program))))
! (tramp-error
! v 'file-error "Cannot find copy program: %s" copy-program))
! (unwind-protect
! (with-temp-buffer
! ;; The default directory must be remote.
! (let ((default-directory
! (file-name-directory (if t1 filename newname))))
! ;; Set the transfer process properties.
! (tramp-set-connection-property
! v "process-name" (buffer-name (current-buffer)))
! (tramp-set-connection-property
! v "process-buffer" (current-buffer))
!
! ;; Use an asynchronous process. By this, password can
! ;; be handled. The default directory must be local, in
! ;; order to apply the correct `copy-program'. We don't
! ;; set a timeout, because the copying of large files can
! ;; last longer than 60 secs.
! (let ((p (let ((default-directory
! (tramp-compat-temporary-file-directory)))
! (apply 'start-process
! (tramp-get-connection-property
! v "process-name" nil)
! (tramp-get-connection-property
! v "process-buffer" nil)
! copy-program
! (append copy-args (list source target))))))
! (tramp-message
! v 6 "%s" (mapconcat 'identity (process-command p) " "))
! (tramp-set-process-query-on-exit-flag p nil)
! (tramp-process-actions p v tramp-actions-copy-out-of-band))))
!
! ;; Reset the transfer process properties.
! (tramp-set-connection-property v "process-name" nil)
! (tramp-set-connection-property v "process-buffer" nil))
!
! ;; Handle KEEP-DATE argument.
! (when (and keep-date (not copy-keep-date))
! (set-file-times newname (nth 5 (file-attributes filename))))
!
! ;; Set the mode.
! (unless (and keep-date copy-keep-date)
! (set-file-modes newname (tramp-default-file-modes filename))))
!
! ;; If the operation was `rename', delete the original file.
! (unless (eq op 'copy)
! (delete-file filename)))))
(defun tramp-handle-make-directory (dir &optional parents)
"Like `make-directory' for Tramp files."
prev parent reply other threads:[~2009-07-30 4:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-28 14:10 tramp: remote-to-remote hangs Neal Becker
2009-07-28 14:37 ` Michael Albinus
2009-07-28 14:58 ` Neal Becker
2009-07-28 20:41 ` Michael Albinus
2009-07-29 13:06 ` Neal Becker
2009-07-30 4:46 ` Michael Albinus [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87my6mwzfq.fsf@gmx.de \
--to=michael.albinus@gmx.de \
--cc=emacs-devel@gnu.org \
--cc=ndbecker2@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).