2004-05-07 Kai Grossjohann <kai@emptydomain.de>

Version 2.0.40 of Tramp released.

	* net/tramp.el (tramp-completion-mode, tramp-md5-function): Use
	symbol-function to invoke functions only known on some Emacs
	flavors.  This avoids byte-compiler warnings.  Reported by Kevin
	Scaldeferri <kevin@scaldeferri.com>.
	(tramp-do-copy-or-rename-file-via-buffer): Renamed from
	tramp-do-copy-or-rename-via-buffer (without `file'), to make it
	consistent with the other tramp-do-* functions.
	(tramp-do-copy-or-rename-file): Calls adjusted.
	(tramp-process-initial-commands): Avoid liveness check on shell --
	we know that it must be alive since we're opening a connection at
	this moment.
	(tramp-last-cmd): New internal variable.
	(tramp-process-echoes): New tunable.
	(tramp-send-command): Set tramp-last-cmd.
	(tramp-wait-for-output): Delete echo, if applicable.
	(tramp-read-passwd): Construct the key for the password cache in a
	way that works for multi methods, too.
	(tramp-bug): Add backup-directory-alist and
	bkup-backup-directory-info to bug reports, with Tramp
	counterparts.

2004-05-01  Michael Albinus  <michael.albinus@gmx.de>

	* net/tramp*.el: Suppress byte-compiler warnings where possible.

	* net/tramp.el (tramp-out-of-band-prompt-regexp)
	(tramp-actions-copy-out-of-band): New defcustoms.
	(tramp-do-copy-or-rename-file-out-of-band): Asynchronous process
	used instead of a synchronous one.  Allows password entering.
	(tramp-action-out-of-band): New defun.
	(tramp-open-connection-rsh, tramp-method-out-of-band-p): Remove
	restriction with password from doc string.
	(tramp-bug): Add variables `tramp-terminal-prompt-regexp',
	`tramp-out-of-band-prompt-regexp',
	`tramp-actions-copy-out-of-band', `password-cache' and
	`password-cache-expiry'.
	(toplevel): Remove todo item wrt ssh-agent.  Obsolete due to
	password caching.
	(tramp-touch): FILE can be a local file, too.
	(TODO): Remove items done.
	(tramp-handle-insert-directory): Properly quote file name also if
	not full-directory-p.  Handle wildcard case.  Reported by Andreas
	Schwab <schwab@suse.de>.
	(tramp-do-copy-or-rename-file-via-buffer): Set permissions of the
	new file.
	(tramp-handle-file-local-copy, tramp-handle-write-region): The
	permissions of the temporary file are set if filename exists.
	Reported by Ted Stern <stern@cray.com>.
	(tramp-backup-directory-alist)
	(tramp-bkup-backup-directory-info): New defcustoms.
	(tramp-file-name-handler-alist): Add entry for
	`find-backup-file-name'.
	(tramp-handle-find-backup-file-name): New function.  Implements
	Tramp's find-backup-file-name.

	* net/tramp-smb.el (tramp-smb-file-name-handler-alist): Add entry
	for `find-backup-file-name'.

	* net/tramp-vc.el (tramp-vc-workfile-unchanged-p): Correct typo
	("file" -> "filename").  Reported by Kim F. Storm <storm@cua.dk>.
This commit is contained in:
Kai Großjohann 2004-05-07 21:20:10 +00:00
parent 9bcabb45f7
commit 38c65fca8d
4 changed files with 373 additions and 110 deletions

View file

@ -1,3 +1,68 @@
2004-05-07 Kai Grossjohann <kai@emptydomain.de>
Version 2.0.40 of Tramp released.
* net/tramp.el (tramp-completion-mode, tramp-md5-function): Use
symbol-function to invoke functions only known on some Emacs
flavors. This avoids byte-compiler warnings. Reported by Kevin
Scaldeferri <kevin@scaldeferri.com>.
(tramp-do-copy-or-rename-file-via-buffer): Renamed from
tramp-do-copy-or-rename-via-buffer (without `file'), to make it
consistent with the other tramp-do-* functions.
(tramp-do-copy-or-rename-file): Calls adjusted.
(tramp-process-initial-commands): Avoid liveness check on shell --
we know that it must be alive since we're opening a connection at
this moment.
(tramp-last-cmd): New internal variable.
(tramp-process-echoes): New tunable.
(tramp-send-command): Set tramp-last-cmd.
(tramp-wait-for-output): Delete echo, if applicable.
(tramp-read-passwd): Construct the key for the password cache in a
way that works for multi methods, too.
(tramp-bug): Add backup-directory-alist and
bkup-backup-directory-info to bug reports, with Tramp
counterparts.
2004-05-01 Michael Albinus <michael.albinus@gmx.de>
* net/tramp*.el: Suppress byte-compiler warnings where possible.
* net/tramp.el (tramp-out-of-band-prompt-regexp)
(tramp-actions-copy-out-of-band): New defcustoms.
(tramp-do-copy-or-rename-file-out-of-band): Asynchronous process
used instead of a synchronous one. Allows password entering.
(tramp-action-out-of-band): New defun.
(tramp-open-connection-rsh, tramp-method-out-of-band-p): Remove
restriction with password from doc string.
(tramp-bug): Add variables `tramp-terminal-prompt-regexp',
`tramp-out-of-band-prompt-regexp',
`tramp-actions-copy-out-of-band', `password-cache' and
`password-cache-expiry'.
(toplevel): Remove todo item wrt ssh-agent. Obsolete due to
password caching.
(tramp-touch): FILE can be a local file, too.
(TODO): Remove items done.
(tramp-handle-insert-directory): Properly quote file name also if
not full-directory-p. Handle wildcard case. Reported by Andreas
Schwab <schwab@suse.de>.
(tramp-do-copy-or-rename-file-via-buffer): Set permissions of the
new file.
(tramp-handle-file-local-copy, tramp-handle-write-region): The
permissions of the temporary file are set if filename exists.
Reported by Ted Stern <stern@cray.com>.
(tramp-backup-directory-alist)
(tramp-bkup-backup-directory-info): New defcustoms.
(tramp-file-name-handler-alist): Add entry for
`find-backup-file-name'.
(tramp-handle-find-backup-file-name): New function. Implements
Tramp's find-backup-file-name.
* net/tramp-smb.el (tramp-smb-file-name-handler-alist): Add entry
for `find-backup-file-name'.
* net/tramp-vc.el (tramp-vc-workfile-unchanged-p): Correct typo
("file" -> "filename"). Reported by Kim F. Storm <storm@cua.dk>.
2004-05-07 Lars Hansen <larsh@math.ku.dk>
* desktop.el (desktop-buffer-mode-handlers): Fix docstring.

View file

@ -38,6 +38,19 @@
(or (>= emacs-major-version 20)
(load "cl-seq")))
;; Avoid byte-compiler warnings if the byte-compiler supports this.
;; Currently, XEmacs supports this.
(eval-when-compile
(when (fboundp 'byte-compiler-options)
(let (unused-vars) ; Pacify Emacs byte-compiler
(defalias 'warnings 'identity) ; Pacify Emacs byte-compiler
(byte-compiler-options (warnings (- unused-vars))))))
;; XEmacs byte-compiler raises warning abouts `last-coding-system-used'.
(eval-when-compile
(unless (boundp 'last-coding-system-used)
(defvar last-coding-system-used nil)))
;; Define SMB method ...
(defcustom tramp-smb-method "smb"
"*Method to connect SAMBA and M$ SMB servers."
@ -145,7 +158,7 @@ This variable is local to each buffer.")
(file-symlink-p . tramp-smb-not-handled)
;; `file-truename' performed by default handler
(file-writable-p . tramp-smb-handle-file-writable-p)
;; `find-backup-file-name' performed by default handler
(find-backup-file-name . tramp-handle-find-backup-file-name)
;; `find-file-noselect' performed by default handler
;; `get-file-buffer' performed by default handler
(insert-directory . tramp-smb-handle-insert-directory)

View file

@ -1,6 +1,6 @@
;;; tramp-vc.el --- Version control integration for TRAMP.el
;; Copyright (C) 2000 by Free Software Foundation, Inc.
;; Copyright (C) 2000, 2001, 2002, 2003, 2004 by Free Software Foundation, Inc.
;; Author: Daniel Pittman <daniel@danann.net>
;; Keywords: comm, processes
@ -38,6 +38,14 @@
(require 'vc-rcs))
(require 'tramp)
;; Avoid byte-compiler warnings if the byte-compiler supports this.
;; Currently, XEmacs supports this.
(eval-when-compile
(when (fboundp 'byte-compiler-options)
(let (unused-vars) ; Pacify Emacs byte-compiler
(defalias 'warnings 'identity) ; Pacify Emacs byte-compiler
(byte-compiler-options (warnings (- unused-vars))))))
;; -- vc --
;; This used to blow away the file-name-handler-alist and reinstall
@ -163,7 +171,9 @@ Since TRAMP doesn't do async commands yet, this function doesn't, either."
(if vc-command-messages
(message "Running %s on %s..." command file))
(save-current-buffer
(unless (eq buffer t) (vc-setup-buffer buffer))
(unless (eq buffer t)
; Pacify byte-compiler
(funcall (symbol-function 'vc-setup-buffer) buffer))
(let ((squeezed nil)
(inhibit-read-only t)
(status 0))
@ -192,7 +202,8 @@ Since TRAMP doesn't do async commands yet, this function doesn't, either."
(if (integerp status) (format "status %d" status) status))))
(if vc-command-messages
(message "Running %s...OK" command))
(vc-exec-after
; Pacify byte-compiler
(funcall (symbol-function 'vc-exec-after)
`(run-hook-with-args
'vc-post-command-functions ',command ',localname ',flags))
status))))
@ -325,7 +336,8 @@ Since TRAMP doesn't do async commands yet, this function doesn't, either."
(not want-differences-if-changed))))
(zerop status))
;; New VC. Call `vc-default-workfile-unchanged-p'.
(vc-default-workfile-unchanged-p (vc-backend file) filename)))
(funcall (symbol-function 'vc-default-workfile-unchanged-p)
(vc-backend filename) filename)))
(defadvice vc-workfile-unchanged-p
(around tramp-advice-vc-workfile-unchanged-p
@ -391,12 +403,13 @@ filename we are thinking about..."
;; Pacify byte-compiler; this symbol is bound in the calling
;; function. CCC: Maybe it would be better to move the
;; boundness-checking into this function?
(let ((file (symbol-value 'file))
(let* ((file (symbol-value 'file))
(remote-uid
;; With Emacs 21.4, `file-attributes' has got an optional parameter
;; ID-FORMAT. Handle this case backwards compatible.
(if (and (functionp 'subr-arity)
(= 2 (cdr (subr-arity (symbol-function 'file-attributes)))))
(= 2 (cdr (funcall (symbol-function 'subr-arity)
(symbol-function 'file-attributes)))))
(nth 2 (file-attributes file 'integer))
(nth 2 (file-attributes file)))))
(if (and uid (/= uid remote-uid))

View file

@ -135,11 +135,25 @@ Nil means to use a separate filename syntax for Tramp.")
(unless (boundp 'custom-print-functions)
(defvar custom-print-functions nil)) ; not autoloaded before Emacs 20.4
;; Avoid bytecompiler warnings if the byte-compiler supports this.
;; Avoid byte-compiler warnings if the byte-compiler supports this.
;; Currently, XEmacs supports this.
(eval-when-compile
(when (fboundp 'byte-compiler-options)
(byte-compiler-options (warnings (- unused-vars)))))
(let (unused-vars) ; Pacify Emacs byte-compiler
(defalias 'warnings 'identity) ; Pacify Emacs byte-compiler
(byte-compiler-options (warnings (- unused-vars))))))
;; `directory-sep-char' is an obsolete variable in Emacs. But it is
;; used in XEmacs, so we set it here and there. The following is needed
;; to pacify Emacs byte-compiler.
(eval-when-compile
(when (boundp 'byte-compile-not-obsolete-var)
(setq byte-compile-not-obsolete-var 'directory-sep-char)))
;; XEmacs byte-compiler raises warning abouts `last-coding-system-used'.
(eval-when-compile
(unless (boundp 'last-coding-system-used)
(defvar last-coding-system-used nil)))
;;; User Customizable Internal Variables:
@ -157,6 +171,49 @@ Nil means to use a separate filename syntax for Tramp.")
:group 'tramp
:type 'boolean)
;; Emacs case
(eval-and-compile
(when (boundp 'backup-directory-alist)
(defcustom tramp-backup-directory-alist nil
"Alist of filename patterns and backup directory names.
Each element looks like (REGEXP . DIRECTORY), with the same meaning like
in `backup-directory-alist'. If a Tramp file is backed up, and DIRECTORY
is a local file name, the backup directory is prepended with Tramp file
name prefix \(multi-method, method, user, host\) of file.
\(setq tramp-backup-directory-alist backup-directory-alist\)
gives the same backup policy for Tramp files on their hosts like the
policy for local files."
:group 'tramp
:type '(repeat (cons (regexp :tag "Regexp matching filename")
(directory :tag "Backup directory name"))))))
;; XEmacs case. We cannot check for `bkup-backup-directory-info', because
;; the package "backup-dir" might not be loaded yet.
(eval-and-compile
(when (featurep 'xemacs)
(defcustom tramp-bkup-backup-directory-info nil
"*Alist of (FILE-REGEXP BACKUP-DIR OPTIONS ...))
It has the same meaning like `bkup-backup-directory-info' from package
`backup-dir'. If a Tramp file is backed up, and BACKUP-DIR is a local
file name, the backup directory is prepended with Tramp file name prefix
\(multi-method, method, user, host\) of file.
\(setq tramp-bkup-backup-directory-info bkup-backup-directory-info\)
gives the same backup policy for Tramp files on their hosts like the
policy for local files."
:type '(repeat
(list (regexp :tag "File regexp")
(string :tag "Backup Dir")
(set :inline t
(const ok-create)
(const full-path)
(const prepend-name)
(const search-upward))))
:group 'tramp)))
(defcustom tramp-auto-save-directory nil
"*Put auto-save files in this directory, if set.
The idea is to use a local directory so that auto-saving is faster."
@ -854,6 +911,15 @@ The answer will be provided by `tramp-action-terminal', which see."
:group 'tramp
:type 'regexp)
(defcustom tramp-out-of-band-prompt-regexp
""
"Regular expression indicating an out-of-band copy has finished.
In fact this expression is empty by intention, it will be used only to
check regularly the status of the associated process.
The answer will be provided by `tramp-action-out-of-band', which see."
:group 'tramp
:type 'regexp)
(defcustom tramp-temp-name-prefix "tramp."
"*Prefix to use for temporary files.
If this is a relative file name (such as \"tramp.\"), it is considered
@ -1237,6 +1303,16 @@ corresponding PATTERN matches, the ACTION function is called."
:group 'tramp
:type '(repeat (list variable function)))
(defcustom tramp-actions-copy-out-of-band
'((tramp-password-prompt-regexp tramp-action-password)
(tramp-wrong-passwd-regexp tramp-action-permission-denied)
(tramp-out-of-band-prompt-regexp tramp-action-out-of-band))
"List of pattern/action pairs.
This list is used for copying/renaming with out-of-band methods.
See `tramp-actions-before-shell' for more info."
:group 'tramp
:type '(repeat (list variable function)))
(defcustom tramp-multi-actions
'((tramp-password-prompt-regexp tramp-multi-action-password)
(tramp-login-prompt-regexp tramp-multi-action-login)
@ -1326,7 +1402,8 @@ the visited file modtime.")
(defvar tramp-md5-function
(cond ((and (require 'md5) (fboundp 'md5)) 'md5)
((fboundp 'md5-encode)
(lambda (x) (base64-encode-string (md5-encode x))))
(lambda (x) (base64-encode-string
(funcall (symbol-function 'md5-encode) x))))
(t (error "Coulnd't find an `md5' function")))
"Function to call for running the MD5 algorithm.")
@ -1464,7 +1541,7 @@ some systems don't, and for them we have this shell function.")
;; The device number is returned as "-1", because there will be a virtual
;; device number set in `tramp-handle-file-attributes'
(defconst tramp-perl-file-attributes "\
($f, $n) = @ARGV;
\($f, $n) = @ARGV;
@s = lstat($f);
if (($s[2] & 0170000) == 0120000) { $l = readlink($f); $l = \"\\\"$l\\\"\"; }
elsif (($s[2] & 0170000) == 040000) { $l = \"t\"; }
@ -1628,6 +1705,14 @@ This is used to map a mode number to a permission string.")
'undecided-dos)
"Some Emacsen know the `dos' coding system, others need `undecided-dos'.")
(defvar tramp-last-cmd nil
"Internal Tramp variable recording the last command sent.
This variable is buffer-local in every buffer.")
(make-variable-buffer-local 'tramp-last-cmd)
(defvar tramp-process-echoes nil
"Whether to process echoes from the remote shell.")
(defvar tramp-last-cmd-time nil
"Internal Tramp variable recording the time when the last cmd was sent.
This variable is buffer-local in every buffer.")
@ -1638,7 +1723,8 @@ This variable is buffer-local in every buffer.")
(defvar tramp-feature-write-region-fix
(when (fboundp 'find-operation-coding-system)
(let ((file-coding-system-alist '(("test" emacs-mule))))
(find-operation-coding-system 'write-region 0 0 "" nil "test")))
(funcall (symbol-function 'find-operation-coding-system)
'write-region 0 0 "" nil "test")))
"Internal variable to say if `write-region' chooses the right coding.
Older versions of Emacs chose the coding system for `write-region' based
on the FILENAME argument, even if VISIT was a string.")
@ -1684,6 +1770,7 @@ on the FILENAME argument, even if VISIT was a string.")
(file-local-copy . tramp-handle-file-local-copy)
(insert-file-contents . tramp-handle-insert-file-contents)
(write-region . tramp-handle-write-region)
(find-backup-file-name . tramp-handle-find-backup-file-name)
(unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory)
(dired-compress-file . tramp-handle-dired-compress-file)
(dired-call-process . tramp-handle-dired-call-process)
@ -1756,8 +1843,8 @@ remaining args passed to `tramp-message'."
Calls `line-end-position' or `point-at-eol' if defined, else
own implementation."
(cond
((fboundp 'line-end-position) (funcall 'line-end-position))
((fboundp 'point-at-eol) (funcall 'point-at-eol))
((fboundp 'line-end-position) (funcall (symbol-function 'line-end-position)))
((fboundp 'point-at-eol) (funcall (symbol-function 'point-at-eol)))
(t (save-excursion (end-of-line) (point)))))
(defmacro with-parsed-tramp-file-name (filename var &rest body)
@ -1790,6 +1877,8 @@ If VAR is nil, then we bind `v' to the structure and `multi-method',
,@body))
(put 'with-parsed-tramp-file-name 'lisp-indent-function 2)
;; To be activated for debugging containing this macro
(def-edebug-spec with-parsed-tramp-file-name t)
;;; Config Manipulation Functions:
@ -2711,7 +2800,7 @@ and `rename'. FILENAME and NEWNAME must be absolute file names."
;; matter which filename handlers are used for the
;; source and target file.
(t
(tramp-do-copy-or-rename-via-buffer
(tramp-do-copy-or-rename-file-via-buffer
op filename newname keep-date))))
;; One file is a Tramp file, the other one is local.
@ -2727,14 +2816,14 @@ and `rename'. FILENAME and NEWNAME must be absolute file names."
(tramp-do-copy-or-rename-file-out-of-band
op filename newname keep-date)
;; Use the generic method via a Tramp buffer.
(tramp-do-copy-or-rename-via-buffer op filename newname keep-date)))
(tramp-do-copy-or-rename-file-via-buffer
op filename newname keep-date)))
(t
;; One of them must be a Tramp file.
(error "Tramp implementation says this cannot happen")))))
;; CCC: implement keep-date if possible -- via touch?
(defun tramp-do-copy-or-rename-via-buffer (op filename newname keep-date)
(defun tramp-do-copy-or-rename-file-via-buffer (op filename newname keep-date)
"Use an Emacs buffer to copy or rename a file.
First arg OP is either `copy' or `rename' and indicates the operation.
FILENAME is the source file, NEWNAME the target file.
@ -2754,10 +2843,11 @@ KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME."
(jka-compr-inhibit t))
(write-region (point-min) (point-max) newname))
;; KEEP-DATE handling.
(when (and keep-date
(not (null modtime))
(when keep-date
(when (and (not (null modtime))
(not (equal modtime '(0 0))))
(tramp-touch newname modtime)))
(tramp-touch newname modtime))
(set-file-modes newname (file-modes filename))))
;; If the operation was `rename', delete the original file.
(unless (eq op 'copy)
(delete-file filename))))
@ -2791,12 +2881,12 @@ If KEEP-DATE is non-nil, preserve the time stamp when copying."
"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 ((trampbuf (get-buffer-create "*tramp output*"))
(t1 (tramp-tramp-file-p filename))
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
v1-multi-method v1-method v1-user v1-host v1-localname
v2-multi-method v2-method v2-user v2-host v2-localname
method copy-program copy-args source target)
multi-method method user host copy-program copy-args
source target trampbuf)
;; Check which ones of source and target are Tramp files.
;; We cannot invoke `with-parsed-tramp-file-name';
@ -2808,8 +2898,11 @@ be a local filename. The method used must be an out-of-band method."
v1-user l-user
v1-host l-host
v1-localname l-localname
multi-method l-multi-method
method (tramp-find-method
v1-multi-method v1-method v1-user v1-host)
user l-user
host l-host
copy-program (tramp-get-method-parameter
v1-multi-method method
v1-user v1-host 'tramp-copy-program)
@ -2825,8 +2918,11 @@ be a local filename. The method used must be an out-of-band method."
v2-user l-user
v2-host l-host
v2-localname l-localname
multi-method l-multi-method
method (tramp-find-method
v2-multi-method v2-method v2-user v2-host)
user l-user
host l-host
copy-program (tramp-get-method-parameter
v2-multi-method method
v2-user v2-host 'tramp-copy-program)
@ -2871,24 +2967,29 @@ be a local filename. The method used must be an out-of-band method."
v2-user v2-host 'tramp-copy-keep-date-arg)
copy-args))))
(setq copy-args (append copy-args (list source target)))
(setq copy-args (append copy-args (list source target))
trampbuf (generate-new-buffer
(tramp-buffer-name multi-method method user host)))
;; Use rcp-like program for file transfer.
;; Use an asynchronous process. By this, password can be handled.
(save-excursion
(set-buffer trampbuf)
(setq tramp-current-multi-method multi-method
tramp-current-method method
tramp-current-user user
tramp-current-host host)
(tramp-message
5 "Transferring %s to file %s..." filename newname)
(save-excursion (set-buffer trampbuf) (erase-buffer))
(unless (equal
0
(apply #'call-process copy-program
nil trampbuf nil copy-args))
(pop-to-buffer trampbuf)
(error
(concat
"tramp-do-copy-or-rename-file-out-of-band: `%s' didn't work, "
"see buffer `%s' for details")
copy-program trampbuf))
;; Use rcp-like program for file transfer.
(let ((p (apply 'start-process (buffer-name trampbuf) trampbuf
copy-program copy-args)))
(process-kill-without-query p)
(tramp-process-actions p multi-method method user host
tramp-actions-copy-out-of-band))
(kill-buffer trampbuf)
(tramp-message
5 "Transferring %s to file %s...done" filename newname)
5 "Transferring %s to file %s...done" filename newname))
;; If the operation was `rename', delete the original file.
(unless (eq op 'copy)
@ -3012,7 +3113,8 @@ This is like `dired-recursive-delete-directory' for tramp files."
multi-method method user host
(concat (nth 2 suffix) " " localname)))
(message "Uncompressing %s...done" file)
(dired-remove-file file)
;; `dired-remove-file' is not defined in XEmacs
(funcall (symbol-function 'dired-remove-file) file)
(string-match (car suffix) file)
(concat (substring file 0 (match-beginning 0)))))
(t
@ -3023,7 +3125,8 @@ This is like `dired-recursive-delete-directory' for tramp files."
multi-method method user host
(concat "gzip -f " localname)))
(message "Compressing %s...done" file)
(dired-remove-file file)
;; `dired-remove-file' is not defined in XEmacs
(funcall (symbol-function 'dired-remove-file) file)
(cond ((file-exists-p (concat file ".gz"))
(concat file ".gz"))
((file-exists-p (concat file ".z"))
@ -3091,12 +3194,10 @@ This is like `dired-recursive-delete-directory' for tramp files."
(format "%s %s %s"
(tramp-get-ls-command multi-method method user host)
switches
(if full-directory-p
;; Add "/." to make sure we got complete dir
;; listing for symlinks, too.
(concat (file-name-as-directory
(file-name-nondirectory localname)) ".")
(file-name-nondirectory localname)))))
(if wildcard
localname
(tramp-shell-quote-argument
(file-name-nondirectory localname))))))
(sit-for 1) ;needed for rsh but not ssh?
(tramp-wait-for-output))
;; The following let-binding is used by code that's commented
@ -3361,7 +3462,6 @@ This will break if COMMAND prints a newline, followed by the value of
filename))
(setq tmpfil (tramp-make-temp-file))
(cond ((tramp-method-out-of-band-p multi-method method user host)
;; `copy-file' handles out-of-band methods
(copy-file filename tmpfil t t))
@ -3418,7 +3518,9 @@ This will break if COMMAND prints a newline, followed by the value of
(delete-file tmpfil2)))
(tramp-message-for-buffer
multi-method method user host
5 "Decoding remote file %s...done" filename)))
5 "Decoding remote file %s...done" filename)
;; Set proper permissions.
(set-file-modes tmpfil (file-modes filename))))
(t (error "Wrong method specification for `%s'" method)))
tmpfil)))
@ -3470,6 +3572,49 @@ This will break if COMMAND prints a newline, followed by the value of
(list (expand-file-name filename)
(second result))))))
(defun tramp-handle-find-backup-file-name (filename)
"Like `find-backup-file-name' for tramp files."
(if (or (and (not (featurep 'xemacs))
(not (boundp 'tramp-backup-directory-alist)))
(and (featurep 'xemacs)
(not (boundp 'tramp-bkup-backup-directory-info))))
;; No tramp backup directory alist defined, or nil
(tramp-run-real-handler 'find-backup-file-name (list filename))
(with-parsed-tramp-file-name filename nil
(let* ((backup-var
(copy-tree
(if (featurep 'xemacs)
;; XEmacs case
(symbol-value 'tramp-bkup-backup-directory-info)
;; Emacs case
(symbol-value 'tramp-backup-directory-alist))))
;; We set both variables. It doesn't matter whether it is
;; Emacs or XEmacs
(backup-directory-alist backup-var)
(bkup-backup-directory-info backup-var))
(mapcar
'(lambda (x)
(let ((dir (if (consp (cdr x)) (car (cdr x)) (cdr x))))
(when (and (stringp dir)
(file-name-absolute-p dir)
(not (tramp-file-name-p dir)))
;; Prepend absolute directory names with tramp prefix
(if (consp (cdr x))
(setcar (cdr x)
(tramp-make-tramp-file-name
multi-method method user host dir))
(setcdr x (tramp-make-tramp-file-name
multi-method method user host dir))))))
backup-var)
(tramp-run-real-handler 'find-backup-file-name (list filename))))))
;; CCC grok APPEND, LOCKNAME, CONFIRM
(defun tramp-handle-write-region
(start end filename &optional append visit lockname confirm)
@ -3499,6 +3644,7 @@ This will break if COMMAND prints a newline, followed by the value of
(loc-enc (tramp-get-local-encoding multi-method method user host))
(loc-dec (tramp-get-local-decoding multi-method method user host))
(trampbuf (get-buffer-create "*tramp output*"))
(modes (file-modes filename))
;; We use this to save the value of `last-coding-system-used'
;; after writing the tmp file. At the end of the function,
;; we set `last-coding-system-used' to this saved value.
@ -3519,6 +3665,11 @@ This will break if COMMAND prints a newline, followed by the value of
(if confirm ; don't pass this arg unless defined for backward compat.
(list start end tmpfil append 'no-message lockname confirm)
(list start end tmpfil append 'no-message lockname)))
;; The permissions of the temporary file should be set. If
;; filename does not exist (eq modes nil) it has been renamed to
;; the backup file. This case `save-buffer' handles
;; permissions.
(when modes (set-file-modes tmpfil modes))
;; Now, `last-coding-system-used' has the right value. Remember it.
(when (boundp 'last-coding-system-used)
(setq coding-system-used last-coding-system-used))
@ -3885,7 +4036,7 @@ necessary anymore."
(list (tramp-handle-expand-file-name name))))))
;; Check for complete.el and override PC-expand-many-files if appropriate.
(eval-when-compile
(eval-and-compile
(defun tramp-save-PC-expand-many-files (name))); avoid compiler warning
(defun tramp-setup-complete ()
@ -3936,11 +4087,14 @@ necessary anymore."
(and (featurep 'xemacs)
(not (event-modifiers last-input-event))
(or (char-equal
(funcall 'event-to-character last-input-event) ?\?)
(funcall (symbol-function 'event-to-character)
last-input-event) ?\?)
(char-equal
(funcall 'event-to-character last-input-event) ?\t)
(funcall (symbol-function 'event-to-character)
last-input-event) ?\t)
(char-equal
(funcall 'event-to-character last-input-event) ?\ ))))
(funcall (symbol-function 'event-to-character)
last-input-event) ?\ ))))
t)))
(defun tramp-completion-handle-file-exists-p (filename)
@ -4478,6 +4632,7 @@ hosts, or files, disagree."
"Set the last-modified timestamp of the given file.
TIME is an Emacs internal time value as returned by `current-time'."
(let ((touch-time (format-time-string "%Y%m%d%H%M.%S" time)))
(if (tramp-tramp-file-p file)
(with-parsed-tramp-file-name file nil
(let ((buf (tramp-get-buffer multi-method method user host)))
(unless (zerop (tramp-send-command-and-check
@ -4487,7 +4642,13 @@ TIME is an Emacs internal time value as returned by `current-time'."
localname)))
(pop-to-buffer buf)
(error "tramp-touch: touch failed, see buffer `%s' for details"
buf))))))
buf))))
;; It's a local file
(with-temp-buffer
(unless (zerop (call-process
"touch" nil (current-buffer) nil "-t" touch-time file))
(pop-to-buffer (current-buffer))
(error "tramp-touch: touch failed"))))))
(defun tramp-buffer-name (multi-method method user host)
"A name for the connection buffer for USER at HOST using METHOD."
@ -4815,6 +4976,19 @@ The terminal type can be configured with `tramp-terminal-type'."
(process-send-string nil (concat tramp-terminal-type
tramp-rsh-end-of-line)))
(defun tramp-action-out-of-band (p multi-method method user host)
"Check whether an out-of-band copy has finished."
(cond ((and (memq (process-status p) '(stop exit))
(zerop (process-exit-status p)))
(tramp-message 9 "Process has finished.")
(throw 'tramp-action 'ok))
((or (and (memq (process-status p) '(stop exit))
(not (zerop (process-exit-status p))))
(memq (process-status p) '(signal)))
(tramp-message 9 "Process has died.")
(throw 'tramp-action 'process-died))
(t nil)))
;; The following functions are specifically for multi connections.
(defun tramp-multi-action-login (p method user host)
@ -4931,7 +5105,7 @@ The terminal type can be configured with `tramp-terminal-type'."
(erase-buffer)
(tramp-message 10 "Sending command to remote shell: %s"
cmd)
(tramp-send-command multi-method method user host cmd)
(tramp-send-command multi-method method user host cmd nil t)
(tramp-barf-if-no-shell-prompt
p 60 "Remote shell command failed: %s" cmd))
(erase-buffer)))
@ -5014,12 +5188,6 @@ Recognition of the remote shell prompt is based on the variables
`shell-prompt-pattern' and `tramp-shell-prompt-pattern' which must be
set up correctly.
Please note that it is NOT possible to use this connection method with
an out-of-band transfer method if this function asks the user for a
password! You must use an inline transfer method in this case.
Sadly, the transfer method cannot be switched on the fly, instead you
must specify the right method in the file name.
Kludgy feature: if HOST has the form \"xx#yy\", then yy is assumed to
be a port number for ssh, and \"-p yy\" will be added to the list of
arguments, and xx will be used as the host name to connect to.
@ -5412,6 +5580,10 @@ to set up. METHOD, USER and HOST specify the connection."
(tramp-send-command-internal multi-method method user host
"stty -inlcr -echo kill '^U'")
(erase-buffer)
;; Ignore garbage after stty command.
(tramp-send-command-internal multi-method method user host
"echo foo")
(erase-buffer)
(tramp-send-command-internal multi-method method user host
"TERM=dumb; export TERM")
;; Try to set up the coding system correctly.
@ -5858,6 +6030,7 @@ connection. This is meant to be used from
(or neveropen
(tramp-maybe-open-connection multi-method method user host))
(setq tramp-last-cmd-time (current-time))
(setq tramp-last-cmd command)
(when tramp-debug-buffer
(save-excursion
(set-buffer (tramp-get-debug-buffer multi-method method user host))
@ -5886,6 +6059,7 @@ Sends COMMAND, then waits 30 seconds for shell prompt."
(let ((proc (get-buffer-process (current-buffer)))
(found nil)
(start-time (current-time))
(start-point (point))
(end-of-output (concat "^"
(regexp-quote tramp-end-of-output)
"\r?$")))
@ -5920,6 +6094,12 @@ Sends COMMAND, then waits 30 seconds for shell prompt."
(goto-char (point-max))
(forward-line -2)
(delete-region (point) (point-max)))
;; If processing echoes, look for it in the first line and delete.
(when tramp-process-echoes
(save-excursion
(goto-char start-point)
(when (looking-at (regexp-quote tramp-last-cmd))
(delete-region (point) (forward-line 1)))))
;; Add output to debug buffer if appropriate.
(when tramp-debug-buffer
(append-to-buffer
@ -6325,9 +6505,7 @@ If both MULTI-METHOD and METHOD are nil, do a lookup in
(format "%s:%s" host localname)))
(defun tramp-method-out-of-band-p (multi-method method user host)
"Return t if this is an out-of-band method, nil otherwise.
It is important to check for this condition, since it is not possible
to enter a password for the `tramp-copy-program'."
"Return t if this is an out-of-band method, nil otherwise."
(tramp-get-method-parameter
multi-method
(tramp-find-method multi-method method user host)
@ -6502,7 +6680,10 @@ Invokes `password-read' if available, `read-passwd' else."
(if (functionp 'password-read)
(let* ((user (or tramp-current-user (user-login-name)))
(host (or tramp-current-host (system-name)))
(key (concat user "@" host))
(key (if (and (stringp user) (stringp host))
(concat user "@" host)
(concat "[" (mapconcat 'identity user "/") "]@["
(mapconcat 'identity host "/") "]")))
(password (apply #'password-read (list prompt key))))
(apply #'password-cache-add (list key password))
password)
@ -6714,6 +6895,8 @@ Only works for Bourne-like shells."
tramp-wrong-passwd-regexp
tramp-yesno-prompt-regexp
tramp-yn-prompt-regexp
tramp-terminal-prompt-regexp
tramp-out-of-band-prompt-regexp
tramp-temp-name-prefix
tramp-file-name-structure
tramp-file-name-regexp
@ -6725,10 +6908,15 @@ Only works for Bourne-like shells."
tramp-end-of-output
tramp-coding-commands
tramp-actions-before-shell
tramp-actions-copy-out-of-band
tramp-multi-actions
tramp-terminal-type
tramp-shell-prompt-pattern
tramp-chunksize
,(when (boundp 'tramp-backup-directory-alist)
'tramp-backup-directory-alist)
,(when (boundp 'tramp-bkup-backup-directory-info)
'tramp-bkup-backup-directory-info)
;; Non-tramp variables of interest
shell-prompt-pattern
@ -6737,6 +6925,14 @@ Only works for Bourne-like shells."
backup-by-copying-when-mismatch
,(when (boundp 'backup-by-copying-when-privileged-mismatch)
'backup-by-copying-when-privileged-mismatch)
,(when (boundp 'password-cache)
'password-cache)
,(when (boundp 'password-cache-expiry)
'password-cache-expiry)
,(when (boundp 'backup-directory-alist)
'backup-directory-alist)
,(when (boundp 'bkup-backup-directory-info)
'bkup-backup-directory-info)
file-name-handler-alist)
nil ; pre-hook
nil ; post-hook
@ -6799,7 +6995,6 @@ report.
;; * Rewrite `tramp-shell-quote-argument' to abstain from using
;; `shell-quote-argument'.
;; * Completion gets confused when you leave out the method name.
;; * Support `dired-compress-file' filename handler.
;; * In Emacs 21, `insert-directory' shows total number of bytes used
;; by the files in that directory. Add this here.
;; * Avoid screen blanking when hitting `g' in dired. (Eli Tziperman)
@ -6820,19 +7015,12 @@ report.
;; if it does show files when run locally.
;; * Allow correction of passwords, if the remote end allows this.
;; (Mark Hershberger)
;; * Make sure permissions of tmp file are good.
;; (Nelson Minar <nelson@media.mit.edu>)
;; * Grok passwd prompts with scp? (David Winter
;; <winter@nevis1.nevis.columbia.edu>). Maybe just do `ssh -l user
;; host', then wait a while for the passwd or passphrase prompt. If
;; there is one, remember the passwd/phrase.
;; * How to deal with MULE in `insert-file-contents' and `write-region'?
;; * Do asynchronous `shell-command's.
;; * Grok `append' parameter for `write-region'.
;; * Test remote ksh or bash for tilde expansion in `tramp-find-shell'?
;; * abbreviate-file-name
;; * grok ~ in tramp-remote-path (Henrik Holm <henrikh@tele.ntnu.no>)
;; * `C' in dired gives error `not tramp file name'.
;; * Also allow to omit user names when doing multi-hop. Not sure yet
;; what the user names should default to, though.
;; * better error checking. At least whenever we see something
@ -6848,9 +7036,7 @@ report.
;; (Francesco Potort,Al(B)
;; * Should we set PATH ourselves or should we rely on the remote end
;; to do it?
;; * Do the autoconf thing.
;; * Make it work for XEmacs 20, which is missing `with-timeout'.
;; * Allow non-Unix remote systems. (More a long-term thing.)
;; * Make it work for different encodings, and for different file name
;; encodings, too. (Daniel Pittman)
;; * Change applicable functions to pass a struct tramp-file-name rather
@ -6865,13 +7051,6 @@ report.
;; * When editing a remote CVS controlled file as a different user, VC
;; gets confused about the file locking status. Try to find out why
;; the workaround doesn't work.
;; * When user is running ssh-agent, it would be useful to add the
;; passwords typed by the user to that agent. This way, the next time
;; round, the users don't have to type all this in again.
;; This would be especially useful for start-process, I think.
;; An easy way to implement start-process is to open a second shell
;; connection which is inconvenient if the user has to reenter
;; passwords.
;; * Change `copy-file' to grok the case where the filename handler
;; for the source and the target file are different. Right now,
;; it looks at the source file and then calls that handler, if
@ -6895,17 +7074,10 @@ report.
;; Functions for file-name-handler-alist:
;; diff-latest-backup-file -- in diff.el
;; dired-compress-file
;; dired-uncache -- this will be needed when we do insert-directory caching
;; file-name-as-directory -- use primitive?
;; file-name-directory -- use primitive?
;; file-name-nondirectory -- use primitive?
;; file-name-sans-versions -- use primitive?
;; file-newer-than-file-p
;; find-backup-file-name
;; get-file-buffer -- use primitive
;; load
;; unhandled-file-name-directory
;; vc-registered
;;; arch-tag: 3a21a994-182b-48fa-b0cd-c1d9fede424a