Sync with Tramp repository

* doc/misc/tramp.texi (Configuration): Note, that Tramp must be
required prior changing its configuration.
(Connection caching, Predefined connection information)
(Remote shell setup): Fix typos.
(Predefined connection information): Describe, how to overwrite
parameters of `tramp-methods'.
(Remote programs, Remote processes, Traces and Profiles):
Simplify example.
(Remote programs): Remove superfluous comment.

* doc/misc/trampver.texi: Update release number.

* lisp/net/tramp-cache.el (tramp-connection-properties): Adapt docstring.

* lisp/net/tramp-gvfs.el (tramp-gvfs-do-copy-or-rename-file): New defun.
(tramp-gvfs-handle-copy-file, tramp-gvfs-handle-rename-file): Use it.
(tramp-gvfs-handle-make-directory): Reimplement PARENTS handling,
"gvfs-mkdir -p ..." does not work robust.
(tramp-gvfs-maybe-open-connection): Adapt `tramp-get-method-parameter' call.

* lisp/net/tramp-sh.el (tramp-methods):
Add `tramp-remote-shell-login' parameter where it fits.
(tramp-get-remote-path): Use it.
(tramp-make-copy-program-file-name): Fix quoting for "psftp" method.
(all): Adapt `tramp-get-method-parameter' calls.

* lisp/net/tramp.el (tramp-methods): Adapt docstring.
(tramp-get-method-parameter): Replace argument METHOD by VEC.
Check also for hits in `tramp-connection-properties'.  Adapt docstring.
(tramp-get-remote-tmpdir): Cache only the local name of tmpdir.
(all): Adapt `tramp-get-method-parameter' calls.

* lisp/net/trampver.el Update release number.

