From: Michael Albinus Date: Tue, 21 Jul 2015 12:59:18 +0000 (+0200) Subject: Sync with Tramp repository X-Git-Tag: emacs-25.0.90~1455 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b0dbf4c038d53ccce6ecf592c6d5b1ffcc084ad0;p=emacs.git 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. --- diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index ece851ded93..c9af6ddea47 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -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-}. In order to overwrite it, +@var{property} must be the string @samp{}. 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 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))) diff --git a/doc/misc/trampver.texi b/doc/misc/trampver.texi index fc6f4c58606..dccf3175386 100644 --- a/doc/misc/trampver.texi +++ b/doc/misc/trampver.texi @@ -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 diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el index f2ee49ff6be..279d9f45c95 100644 --- a/lisp/net/tramp-cache.el +++ b/lisp/net/tramp-cache.el @@ -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)) diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index 215e39d04c3..4dfdcd76e66 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -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 diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index fda5945a18a..dbf46794a82 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -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 vec 'tramp-remote-shell-login) + " ") (mapconcat 'identity - (tramp-get-method-parameter - (tramp-file-name-method vec) 'tramp-remote-shell-args) + (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 diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index fc23a0bfeb5..beb87f61aaa 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -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) diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el index beb040955e7..2f575f93037 100644 --- a/lisp/net/trampver.el +++ b/lisp/net/trampver.el @@ -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))) diff --git a/test/automated/tramp-tests.el b/test/automated/tramp-tests.el index e1039392ea7..24cfa247c93 100644 --- a/test/automated/tramp-tests.el +++ b/test/automated/tramp-tests.el @@ -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 . (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) "bar") + (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)) + "bar") "(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)