* test/automated/tramp-tests.el (tramp--instrument-test-case):
Add "^make-symbolic-link not supported$" to `debug-ignored-errors'.
(tramp-test13-make-directory, tramp--test-adb-p)
(tramp--test-smb-or-windows-nt-p): Simplify.
(tramp--test-ftp-p, tramp--test-gvfs-p): New defuns.
(tramp--test-special-characters): Fix docstring.  Add gvfs and ftp tests.
(tramp--test-utf8): Fix docstring.
This commit is contained in:
Michael Albinus 2015-07-21 14:59:18 +02:00
parent b6ac30ab43
commit b0dbf4c038
8 changed files with 347 additions and 250 deletions

View file

@ -217,7 +217,7 @@ Configuring @value{tramp} for use
* Connection caching:: Reusing connection related information.
* Predefined connection information::
Setting own connection related information.
* Remote Programs:: How @value{tramp} finds and uses programs on the remote host.
* Remote programs:: How @value{tramp} finds and uses programs on the remote host.
* Remote shell setup:: Remote shell setup hints.
* Android shell setup:: Android shell setup hints.
* Auto-save and Backup:: Auto-save and Backup.
@ -524,6 +524,15 @@ can use to connect to remote hosts and transfer files
If you don't know which method is right for you, see @xref{Default
Method}.
@strong{Note:} In the following description, setting of user options
or variables is explained. Not all of them are autoloaded by
@value{emacsname}. All examples expect, that you have loaded
@value{tramp} first:
@lisp
(require 'tramp)
@end lisp
@menu
* Connection types:: Types of connections made to remote hosts.
@ -548,7 +557,7 @@ Method}.
* Connection caching:: Reusing connection related information.
* Predefined connection information::
Setting own connection related information.
* Remote Programs:: How @value{tramp} finds and uses programs on the remote host.
* Remote programs:: How @value{tramp} finds and uses programs on the remote host.
* Remote shell setup:: Remote shell setup hints.
* Android shell setup:: Android shell setup hints.
* Auto-save and Backup:: Auto-save and Backup.
@ -622,7 +631,7 @@ it may require access to external commands to perform that task.
@command{mimencode} (part of the @command{metamail} package) or
@command{uuencode} on the remote host. The first reliable command
will be used. The search path can be customized, see @ref{Remote
Programs}.
programs}.
If both commands aren't available on the remote host, @value{tramp}
transfers a small piece of Perl code to the remote host, and tries to
@ -1726,10 +1735,10 @@ Using such persistent information can be disabled by setting
@code{tramp-persistency-file-name} to @code{nil}.
Once consequence of reusing connection related information is that
@var{tramp} needs to distinguish hosts. If you, for example, run a
@value{tramp} needs to distinguish hosts. If you, for example, run a
local @code{sshd} on port 3001, which tunnels @command{ssh} to another
host, you could access both @file{@trampfn{ssh, , localhost,}} and
@file{@trampfn{ssh, , localhost#3001,}}. @var{tramp} would use the
@file{@trampfn{ssh, , localhost#3001,}}. @value{tramp} would use the
same host related information (like paths, Perl variants, etc) for
both connections, although the information is valid only for one of
them.
@ -1748,10 +1757,11 @@ connection again.
@node Predefined connection information
@section Setting own connection related information
Sometimes, @var{tramp} is not able to detect correct connection
related information. In such cases, you could tell @var{tramp} which
value it has to take. Since this could result in errors, it has to be
used with care.
Sometimes, method specific arguments in @code{tramp-methods} do not
fit your needs. Sometimes, @value{tramp} is not able to detect
correct connection related information. In such cases, you could tell
@value{tramp} which value it has to take. Since this could result in
errors, it has to be used with care.
@vindex tramp-connection-properties
Such settings can be performed via the list
@ -1759,13 +1769,35 @@ Such settings can be performed via the list
form @code{(@var{regexp} @var{property} @var{value})}. @var{regexp}
matches remote file names for which a property shall be predefined.
It can be @code{nil}. @var{property} is a string, and @var{value} the
corresponding value. @var{property} could be any property found in
the file @code{tramp-persistency-file-name}.
corresponding value.
A special property is @code{"busybox"}. This must be set, if the
remote host runs a very restricted busybox as shell, which closes the
@var{property} could be any method specific parameter found in
@code{tramp-methods}. The parameter key in @code{tramp-methods} is a
symbol name @code{tramp-<foo>}. In order to overwrite it,
@var{property} must be the string @samp{<foo>}. If you, for example,
want to change the remote shell to be used on a remote machine, you
could apply
@lisp
(add-to-list 'tramp-connection-properties
(list (regexp-quote "@trampfn{ssh, user, randomhost.your.domain,}")
"remote-shell" "/bin/ksh"))
(add-to-list 'tramp-connection-properties
(list (regexp-quote "@trampfn{ssh, user, randomhost.your.domain,}")
"remote-shell-login" '("-")))
@end lisp
This would overwrite the @code{tramp-remote-shell} and
@code{tramp-remote-shell-login} parameters in @code{tramp-methods}, to
be used on that remote host.
@var{property} could also be any property found in the file
@code{tramp-persistency-file-name}.
A special property is @samp{busybox}. This must be set, if the remote
host runs a very restricted busybox as shell, which closes the
connection at will. Since there is no reliable test for this,
@var{tramp} must be indicated this way. Example:
@value{tramp} must be indicated this way. Example:
@lisp
(add-to-list 'tramp-connection-properties
@ -1774,7 +1806,7 @@ connection at will. Since there is no reliable test for this,
@end lisp
@node Remote Programs
@node Remote programs
@section How @value{tramp} finds and uses programs on the remote host
@value{tramp} depends on a number of programs on the remote host in order to
@ -1821,9 +1853,6 @@ To add a directory to the remote search path, you could use code such
as:
@lisp
@i{;; We load @value{tramp} to define the variable.}
(require 'tramp)
@i{;; We have @command{perl} in "/usr/local/perl/bin"}
(add-to-list 'tramp-remote-path "/usr/local/perl/bin")
@end lisp
@ -1892,7 +1921,7 @@ to be set correctly to recognize the shell prompt on the remote host.
Note that @value{tramp} requires the match for @code{shell-prompt-pattern}
to be at the end of the buffer. Many people have something like the
following as the value for the variable: @code{"^[^>$][>$] *"}. Now
following as the value for the variable: @samp{^[^>$][>$] *}. Now
suppose your shell prompt is @code{a <b> c $ }. In this case,
@value{tramp} recognizes the @code{>} character as the end of the prompt,
but it is not at the end of the buffer.
@ -2688,7 +2717,7 @@ this is welcome!
When your program is not found in the default search path
@value{tramp} sets on the remote host, you should either use an
absolute path, or extend @code{tramp-remote-path} (see @ref{Remote
Programs}):
programs}):
@lisp
(add-to-list 'tramp-remote-path "~/bin")
@ -2698,8 +2727,8 @@ Programs}):
The environment for your program can be adapted by customizing
@code{tramp-remote-process-environment}. This variable is a list of
strings. It is structured like @code{process-environment}. Each
element is a string of the form @code{"ENVVARNAME=VALUE"}. An entry
@code{"ENVVARNAME="} disables the corresponding environment variable,
element is a string of the form @samp{ENVVARNAME=VALUE}. An entry
@samp{ENVVARNAME=} disables the corresponding environment variable,
which might have been set in your init file like @file{~/.profile}.
@noindent
@ -3930,7 +3959,6 @@ Sometimes, it might be even necessary to step through @value{tramp}
function call traces. Such traces are enabled by the following code:
@lisp
(require 'tramp)
(require 'trace)
(dolist (elt (all-completions "tramp-" obarray 'functionp))
(trace-function-background (intern elt)))

View file

@ -8,7 +8,7 @@
@c In the Tramp GIT, the version number is auto-frobbed from
@c configure.ac, so you should edit that file and run
@c "autoconf && ./configure" to change the version number.
@set trampver 2.2.12
@set trampver 2.2.13-pre
@c Other flags from configuration
@set instprefix /usr/local

View file

@ -66,7 +66,8 @@
Every entry has the form (REGEXP PROPERTY VALUE). The regexp
matches remote file names. It can be nil. PROPERTY is a string,
and VALUE the corresponding value. They are used, if there is no
matching entry for PROPERTY in `tramp-cache-data'."
matching entry for PROPERTY in `tramp-cache-data'. For more
details see the info pages."
:group 'tramp
:version "24.4"
:type '(repeat (list (choice :tag "File Name regexp" regexp (const nil))

View file

@ -582,62 +582,127 @@ is no information where to trace the message.")
;; File name primitives.
(defun tramp-gvfs-do-copy-or-rename-file
(op filename newname &optional ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes)
"Copy or rename a remote file.
OP must be `copy' or `rename' and indicates the operation to perform.
FILENAME specifies the file to copy or rename, NEWNAME is the name of
the new file (for copy) or the new name of the file (for rename).
OK-IF-ALREADY-EXISTS means don't barf if NEWNAME exists already.
KEEP-DATE means to make sure that NEWNAME has the same timestamp
as FILENAME. PRESERVE-UID-GID, when non-nil, instructs to keep
the uid and gid if both files are on the same host.
PRESERVE-EXTENDED-ATTRIBUTES is ignored.
This function is invoked by `tramp-gvfs-handle-copy-file' and
`tramp-gvfs-handle-rename-file'. It is an error if OP is neither
of `copy' and `rename'. FILENAME and NEWNAME must be absolute
file names."
(unless (memq op '(copy rename))
(error "Unknown operation `%s', must be `copy' or `rename'" op))
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
(equal-remote (tramp-equal-remote filename newname))
(file-operation (intern (format "%s-file" op)))
(gvfs-operation (if (eq op 'copy) "gvfs-copy" "gvfs-move"))
(msg-operation (if (eq op 'copy) "Copying" "Renaming")))
(with-parsed-tramp-file-name (if t1 filename newname) nil
(when (and (not ok-if-already-exists) (file-exists-p newname))
(tramp-error
v 'file-already-exists "File %s already exists" newname))
(if (or (and equal-remote
(tramp-get-connection-property v "direct-copy-failed" nil))
(and t1 (not (tramp-gvfs-file-name-p filename)))
(and t2 (not (tramp-gvfs-file-name-p newname))))
;; We cannot copy or rename directly.
(let ((tmpfile (tramp-compat-make-temp-file filename)))
(cond
(preserve-extended-attributes
(tramp-compat-funcall
file-operation
filename tmpfile t keep-date preserve-uid-gid
preserve-extended-attributes))
(preserve-uid-gid
(tramp-compat-funcall
file-operation filename tmpfile t keep-date preserve-uid-gid))
(t
(tramp-compat-funcall
file-operation filename tmpfile t keep-date)))
(rename-file tmpfile newname ok-if-already-exists))
;; Direct action.
(with-tramp-progress-reporter
v 0 (format "%s %s to %s" msg-operation filename newname)
(unless
(apply
'tramp-gvfs-send-command v gvfs-operation
(append
(and (eq op 'copy) (or keep-date preserve-uid-gid)
(list "--preserve"))
(list
(tramp-gvfs-url-file-name filename)
(tramp-gvfs-url-file-name newname))))
(if (or (not equal-remote)
(and equal-remote
(tramp-get-connection-property
v "direct-copy-failed" nil)))
;; Propagate the error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(tramp-error-with-buffer
nil v 'file-error
"%s failed, see buffer `%s' for details."
msg-operation (buffer-name)))
;; Some WebDAV server, like the one from QNAP, do not
;; support direct copy/move. Try a fallback.
(tramp-set-connection-property v "direct-copy-failed" t)
(tramp-gvfs-do-copy-or-rename-file
op filename newname ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes))))
(when (and t1 (eq op 'rename))
(with-parsed-tramp-file-name filename nil
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)))
(when t2
(with-parsed-tramp-file-name newname nil
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)))))))
(defun tramp-gvfs-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes)
"Like `copy-file' for Tramp files."
(with-parsed-tramp-file-name
(if (tramp-tramp-file-p filename) filename newname) nil
(when (and (not ok-if-already-exists) (file-exists-p newname))
(tramp-error
v 'file-already-exists "File %s already exists" newname))
(if (or (and (tramp-tramp-file-p filename)
(not (tramp-gvfs-file-name-p filename)))
(and (tramp-tramp-file-p newname)
(not (tramp-gvfs-file-name-p newname))))
;; We cannot call `copy-file' directly. Use
;; `tramp-compat-funcall' for backward compatibility (number
;; of arguments).
(let ((tmpfile (tramp-compat-make-temp-file filename)))
(cond
(preserve-extended-attributes
(tramp-compat-funcall
'copy-file
filename tmpfile t keep-date preserve-uid-gid
preserve-extended-attributes))
(preserve-uid-gid
(tramp-compat-funcall
'copy-file filename tmpfile t keep-date preserve-uid-gid))
(t
(copy-file filename tmpfile t keep-date)))
(rename-file tmpfile newname ok-if-already-exists))
;; Direct copy.
(with-tramp-progress-reporter
v 0 (format "Copying %s to %s" filename newname)
(unless
(let ((args
(append (if (or keep-date preserve-uid-gid)
(list "--preserve")
nil)
(list
(tramp-gvfs-url-file-name filename)
(tramp-gvfs-url-file-name newname)))))
(apply 'tramp-gvfs-send-command v "gvfs-copy" args))
;; Propagate the error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(tramp-error-with-buffer
nil v 'file-error
"Copying failed, see buffer `%s' for details." (buffer-name)))))
(when (tramp-tramp-file-p newname)
(with-parsed-tramp-file-name newname nil
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname))))))
(setq filename (expand-file-name filename))
(setq newname (expand-file-name newname))
(cond
;; At least one file a Tramp file?
((or (tramp-tramp-file-p filename)
(tramp-tramp-file-p newname))
(tramp-gvfs-do-copy-or-rename-file
'copy filename newname ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes))
;; Compat section.
(preserve-extended-attributes
(tramp-run-real-handler
'copy-file
(list filename newname ok-if-already-exists keep-date
preserve-uid-gid preserve-extended-attributes)))
(preserve-uid-gid
(tramp-run-real-handler
'copy-file
(list filename newname ok-if-already-exists keep-date preserve-uid-gid)))
(t
(tramp-run-real-handler
'copy-file (list filename newname ok-if-already-exists keep-date)))))
(defun tramp-gvfs-handle-delete-directory (directory &optional recursive trash)
"Like `delete-directory' for Tramp files."
@ -1016,60 +1081,35 @@ is no information where to trace the message.")
(defun tramp-gvfs-handle-make-directory (dir &optional parents)
"Like `make-directory' for Tramp files."
(setq dir (directory-file-name (expand-file-name dir)))
(with-parsed-tramp-file-name dir nil
(unless
(apply
'tramp-gvfs-send-command v "gvfs-mkdir"
(if parents
(list "-p" (tramp-gvfs-url-file-name dir))
(list (tramp-gvfs-url-file-name dir))))
;; Propagate the error.
(tramp-error v 'file-error "Couldn't make directory %s" dir))))
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-directory-property v localname)
(save-match-data
(let ((ldir (file-name-directory dir)))
;; Make missing directory parts. "gvfs-mkdir -p ..." does not
;; work robust.
(when (and parents (not (file-directory-p ldir)))
(make-directory ldir parents))
;; Just do it.
(unless (tramp-gvfs-send-command
v "gvfs-mkdir" (tramp-gvfs-url-file-name dir))
(tramp-error v 'file-error "Couldn't make directory %s" dir))))))
(defun tramp-gvfs-handle-rename-file
(filename newname &optional ok-if-already-exists)
"Like `rename-file' for Tramp files."
(with-parsed-tramp-file-name
(if (tramp-tramp-file-p filename) filename newname) nil
(when (and (not ok-if-already-exists) (file-exists-p newname))
(tramp-error
v 'file-already-exists "File %s already exists" newname))
(if (or (and (tramp-tramp-file-p filename)
(not (tramp-gvfs-file-name-p filename)))
(and (tramp-tramp-file-p newname)
(not (tramp-gvfs-file-name-p newname))))
;; We cannot move directly.
(let ((tmpfile (tramp-compat-make-temp-file filename)))
(rename-file filename tmpfile t)
(rename-file tmpfile newname ok-if-already-exists))
;; Direct move.
(with-tramp-progress-reporter
v 0 (format "Renaming %s to %s" filename newname)
(unless
(tramp-gvfs-send-command
v "gvfs-move"
(tramp-gvfs-url-file-name filename)
(tramp-gvfs-url-file-name newname))
;; Propagate the error.
(with-current-buffer (tramp-get-buffer v)
(goto-char (point-min))
(tramp-error-with-buffer
nil v 'file-error
"Renaming failed, see buffer `%s' for details." (buffer-name)))))
(when (tramp-tramp-file-p filename)
(with-parsed-tramp-file-name filename nil
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)))
(when (tramp-tramp-file-p newname)
(with-parsed-tramp-file-name newname nil
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname))))))
;; Check if both files are local -- invoke normal rename-file.
;; Otherwise, use Tramp from local system.
(setq filename (expand-file-name filename))
(setq newname (expand-file-name newname))
;; At least one file a Tramp file?
(if (or (tramp-tramp-file-p filename)
(tramp-tramp-file-p newname))
(tramp-gvfs-do-copy-or-rename-file
'rename filename newname ok-if-already-exists t t)
(tramp-run-real-handler
'rename-file (list filename newname ok-if-already-exists))))
(defun tramp-gvfs-handle-write-region
(start end filename &optional append visit lockname confirm)
@ -1530,7 +1570,7 @@ connection if a previous connection has died for some reason."
;; indicated by the "mounted" signal, i.e. the "fuse-mountpoint"
;; file property.
(with-timeout
((or (tramp-get-method-parameter method 'tramp-connection-timeout)
((or (tramp-get-method-parameter vec 'tramp-connection-timeout)
tramp-connection-timeout)
(if (zerop (length (tramp-file-name-user vec)))
(tramp-error

View file

@ -135,6 +135,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "rsh")
(tramp-login-args (("%h") ("-l" "%u")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "rcp")
(tramp-copy-args (("-p" "%k") ("-r")))
@ -146,6 +147,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "remsh")
(tramp-login-args (("%h") ("-l" "%u")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "rcp")
(tramp-copy-args (("-p" "%k")))
@ -158,6 +160,7 @@ The string is used in `tramp-methods'.")
("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "scp")
(tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r") ("%c")))
@ -175,6 +178,7 @@ The string is used in `tramp-methods'.")
("-e" "none") ("-t" "-t") ("%h") ("/bin/sh")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "scp")
(tramp-copy-args (("-P" "%p") ("-p" "%k")
@ -193,6 +197,7 @@ The string is used in `tramp-methods'.")
("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "rsync")
(tramp-copy-args (("-t" "%k") ("-r")))
@ -206,6 +211,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "rsh")
(tramp-login-args (("%h") ("-l" "%u")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
@ -213,6 +219,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "remsh")
(tramp-login-args (("%h") ("-l" "%u")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
@ -222,6 +229,7 @@ The string is used in `tramp-methods'.")
("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
@ -235,6 +243,7 @@ The string is used in `tramp-methods'.")
("-e" "none") ("-t" "-t") ("%h") ("/bin/sh")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
@ -246,6 +255,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "telnet")
(tramp-login-args (("%h") ("%p") ("2>/dev/null")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-default-port 23)))
;;;###tramp-autoload
@ -254,6 +264,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "telnet")
(tramp-login-args (("%h") ("%p") ("2>/dev/null")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "nc")
;; We use "-v" for better error tracking.
@ -270,6 +281,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "su")
(tramp-login-args (("-") ("%u")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-connection-timeout 10)))
;;;###tramp-autoload
@ -280,6 +292,7 @@ The string is used in `tramp-methods'.")
;; Local $SHELL could be a nasty one, like zsh or fish. Let's override it.
(tramp-login-env (("SHELL") ("/bin/sh")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-connection-timeout 10)))
;;;###tramp-autoload
@ -288,6 +301,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "ksu")
(tramp-login-args (("%u") ("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-connection-timeout 10)))
;;;###tramp-autoload
@ -296,6 +310,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "krlogin")
(tramp-login-args (("%h") ("-l" "%u") ("-x")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
@ -310,6 +325,7 @@ The string is used in `tramp-methods'.")
tramp-initial-end-of-output))
("/bin/sh") ("\"")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-default-port 22)))
;;;###tramp-autoload
@ -323,6 +339,7 @@ The string is used in `tramp-methods'.")
tramp-initial-end-of-output))
("/bin/sh") ("\"")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
@ -336,6 +353,7 @@ The string is used in `tramp-methods'.")
tramp-initial-end-of-output))
("/bin/sh") ("\"")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "pscp")
(tramp-copy-args (("-l" "%u") ("-P" "%p") ("-scp") ("-p" "%k")
@ -355,6 +373,7 @@ The string is used in `tramp-methods'.")
tramp-initial-end-of-output))
("/bin/sh") ("\"")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "pscp")
(tramp-copy-args (("-l" "%u") ("-P" "%p") ("-sftp") ("-p" "%k")
@ -367,6 +386,7 @@ The string is used in `tramp-methods'.")
(tramp-login-program "fsh")
(tramp-login-args (("%h") ("-l" "%u") ("sh" "-i")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-i") ("-c"))
(tramp-copy-program "fcp")
(tramp-copy-args (("-p" "%k")))
@ -1957,7 +1977,7 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
(t2 (tramp-tramp-file-p newname)))
(with-parsed-tramp-file-name (if t1 dirname newname) nil
(if (and (not copy-contents)
(tramp-get-method-parameter method 'tramp-copy-recursive)
(tramp-get-method-parameter v 'tramp-copy-recursive)
;; When DIRNAME and NEWNAME are remote, they must have
;; the same method.
(or (null t1) (null t2)
@ -2379,7 +2399,7 @@ The method used must be an out-of-band method."
(tramp-get-connection-property v "login-as" nil)))
;; Check for listener port.
(when (tramp-get-method-parameter method 'tramp-remote-copy-args)
(when (tramp-get-method-parameter v 'tramp-remote-copy-args)
(setq listener (number-to-string (+ 50000 (random 10000))))
(while
(zerop (tramp-call-process v "nc" nil nil nil "-z" host listener))
@ -2396,10 +2416,9 @@ The method used must be an out-of-band method."
spec (format-spec-make
?h host ?u user ?p port ?r listener ?c options
?k (if keep-date " " ""))
copy-program (tramp-get-method-parameter
method 'tramp-copy-program)
copy-program (tramp-get-method-parameter v 'tramp-copy-program)
copy-keep-date (tramp-get-method-parameter
method 'tramp-copy-keep-date)
v 'tramp-copy-keep-date)
copy-args
(delete
@ -2408,9 +2427,7 @@ The method used must be an out-of-band method."
;; for the whole keep-date sublist.
" "
(dolist
(x
(tramp-get-method-parameter method 'tramp-copy-args)
copy-args)
(x (tramp-get-method-parameter v 'tramp-copy-args) copy-args)
(setq copy-args
(append
copy-args
@ -2424,16 +2441,12 @@ The method used must be an out-of-band method."
(lambda (x)
(setq x (mapcar (lambda (y) (format-spec y spec)) x))
(unless (member "" x) (mapconcat 'identity x " ")))
(tramp-get-method-parameter method 'tramp-copy-env)))
(tramp-get-method-parameter v 'tramp-copy-env)))
remote-copy-program
(tramp-get-method-parameter method 'tramp-remote-copy-program))
(tramp-get-method-parameter v 'tramp-remote-copy-program))
(dolist
(x
(or
(tramp-get-connection-property v "remote-copy-args" nil)
(tramp-get-method-parameter method 'tramp-remote-copy-args)))
(dolist (x (tramp-get-method-parameter v 'tramp-remote-copy-args))
(setq remote-copy-args
(append
remote-copy-args
@ -3333,8 +3346,7 @@ the result will be a local, non-Tramp, file name."
(if (and (not (stringp start))
(= (or end (point-max)) (point-max))
(= (or start (point-min)) (point-min))
(tramp-get-method-parameter
method 'tramp-copy-keep-tmpfile))
(tramp-get-method-parameter v 'tramp-copy-keep-tmpfile))
(progn
(setq tramp-temp-buffer-file-name tmpfile)
(condition-case err
@ -3952,12 +3964,7 @@ file exists and nonzero exit status otherwise."
(defun tramp-find-shell (vec)
"Opens a shell on the remote host which groks tilde expansion."
(with-current-buffer (tramp-get-buffer vec)
(let ((default-shell
(or
(tramp-get-connection-property
(tramp-get-connection-process vec) "remote-shell" nil)
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-remote-shell)))
(let ((default-shell (tramp-get-method-parameter vec 'tramp-remote-shell))
shell)
(setq shell
(with-tramp-connection-property vec "remote-shell"
@ -4016,11 +4023,7 @@ seconds. If not, it produces an error message with the given ERROR-ARGS."
Mainly sets the prompt and the echo correctly. PROC is the shell
process to set up. VEC specifies the connection."
(let ((tramp-end-of-output tramp-initial-end-of-output))
(tramp-open-shell
vec
(or (tramp-get-connection-property vec "remote-shell" nil)
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-remote-shell)))
(tramp-open-shell vec (tramp-get-method-parameter vec 'tramp-remote-shell))
;; Disable echo.
(tramp-message vec 5 "Setting up remote shell environment")
@ -4557,15 +4560,9 @@ Gateway hops are already opened."
;; Foreign and out-of-band methods are not supported for multi-hops.
(when (cdr target-alist)
(setq choices target-alist)
(while choices
(setq item (pop choices))
(when
(or
(not
(tramp-get-method-parameter
(tramp-file-name-method item) 'tramp-login-program))
(tramp-get-method-parameter
(tramp-file-name-method item) 'tramp-copy-program))
(while (setq item (pop choices))
(when (or (not (tramp-get-method-parameter item 'tramp-login-program))
(tramp-get-method-parameter item 'tramp-copy-program))
(tramp-error
vec 'file-error
"Method `%s' is not supported for multi-hops."
@ -4582,8 +4579,7 @@ Gateway hops are already opened."
;; There are multi-hops.
(cdr target-alist)
;; The host name is used for the remote shell command.
(member
'("%h") (tramp-get-method-parameter method 'tramp-login-args))
(member '("%h") (tramp-get-method-parameter v 'tramp-login-args))
;; The host is local. We cannot use `tramp-local-host-p'
;; here, because it opens a connection as well.
(string-match tramp-local-host-regexp host))
@ -4600,8 +4596,7 @@ Gateway hops are already opened."
(cond
;; No options to be computed.
((or (null tramp-use-ssh-controlmaster-options)
(null (assoc "%c" (tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-login-args))))
(null (assoc "%c" (tramp-get-method-parameter vec 'tramp-login-args))))
"")
;; There is already a value to be used.
@ -4764,22 +4759,18 @@ connection if a previous connection has died for some reason."
(l-host (tramp-file-name-host hop))
(l-port nil)
(login-program
(tramp-get-method-parameter
l-method 'tramp-login-program))
(tramp-get-method-parameter hop 'tramp-login-program))
(login-args
(tramp-get-method-parameter
l-method 'tramp-login-args))
(tramp-get-method-parameter hop 'tramp-login-args))
(login-env
(tramp-get-method-parameter
l-method 'tramp-login-env))
(tramp-get-method-parameter hop 'tramp-login-env))
(async-args
(tramp-get-method-parameter
l-method 'tramp-async-args))
(tramp-get-method-parameter hop 'tramp-async-args))
(connection-timeout
(tramp-get-method-parameter
l-method 'tramp-connection-timeout))
hop 'tramp-connection-timeout))
(gw-args
(tramp-get-method-parameter l-method 'tramp-gw-args))
(tramp-get-method-parameter hop 'tramp-gw-args))
(gw (let ((tramp-verbose 0))
(tramp-get-file-property hop "" "gateway" nil)))
(g-method (and gw (tramp-file-name-method gw)))
@ -5121,12 +5112,13 @@ Return ATTR."
(let ((method (tramp-file-name-method vec))
(user (tramp-file-name-user vec))
(host (tramp-file-name-real-host vec))
(localname (tramp-shell-quote-argument
(tramp-file-name-localname vec))))
(localname (tramp-file-name-localname vec)))
(when (string-match tramp-ipv6-regexp host)
(setq host (format "[%s]" host)))
(unless (string-match "ftp$" method)
(setq localname (tramp-shell-quote-argument localname)))
(cond
((tramp-get-method-parameter method 'tramp-remote-copy-program)
((tramp-get-method-parameter vec 'tramp-remote-copy-program)
localname)
((not (zerop (length user)))
(shell-quote-argument (format "%s@%s:%s" user host localname)))
@ -5136,7 +5128,7 @@ Return ATTR."
"Return t if this is an out-of-band method, nil otherwise."
(and
;; It shall be an out-of-band method.
(tramp-get-method-parameter (tramp-file-name-method vec) 'tramp-copy-program)
(tramp-get-method-parameter vec 'tramp-copy-program)
;; There must be a size, otherwise the file doesn't exist.
(numberp size)
;; Either the file size is large enough, or (in rare cases) there
@ -5178,13 +5170,15 @@ Return ATTR."
(tramp-send-command-and-read
vec
(format
"%s -l %s 'echo %s \\\"$PATH\\\"'"
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-remote-shell)
"%s %s %s 'echo %s \\\"$PATH\\\"'"
(tramp-get-method-parameter vec 'tramp-remote-shell)
(mapconcat
'identity
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-remote-shell-args)
(tramp-get-method-parameter vec 'tramp-remote-shell-login)
" ")
(mapconcat
'identity
(tramp-get-method-parameter vec 'tramp-remote-shell-args)
" ")
(tramp-shell-quote-argument tramp-end-of-heredoc))
nil (regexp-quote tramp-end-of-heredoc)))))
@ -5636,8 +5630,6 @@ function cell is returned to be applied on a buffer."
;; * Don't use globbing for directories with many files, as this is
;; likely to produce long command lines, and some shells choke on
;; long command lines.
;; * Make it work for different encodings, and for different file name
;; encodings, too. (Daniel Pittman)
;; * Don't search for perl5 and perl. Instead, only search for perl and
;; then look if it's the right version (with `perl -v').
;; * When editing a remote CVS controlled file as a different user, VC

View file

@ -210,6 +210,12 @@ pair of the form (KEY VALUE). The following KEYs are defined:
for it. Also note that \"/bin/sh\" exists on all Unixen,
this might not be true for the value that you decide to use.
You Have Been Warned.
* `tramp-remote-shell-login'
This specifies the arguments to let `tramp-remote-shell' run
as a login shell. It defaults to (\"-l\"), but some shells,
like ksh, require another argument. See
`tramp-connection-properties' for a way to overwrite the
default value.
* `tramp-remote-shell-args'
For implementation of `shell-command', this specifies the
arguments to let `tramp-remote-shell' run a single command.
@ -1099,11 +1105,20 @@ calling HANDLER.")
;; internal data structure. Convenience functions for internal
;; data structure.
(defun tramp-get-method-parameter (method param)
(defun tramp-get-method-parameter (vec param)
"Return the method parameter PARAM.
If the `tramp-methods' entry does not exist, return nil."
(let ((entry (assoc param (assoc method tramp-methods))))
(when entry (cadr entry))))
If VEC is a vector, check first in connection properties.
Afterwards, check in `tramp-methods'. If the `tramp-methods'
entry does not exist, return nil."
(let ((hash-entry
(replace-regexp-in-string "^tramp-" "" (symbol-name param))))
(if (tramp-connection-property-p vec hash-entry)
;; We use the cached property.
(tramp-get-connection-property vec hash-entry nil)
;; Use the static value from `tramp-methods'.
(let ((methods-entry
(assoc param (assoc (tramp-file-name-method vec) tramp-methods))))
(when methods-entry (cadr methods-entry))))))
(defun tramp-file-name-p (vec)
"Check, whether VEC is a Tramp object."
@ -1167,7 +1182,7 @@ If the `tramp-methods' entry does not exist, return nil."
(or (and (stringp host)
(string-match tramp-host-with-port-regexp host)
(string-to-number (match-string 2 host)))
(tramp-get-method-parameter method 'tramp-default-port)))))
(tramp-get-method-parameter vec 'tramp-default-port)))))
;;;###tramp-autoload
(defun tramp-tramp-file-p (name)
@ -3092,8 +3107,7 @@ User is always nil."
;; name handlers.
(when (and (or beg end)
(tramp-get-method-parameter
(tramp-file-name-method v)
'tramp-login-program))
v 'tramp-login-program))
(setq remote-copy (tramp-make-tramp-temp-file v))
;; This is defined in tramp-sh.el. Let's assume
;; this is loaded already.
@ -3144,7 +3158,7 @@ User is always nil."
(when (and (null remote-copy)
(tramp-get-method-parameter
method 'tramp-copy-keep-tmpfile))
v 'tramp-copy-keep-tmpfile))
;; We keep the local file for performance reasons,
;; useful for "rsync".
(setq tramp-temp-buffer-file-name local-copy))
@ -3228,12 +3242,10 @@ User is always nil."
(args (append
(cons
(tramp-get-method-parameter
(tramp-file-name-method
(tramp-dissect-file-name default-directory))
(tramp-dissect-file-name default-directory)
'tramp-remote-shell)
(tramp-get-method-parameter
(tramp-file-name-method
(tramp-dissect-file-name default-directory))
(tramp-dissect-file-name default-directory)
'tramp-remote-shell-args))
(list (substring command 0 asynchronous))))
current-buffer-p
@ -3952,8 +3964,7 @@ be granted."
;; The method shall be applied to one of the shell file name
;; handlers. `tramp-local-host-p' is also called for "smb" and
;; alike, where it must fail.
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-login-program)
(tramp-get-method-parameter vec 'tramp-login-program)
;; The local temp directory must be writable for the other user.
(file-writable-p
(tramp-make-tramp-file-name
@ -3969,18 +3980,19 @@ be granted."
(defun tramp-get-remote-tmpdir (vec)
"Return directory for temporary files on the remote host identified by VEC."
(with-tramp-connection-property vec "tmpdir"
(let ((dir (tramp-make-tramp-file-name
(tramp-file-name-method vec)
(tramp-file-name-user vec)
(tramp-file-name-host vec)
(or
(tramp-get-method-parameter
(tramp-file-name-method vec) 'tramp-tmpdir)
"/tmp"))))
(if (and (file-directory-p dir) (file-writable-p dir))
dir
(tramp-error vec 'file-error "Directory %s not accessible" dir)))))
(when (file-remote-p (tramp-get-connection-property vec "tmpdir" ""))
;; Compatibility code: Cached value shall be the local path only.
(tramp-set-connection-property vec "tmpdir" 'undef))
(let ((dir (tramp-make-tramp-file-name
(tramp-file-name-method vec)
(tramp-file-name-user vec)
(tramp-file-name-host vec)
(or (tramp-get-method-parameter vec 'tramp-tmpdir) "/tmp"))))
(with-tramp-connection-property vec "tmpdir"
(or (and (file-directory-p dir) (file-writable-p dir)
(file-remote-p dir 'localname))
(tramp-error vec 'file-error "Directory %s not accessible" dir)))
dir))
;;;###tramp-autoload
(defun tramp-make-tramp-temp-file (vec)

View file

@ -31,7 +31,7 @@
;; should be changed only there.
;;;###tramp-autoload
(defconst tramp-version "2.2.12"
(defconst tramp-version "2.2.13-pre"
"This version of Tramp.")
;;;###tramp-autoload
@ -58,7 +58,7 @@
(= emacs-major-version 21)
(>= emacs-minor-version 4)))
"ok"
(format "Tramp 2.2.12 is not fit for %s"
(format "Tramp 2.2.13-pre is not fit for %s"
(when (string-match "^.*$" (emacs-version))
(match-string 0 (emacs-version)))))))
(unless (string-match "\\`ok\\'" x) (error "%s" x)))

View file

@ -117,7 +117,9 @@ shall not contain a timeout."
(declare (indent 1) (debug (natnump body)))
`(let ((tramp-verbose ,verbose)
(tramp-message-show-message t)
(tramp-debug-on-error t))
(tramp-debug-on-error t)
(debug-ignored-errors
(cons "^make-symbolic-link not supported$" debug-ignored-errors)))
(unwind-protect
(progn ,@body)
(when (> tramp-verbose 3)
@ -859,22 +861,20 @@ This checks also `file-name-as-directory', `file-name-directory',
This tests also `file-directory-p' and `file-accessible-directory-p'."
(skip-unless (tramp--test-enabled))
(let ((tmp-name (tramp--test-make-temp-name)))
(let* ((tmp-name1 (tramp--test-make-temp-name))
(tmp-name2 (expand-file-name "foo/bar" tmp-name1)))
(unwind-protect
(progn
(make-directory tmp-name)
(should (file-directory-p tmp-name))
(should (file-accessible-directory-p tmp-name))
(should-error
(make-directory (expand-file-name "foo/bar" tmp-name))
:type 'file-error)
(make-directory (expand-file-name "foo/bar" tmp-name) 'parents)
(should (file-directory-p (expand-file-name "foo/bar" tmp-name)))
(should
(file-accessible-directory-p (expand-file-name "foo/bar" tmp-name))))
(make-directory tmp-name1)
(should (file-directory-p tmp-name1))
(should (file-accessible-directory-p tmp-name1))
(should-error (make-directory tmp-name2) :type 'file-error)
(make-directory tmp-name2 'parents)
(should (file-directory-p tmp-name2))
(should (file-accessible-directory-p tmp-name2)))
;; Cleanup.
(ignore-errors (delete-directory tmp-name 'recursive)))))
(ignore-errors (delete-directory tmp-name1 'recursive)))))
(ert-deftest tramp-test14-delete-directory ()
"Check `delete-directory'."
@ -1667,17 +1667,28 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
(defun tramp--test-adb-p ()
"Check, whether the remote host runs Android.
This requires restrictions of file name syntax."
(eq (tramp-find-foreign-file-name-handler
tramp-test-temporary-file-directory)
'tramp-adb-file-name-handler))
(tramp-adb-file-name-p tramp-test-temporary-file-directory))
(defun tramp--test-ftp-p ()
"Check, whether an FTP-like method is used.
This does not support globbing characters in file names (yet)."
;; Globbing characters are ??, ?* and ?\[.
(and (eq (tramp-find-foreign-file-name-handler
tramp-test-temporary-file-directory)
'tramp-sh-file-name-handler)
(string-match
"ftp$" (file-remote-p tramp-test-temporary-file-directory 'method))))
(defun tramp--test-gvfs-p ()
"Check, whether the remote host runs a GVFS based method.
This requires restrictions of file name syntax."
(tramp-gvfs-file-name-p tramp-test-temporary-file-directory))
(defun tramp--test-smb-or-windows-nt-p ()
"Check, whether the locale or remote host runs MS Windows.
This requires restrictions of file name syntax."
(or (eq system-type 'windows-nt)
(eq (tramp-find-foreign-file-name-handler
tramp-test-temporary-file-directory)
'tramp-smb-file-name-handler)))
(tramp-smb-file-name-p tramp-test-temporary-file-directory)))
(defun tramp--test-check-files (&rest files)
"Run a simple but comprehensive test over every file in FILES."
@ -1815,14 +1826,14 @@ This requires restrictions of file name syntax."
(ignore-errors (delete-directory tmp-name2 'recursive)))))
(defun tramp--test-special-characters ()
"Perform the test in `tramp-test30-special-characters*'."
"Perform the test in `tramp-test31-special-characters*'."
;; Newlines, slashes and backslashes in file names are not
;; supported. So we don't test. And we don't test the tab
;; character on Windows or Cygwin, because the backslash is
;; interpreted as a path separator, preventing "\t" from being
;; expanded to <TAB>.
(tramp--test-check-files
(if (tramp--test-smb-or-windows-nt-p)
(if (or (tramp--test-gvfs-p) (tramp--test-smb-or-windows-nt-p))
"foo bar baz"
(if (or (tramp--test-adb-p) (eq system-type 'cygwin))
" foo bar baz "
@ -1831,15 +1842,28 @@ This requires restrictions of file name syntax."
"-foo-bar-baz-"
"%foo%bar%baz%"
"&foo&bar&baz&"
(unless (tramp--test-smb-or-windows-nt-p) "?foo?bar?baz?")
(unless (tramp--test-smb-or-windows-nt-p) "*foo*bar*baz*")
(if (tramp--test-smb-or-windows-nt-p) "'foo'bar'baz'" "'foo\"bar'baz\"")
(unless (or (tramp--test-ftp-p)
(tramp--test-gvfs-p)
(tramp--test-smb-or-windows-nt-p))
"?foo?bar?baz?")
(unless (or (tramp--test-ftp-p)
(tramp--test-gvfs-p)
(tramp--test-smb-or-windows-nt-p))
"*foo*bar*baz*")
(if (or (tramp--test-gvfs-p) (tramp--test-smb-or-windows-nt-p))
"'foo'bar'baz'"
"'foo\"bar'baz\"")
"#foo~bar#baz~"
(if (tramp--test-smb-or-windows-nt-p) "!foo!bar!baz!" "!foo|bar!baz|")
(if (tramp--test-smb-or-windows-nt-p) ";foo;bar;baz;" ":foo;bar:baz;")
(unless (tramp--test-smb-or-windows-nt-p) "<foo>bar<baz>")
(if (or (tramp--test-gvfs-p) (tramp--test-smb-or-windows-nt-p))
"!foo!bar!baz!"
"!foo|bar!baz|")
(if (or (tramp--test-gvfs-p) (tramp--test-smb-or-windows-nt-p))
";foo;bar;baz;"
":foo;bar:baz;")
(unless (or (tramp--test-gvfs-p) (tramp--test-smb-or-windows-nt-p))
"<foo>bar<baz>")
"(foo)bar(baz)"
"[foo]bar[baz]"
(unless (or (tramp--test-ftp-p) (tramp--test-gvfs-p)) "[foo]bar[baz]")
"{foo}bar{baz}"))
;; These tests are inspired by Bug#17238.
@ -1910,7 +1934,7 @@ Use the `ls' command."
(tramp-set-connection-property v "perl" 'undef))))
(defun tramp--test-utf8 ()
"Perform the test in `tramp-test31-utf8*'."
"Perform the test in `tramp-test32-utf8*'."
(let ((coding-system-for-read 'utf-8)
(coding-system-for-write 'utf-8)
(file-name-coding-system 'utf-8))
@ -2147,11 +2171,11 @@ Since it unloads Tramp, it shall be the last test to run."
;; doesn't work well when an interactive password must be provided.
;; * Fix `tramp-test27-start-file-process' for `nc' and on MS
;; Windows (`process-send-eof'?).
;; * Fix `tramp-test30-special-characters' for `nc'.
;; * Fix `tramp-test31-utf8' for `nc'/`telnet' (when target is a dumb
;; * Fix `tramp-test31-special-characters' for `nc'.
;; * Fix `tramp-test32-utf8' for `nc'/`telnet' (when target is a dumb
;; busybox). Seems to be in `directory-files'.
;; * Fix Bug#16928. Set expected error of `tramp-test32-asynchronous-requests'.
;; * Fix `tramp-test34-unload' (Not all symbols are unbound). Set
;; * Fix Bug#16928. Set expected error of `tramp-test33-asynchronous-requests'.
;; * Fix `tramp-test35-unload' (Not all symbols are unbound). Set
;; expected error.
(defun tramp-test-all (&optional interactive)