aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog43
-rw-r--r--lisp/net/tramp-compat.el108
-rw-r--r--lisp/net/tramp-fish.el14
-rw-r--r--lisp/net/tramp.el151
-rw-r--r--lisp/net/trampver.el17
5 files changed, 187 insertions, 146 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index e071cbc43bb..1177e458b83 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,46 @@
12010-04-10 Michael Albinus <michael.albinus@gmx.de>
2
3 Synchronize with Tramp repository.
4
5 * net/tramp.el (tramp-completion-function-alist)
6 (tramp-file-name-regexp, tramp-chunksize)
7 (tramp-local-coding-commands, tramp-remote-coding-commands): Fix
8 docstring.
9 (tramp-remote-process-environment): Use `format' instead of
10 `concat'.
11 (tramp-handle-directory-files-and-attributes)
12 (tramp-get-remote-path): Use `copy-tree'.
13 (tramp-handle-file-name-all-completions): Backward/ XEmacs
14 compatibility: Use `completion-ignore-case' if
15 `read-file-name-completion-ignore-case' does not exist.
16 (tramp-do-copy-or-rename-file-directly): Do not use
17 `tramp-handle-file-remote-p'.
18 (tramp-do-copy-or-rename-file-out-of-band): Use
19 `tramp-compat-delete-directory'.
20 (tramp-do-copy-or-rename-file-out-of-band)
21 (tramp-compute-multi-hops, tramp-maybe-open-connection): Use
22 `format-spec-make'.
23 (tramp-find-foreign-file-name-handler)
24 (tramp-advice-make-auto-save-file-name)
25 (tramp-set-auto-save-file-modes): Remove superfluous check for
26 `stringp'. This is done inside `tramp-tramp-file-p'.
27 (tramp-debug-outline-regexp): New defconst.
28 (tramp-get-debug-buffer): Use it.
29 (tramp-check-for-regexp): Use (forward-line 1).
30 (tramp-set-auto-save-file-modes): Adapt version check.
31
32 * net/tramp-compat.el (tramp-advice-file-expand-wildcards): Wrap
33 call of `featurep' for 2nd argument.
34 (tramp-compat-make-temp-file): Simplify fallback implementation.
35 (tramp-compat-copy-tree): Remove function.
36 (tramp-compat-delete-directory): Provide implementation for older
37 Emacsen.
38
39 * net/tramp-fish.el (tramp-fish-handle-directory-files-and-attributes):
40 Do not use `tramp-fish-handle-file-attributes.
41
42 * net/trampver.el: Update release number.
43
12010-04-10 Glenn Morris <rgm@gnu.org> 442010-04-10 Glenn Morris <rgm@gnu.org>
2 45
3 * progmodes/compile.el (compilation-save-buffers-predicate): 46 * progmodes/compile.el (compilation-save-buffers-predicate):
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index 9bcbe21116d..2d8f7535db0 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -22,9 +22,9 @@
22 22
23;;; Commentary: 23;;; Commentary:
24 24
25;; Tramp's main Emacs version for development is GNU Emacs 23. This 25;; Tramp's main Emacs version for development is GNU Emacs 24. This
26;; package provides compatibility functions for GNU Emacs 21, GNU 26;; package provides compatibility functions for GNU Emacs 22, GNU
27;; Emacs 22 and XEmacs 21.4+. 27;; Emacs 23 and XEmacs 21.4+.
28 28
29;;; Code: 29;;; Code:
30 30
@@ -120,7 +120,7 @@
120 (tramp-file-name-handler 120 (tramp-file-name-handler
121 'file-remote-p file identification connected))))) 121 'file-remote-p file identification connected)))))
122 122
123 ;; `process-file' exists since Emacs 22. 123 ;; `process-file' does not exist in XEmacs.
124 (unless (fboundp 'process-file) 124 (unless (fboundp 'process-file)
125 (defalias 'process-file 125 (defalias 'process-file
126 (lambda (program &optional infile buffer display &rest args) 126 (lambda (program &optional infile buffer display &rest args)
@@ -154,7 +154,9 @@
154 ;; return the original filename if it can't expand anything. Let's 154 ;; return the original filename if it can't expand anything. Let's
155 ;; just hope that this doesn't break anything else. 155 ;; just hope that this doesn't break anything else.
156 ;; It is not needed anymore since GNU Emacs 23.2. 156 ;; It is not needed anymore since GNU Emacs 23.2.
157 (unless (or (featurep 'xemacs) (featurep 'files 'remote-wildcards)) 157 (unless (or (featurep 'xemacs)
158 ;; `featurep' has only one argument in XEmacs.
159 (funcall 'featurep 'files 'remote-wildcards))
158 (defadvice file-expand-wildcards 160 (defadvice file-expand-wildcards
159 (around tramp-advice-file-expand-wildcards activate) 161 (around tramp-advice-file-expand-wildcards activate)
160 (let ((name (ad-get-arg 0))) 162 (let ((name (ad-get-arg 0)))
@@ -211,10 +213,9 @@ this is the function `temp-directory'."
211 "`temp-directory' is defined -- using /tmp.")) 213 "`temp-directory' is defined -- using /tmp."))
212 (file-name-as-directory "/tmp")))) 214 (file-name-as-directory "/tmp"))))
213 215
214;; `make-temp-file' exists in Emacs only. The third parameter SUFFIX 216;; `make-temp-file' exists in Emacs only. On XEmacs, we use our own
215;; has been introduced with Emacs 22. We try it, if it fails, we fall 217;; implementation with `make-temp-name', creating the temporary file
216;; back to `make-temp-name', creating the temporary file immediately 218;; immediately in order to avoid a security hole.
217;; in order to avoid a security hole.
218(defsubst tramp-compat-make-temp-file (filename &optional dir-flag) 219(defsubst tramp-compat-make-temp-file (filename &optional dir-flag)
219 "Create a temporary file (compat function). 220 "Create a temporary file (compat function).
220Add the extension of FILENAME, if existing." 221Add the extension of FILENAME, if existing."
@@ -224,43 +225,34 @@ Add the extension of FILENAME, if existing."
224 (tramp-compat-temporary-file-directory))) 225 (tramp-compat-temporary-file-directory)))
225 (extension (file-name-extension filename t)) 226 (extension (file-name-extension filename t))
226 result) 227 result)
227 (condition-case nil 228 (if (fboundp 'make-temp-file)
228 (setq result 229 (setq result
229 (funcall 230 (funcall
230 (symbol-function 'make-temp-file) prefix dir-flag extension)) 231 (symbol-function 'make-temp-file) prefix dir-flag extension))
231 (error 232 ;; We use our own implementation, taken from files.el.
232 ;; We use our own implementation, taken from files.el. 233 (while
233 (while 234 (condition-case ()
234 (condition-case () 235 (progn
235 (progn 236 (setq result (concat (make-temp-name prefix) extension))
236 (setq result (concat (make-temp-name prefix) extension)) 237 (if dir-flag
237 (if dir-flag 238 (make-directory result)
238 (make-directory result) 239 (write-region "" nil result nil 'silent))
239 (write-region 240 nil)
240 "" nil result nil 'silent nil 241 (file-already-exists t))
241 ;; 7th parameter is MUSTBENEW in Emacs, and 242 ;; The file was somehow created by someone else between
242 ;; CODING-SYSTEM in XEmacs. It is not a security 243 ;; `make-temp-name' and `write-region', let's try again.
243 ;; hole in XEmacs if we cannot use this parameter, 244 nil))
244 ;; because XEmacs uses a user-specific
245 ;; subdirectory with 0700 permissions.
246 (when (not (featurep 'xemacs)) 'excl)))
247 nil)
248 (file-already-exists t))
249 ;; The file was somehow created by someone else between
250 ;; `make-temp-name' and `write-region', let's try again.
251 nil)))
252 result)) 245 result))
253 246
254;; `most-positive-fixnum' arrived in Emacs 22. Before, and in XEmacs, 247;; `most-positive-fixnum' does not exist in XEmacs.
255;; it is a fixed value.
256(defsubst tramp-compat-most-positive-fixnum () 248(defsubst tramp-compat-most-positive-fixnum ()
257 "Return largest positive integer value (compat function)." 249 "Return largest positive integer value (compat function)."
258 (cond 250 (cond
259 ((boundp 'most-positive-fixnum) (symbol-value 'most-positive-fixnum)) 251 ((boundp 'most-positive-fixnum) (symbol-value 'most-positive-fixnum))
260 ;; Default value in XEmacs and Emacs 21. 252 ;; Default value in XEmacs.
261 (t 134217727))) 253 (t 134217727)))
262 254
263;; ID-FORMAT exists since Emacs 22. 255;; ID-FORMAT does not exists in XEmacs.
264(defun tramp-compat-file-attributes (filename &optional id-format) 256(defun tramp-compat-file-attributes (filename &optional id-format)
265 "Like `file-attributes' for Tramp files (compat function)." 257 "Like `file-attributes' for Tramp files (compat function)."
266 (cond 258 (cond
@@ -292,8 +284,8 @@ Add the extension of FILENAME, if existing."
292 (funcall 284 (funcall
293 (symbol-function 'copy-directory) directory newname keep-time parents) 285 (symbol-function 'copy-directory) directory newname keep-time parents)
294 286
295 ;; If default-directory is a remote directory, make sure we find 287 ;; If `default-directory' is a remote directory, make sure we find
296 ;; its copy-directory handler. 288 ;; its `copy-directory' handler.
297 (let ((handler (or (find-file-name-handler directory 'copy-directory) 289 (let ((handler (or (find-file-name-handler directory 'copy-directory)
298 (find-file-name-handler newname 'copy-directory)))) 290 (find-file-name-handler newname 'copy-directory))))
299 (if handler 291 (if handler
@@ -325,32 +317,28 @@ Add the extension of FILENAME, if existing."
325 (if keep-time 317 (if keep-time
326 (set-file-times newname (nth 5 (file-attributes directory)))))))) 318 (set-file-times newname (nth 5 (file-attributes directory))))))))
327 319
328;; `copy-tree' is a built-in function in XEmacs. In Emacs 21, it is
329;; an autoloaded function in cl-extra.el. Since Emacs 22, it is part
330;; of subr.el. There are problems when autoloading, therefore we test
331;; for `subrp' and `symbol-file'. Implementation is taken from Emacs 23.
332(defun tramp-compat-copy-tree (tree)
333 "Make a copy of TREE (compat function)."
334 (if (or (subrp 'copy-tree) (symbol-file 'copy-tree))
335 (funcall (symbol-function 'copy-tree) tree)
336 (let (result)
337 (while (consp tree)
338 (let ((newcar (car tree)))
339 (if (consp (car tree))
340 (setq newcar (tramp-compat-copy-tree (car tree))))
341 (push newcar result))
342 (setq tree (cdr tree)))
343 (nconc (nreverse result) tree))))
344
345;; RECURSIVE has been introduced with Emacs 23.2. 320;; RECURSIVE has been introduced with Emacs 23.2.
346(defun tramp-compat-delete-directory (directory &optional recursive) 321(defun tramp-compat-delete-directory (directory &optional recursive)
347 "Like `delete-directory' for Tramp files (compat function)." 322 "Like `delete-directory' for Tramp files (compat function)."
348 (if recursive 323 (if (null recursive)
349 (funcall (symbol-function 'delete-directory) directory recursive) 324 (delete-directory directory)
350 (delete-directory directory))) 325 (condition-case nil
351 326 (funcall (symbol-function 'delete-directory) directory recursive)
352;; `number-sequence' has been introduced in Emacs 22. Implementation 327 ;; This Emacs version does not support the RECURSIVE flag. We
353;; is taken from Emacs 23. 328 ;; use the implementation from Emacs 23.2.
329 (error
330 (setq directory (directory-file-name (expand-file-name directory)))
331 (if (not (file-symlink-p directory))
332 (mapc (lambda (file)
333 (if (eq t (car (file-attributes file)))
334 (tramp-compat-delete-directory file recursive)
335 (delete-file file)))
336 (directory-files
337 directory 'full "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")))
338 (delete-directory directory)))))
339
340;; `number-sequence' does not exist in XEmacs. Implementation is
341;; taken from Emacs 23.
354(defun tramp-compat-number-sequence (from &optional to inc) 342(defun tramp-compat-number-sequence (from &optional to inc)
355 "Return a sequence of numbers from FROM to TO as a list (compat function)." 343 "Return a sequence of numbers from FROM to TO as a list (compat function)."
356 (if (or (subrp 'number-sequence) (symbol-file 'number-sequence)) 344 (if (or (subrp 'number-sequence) (symbol-file 'number-sequence))
diff --git a/lisp/net/tramp-fish.el b/lisp/net/tramp-fish.el
index 582aeb4dd74..e3607fa114a 100644
--- a/lisp/net/tramp-fish.el
+++ b/lisp/net/tramp-fish.el
@@ -341,10 +341,10 @@ pass to the OPERATION."
341 "Like `directory-files-and-attributes' for Tramp files." 341 "Like `directory-files-and-attributes' for Tramp files."
342 (mapcar 342 (mapcar
343 (lambda (x) 343 (lambda (x)
344 ;; We cannot call `file-attributes' for backward compatibility reasons. 344 (cons x
345 ;; Its optional parameter ID-FORMAT is introduced with Emacs 22. 345 (tramp-compat-file-attributes
346 (cons x (tramp-fish-handle-file-attributes 346 (if full x (expand-file-name x directory))
347 (if full x (expand-file-name x directory)) id-format))) 347 id-format)))
348 (directory-files directory full match nosort))) 348 (directory-files directory full match nosort)))
349 349
350(defun tramp-fish-handle-expand-file-name (name &optional dir) 350(defun tramp-fish-handle-expand-file-name (name &optional dir)
@@ -1030,15 +1030,15 @@ SIZE MODE WEIRD)."
1030 ;; last line 1030 ;; last line
1031 ((looking-at "^$") 1031 ((looking-at "^$")
1032 (return))) 1032 (return)))
1033 ;; delete line 1033 ;; Delete line.
1034 (forward-line) 1034 (forward-line)
1035 (delete-region (point-min) (point)))) 1035 (delete-region (point-min) (point))))
1036 1036
1037 ;; delete trailing empty line 1037 ;; Delete trailing empty line.
1038 (forward-line) 1038 (forward-line)
1039 (delete-region (point-min) (point)) 1039 (delete-region (point-min) (point))
1040 1040
1041 ;; Return entry in file-attributes format 1041 ;; Return entry in `file-attributes' format.
1042 (list localname link -1 uid gid '(0 0) mtime '(0 0) size mode nil))) 1042 (list localname link -1 uid gid '(0 0) mtime '(0 0) size mode nil)))
1043 1043
1044(defun tramp-fish-retrieve-data (vec) 1044(defun tramp-fish-retrieve-data (vec)
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index b025493b1a4..dc7c90581f9 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -36,7 +36,7 @@
36;; Notes: 36;; Notes:
37;; ----- 37;; -----
38;; 38;;
39;; This package only works for Emacs 21.1 and higher, and for XEmacs 21.4 39;; This package only works for Emacs 22.1 and higher, and for XEmacs 21.4
40;; and higher. For XEmacs 21, you need the package `fsf-compat' for 40;; and higher. For XEmacs 21, you need the package `fsf-compat' for
41;; the `with-timeout' macro. 41;; the `with-timeout' macro.
42;; 42;;
@@ -79,7 +79,7 @@
79 (when (featurep 'tramp-compat) 79 (when (featurep 'tramp-compat)
80 (unload-feature 'tramp-compat 'force)))) 80 (unload-feature 'tramp-compat 'force))))
81 81
82(require 'format-spec) ; from Gnus 5.8, also in tar ball 82(require 'format-spec)
83;; As long as password.el is not part of (X)Emacs, it shouldn't 83;; As long as password.el is not part of (X)Emacs, it shouldn't
84;; be mandatory 84;; be mandatory
85(if (featurep 'xemacs) 85(if (featurep 'xemacs)
@@ -871,9 +871,9 @@ interpreted as a regular expression which always matches."
871 871
872(defvar tramp-completion-function-alist nil 872(defvar tramp-completion-function-alist nil
873 "*Alist of methods for remote files. 873 "*Alist of methods for remote files.
874This is a list of entries of the form (NAME PAIR1 PAIR2 ...). 874This is a list of entries of the form \(NAME PAIR1 PAIR2 ...\).
875Each NAME stands for a remote access method. Each PAIR is of the form 875Each NAME stands for a remote access method. Each PAIR is of the form
876\(FUNCTION FILE). FUNCTION is responsible to extract user names and host 876\(FUNCTION FILE\). FUNCTION is responsible to extract user names and host
877names from FILE for completion. The following predefined FUNCTIONs exists: 877names from FILE for completion. The following predefined FUNCTIONs exists:
878 878
879 * `tramp-parse-rhosts' for \"~/.rhosts\" like files, 879 * `tramp-parse-rhosts' for \"~/.rhosts\" like files,
@@ -1025,7 +1025,7 @@ as given in your `~/.profile'."
1025 1025
1026(defcustom tramp-remote-process-environment 1026(defcustom tramp-remote-process-environment
1027 `("HISTFILE=$HOME/.tramp_history" "HISTSIZE=1" "LC_ALL=C" 1027 `("HISTFILE=$HOME/.tramp_history" "HISTSIZE=1" "LC_ALL=C"
1028 ,(concat "TERM=" tramp-terminal-type) 1028 ,(format "TERM=%s" tramp-terminal-type)
1029 "EMACS=t" ;; Deprecated. 1029 "EMACS=t" ;; Deprecated.
1030 ,(format "INSIDE_EMACS=%s,tramp:%s" emacs-version tramp-version) 1030 ,(format "INSIDE_EMACS=%s,tramp:%s" emacs-version tramp-version)
1031 "CDPATH=" "HISTORY=" "MAIL=" "MAILCHECK=" "MAILPATH=" 1031 "CDPATH=" "HISTORY=" "MAIL=" "MAILCHECK=" "MAILPATH="
@@ -1429,14 +1429,14 @@ See `tramp-file-name-structure' for more explanations.")
1429 (t (error "Wrong `tramp-syntax' defined"))) 1429 (t (error "Wrong `tramp-syntax' defined")))
1430 "*Regular expression matching file names handled by Tramp. 1430 "*Regular expression matching file names handled by Tramp.
1431This regexp should match Tramp file names but no other file names. 1431This regexp should match Tramp file names but no other file names.
1432\(When tramp.el is loaded, this regular expression is prepended to 1432When tramp.el is loaded, this regular expression is prepended to
1433`file-name-handler-alist', and that is searched sequentially. Thus, 1433`file-name-handler-alist', and that is searched sequentially. Thus,
1434if the Tramp entry appears rather early in the `file-name-handler-alist' 1434if the Tramp entry appears rather early in the `file-name-handler-alist'
1435and is a bit too general, then some files might be considered Tramp 1435and is a bit too general, then some files might be considered Tramp
1436files which are not really Tramp files. 1436files which are not really Tramp files.
1437 1437
1438Please note that the entry in `file-name-handler-alist' is made when 1438Please note that the entry in `file-name-handler-alist' is made when
1439this file (tramp.el) is loaded. This means that this variable must be set 1439this file \(tramp.el\) is loaded. This means that this variable must be set
1440before loading tramp.el. Alternatively, `file-name-handler-alist' can be 1440before loading tramp.el. Alternatively, `file-name-handler-alist' can be
1441updated after changing this variable. 1441updated after changing this variable.
1442 1442
@@ -1566,18 +1566,18 @@ checked via the following code:
1566 1566
1567In the Emacs normally running Tramp, evaluate the above code 1567In the Emacs normally running Tramp, evaluate the above code
1568\(replace \"xxx\" and \"yyy\" by the remote user and host name, 1568\(replace \"xxx\" and \"yyy\" by the remote user and host name,
1569respectively). You can do this, for example, by pasting it into 1569respectively\). You can do this, for example, by pasting it into
1570the `*scratch*' buffer and then hitting C-j with the cursor after the 1570the `*scratch*' buffer and then hitting C-j with the cursor after the
1571last closing parenthesis. Note that it works only if you have configured 1571last closing parenthesis. Note that it works only if you have configured
1572\"ssh\" to run without password query, see ssh-agent(1). 1572\"ssh\" to run without password query, see ssh-agent\(1\).
1573 1573
1574You will see the number of bytes sent successfully to the remote host. 1574You will see the number of bytes sent successfully to the remote host.
1575If that number exceeds 1000, you can stop the execution by hitting 1575If that number exceeds 1000, you can stop the execution by hitting
1576C-g, because your Emacs is likely clean. 1576C-g, because your Emacs is likely clean.
1577 1577
1578When it is necessary to set `tramp-chunksize', you might consider to 1578When it is necessary to set `tramp-chunksize', you might consider to
1579use an out-of-the-band method (like \"scp\") instead of an internal one 1579use an out-of-the-band method \(like \"scp\"\) instead of an internal one
1580\(like \"ssh\"), because setting `tramp-chunksize' to non-nil decreases 1580\(like \"ssh\"\), because setting `tramp-chunksize' to non-nil decreases
1581performance. 1581performance.
1582 1582
1583If your Emacs is buggy, the code stops and gives you an indication 1583If your Emacs is buggy, the code stops and gives you an indication
@@ -3166,7 +3166,7 @@ value of `default-file-modes', without execute permissions."
3166 (when (file-directory-p directory) 3166 (when (file-directory-p directory)
3167 (setq directory (expand-file-name directory)) 3167 (setq directory (expand-file-name directory))
3168 (let* ((temp 3168 (let* ((temp
3169 (tramp-compat-copy-tree 3169 (copy-tree
3170 (with-parsed-tramp-file-name directory nil 3170 (with-parsed-tramp-file-name directory nil
3171 (with-file-property 3171 (with-file-property
3172 v localname 3172 v localname
@@ -3297,7 +3297,12 @@ value of `default-file-modes', without execute permissions."
3297 (tramp-shell-quote-argument localname) 3297 (tramp-shell-quote-argument localname)
3298 (tramp-shell-quote-argument filename) 3298 (tramp-shell-quote-argument filename)
3299 (if (symbol-value 3299 (if (symbol-value
3300 'read-file-name-completion-ignore-case) 3300 ;; `read-file-name-completion-ignore-case'
3301 ;; is introduced with Emacs 22.1.
3302 (if (boundp
3303 'read-file-name-completion-ignore-case)
3304 'read-file-name-completion-ignore-case
3305 'completion-ignore-case))
3301 1 0))) 3306 1 0)))
3302 3307
3303 (format (concat 3308 (format (concat
@@ -3382,7 +3387,6 @@ tramp-handle-file-name-all-completions: internal error accessing `%s': `%s'"
3382 "file-name-all-completions" 3387 "file-name-all-completions"
3383 result)))))))) 3388 result))))))))
3384 3389
3385;; The following isn't needed for Emacs 20 but for 19.34?
3386(defun tramp-handle-file-name-completion 3390(defun tramp-handle-file-name-completion
3387 (filename directory &optional predicate) 3391 (filename directory &optional predicate)
3388 "Like `file-name-completion' for Tramp files." 3392 "Like `file-name-completion' for Tramp files."
@@ -3650,9 +3654,13 @@ the uid and gid from FILENAME."
3650 "Unknown operation `%s', must be `copy' or `rename'" 3654 "Unknown operation `%s', must be `copy' or `rename'"
3651 op)))) 3655 op))))
3652 (localname1 3656 (localname1
3653 (if t1 (tramp-handle-file-remote-p filename 'localname) filename)) 3657 (if t1
3658 (tramp-file-name-handler 'file-remote-p filename 'localname)
3659 filename))
3654 (localname2 3660 (localname2
3655 (if t2 (tramp-handle-file-remote-p newname 'localname) newname)) 3661 (if t2
3662 (tramp-file-name-handler 'file-remote-p newname 'localname)
3663 newname))
3656 (prefix (file-remote-p (if t1 filename newname))) 3664 (prefix (file-remote-p (if t1 filename newname)))
3657 cmd-result) 3665 cmd-result)
3658 3666
@@ -3814,7 +3822,7 @@ The method used must be an out-of-band method."
3814 ;; Save exit. 3822 ;; Save exit.
3815 (condition-case nil 3823 (condition-case nil
3816 (if dir-flag 3824 (if dir-flag
3817 (delete-directory 3825 (tramp-compat-delete-directory
3818 (expand-file-name ".." tmpfile) 'recursive) 3826 (expand-file-name ".." tmpfile) 'recursive)
3819 (delete-file tmpfile)) 3827 (delete-file tmpfile))
3820 (error)))) 3828 (error))))
@@ -3841,10 +3849,11 @@ The method used must be an out-of-band method."
3841 port (or (and port (number-to-string port)) "")) 3849 port (or (and port (number-to-string port)) ""))
3842 3850
3843 ;; Compose copy command. 3851 ;; Compose copy command.
3844 (setq spec `((?h . ,host) (?u . ,user) (?p . ,port) 3852 (setq spec (format-spec-make
3845 (?t . ,(tramp-get-connection-property 3853 ?h host ?u user ?p port
3846 (tramp-get-connection-process v) "temp-file" "")) 3854 ?t (tramp-get-connection-property
3847 (?k . ,(if keep-date " " ""))) 3855 (tramp-get-connection-process v) "temp-file" "")
3856 ?k (if keep-date " " ""))
3848 copy-program (tramp-get-method-parameter 3857 copy-program (tramp-get-method-parameter
3849 method 'tramp-copy-program) 3858 method 'tramp-copy-program)
3850 copy-keep-date (tramp-get-method-parameter 3859 copy-keep-date (tramp-get-method-parameter
@@ -3934,7 +3943,7 @@ The method used must be an out-of-band method."
3934 (unless (eq op 'copy) 3943 (unless (eq op 'copy)
3935 (if (file-regular-p filename) 3944 (if (file-regular-p filename)
3936 (delete-file filename) 3945 (delete-file filename)
3937 (delete-directory filename 'recursive)))))) 3946 (tramp-compat-delete-directory filename 'recursive))))))
3938 3947
3939(defun tramp-handle-make-directory (dir &optional parents) 3948(defun tramp-handle-make-directory (dir &optional parents)
3940 "Like `make-directory' for Tramp files." 3949 "Like `make-directory' for Tramp files."
@@ -4863,9 +4872,9 @@ coding system might not be determined. This function repairs it."
4863 "Like `find-backup-file-name' for Tramp files." 4872 "Like `find-backup-file-name' for Tramp files."
4864 (with-parsed-tramp-file-name filename nil 4873 (with-parsed-tramp-file-name filename nil
4865 ;; We set both variables. It doesn't matter whether it is 4874 ;; We set both variables. It doesn't matter whether it is
4866 ;; Emacs or XEmacs 4875 ;; Emacs or XEmacs.
4867 (let ((backup-directory-alist 4876 (let ((backup-directory-alist
4868 ;; Emacs case 4877 ;; Emacs case.
4869 (when (boundp 'backup-directory-alist) 4878 (when (boundp 'backup-directory-alist)
4870 (if (symbol-value 'tramp-backup-directory-alist) 4879 (if (symbol-value 'tramp-backup-directory-alist)
4871 (mapcar 4880 (mapcar
@@ -4881,7 +4890,7 @@ coding system might not be determined. This function repairs it."
4881 (symbol-value 'backup-directory-alist)))) 4890 (symbol-value 'backup-directory-alist))))
4882 4891
4883 (bkup-backup-directory-info 4892 (bkup-backup-directory-info
4884 ;; XEmacs case 4893 ;; XEmacs case.
4885 (when (boundp 'bkup-backup-directory-info) 4894 (when (boundp 'bkup-backup-directory-info)
4886 (if (symbol-value 'tramp-bkup-backup-directory-info) 4895 (if (symbol-value 'tramp-bkup-backup-directory-info)
4887 (mapcar 4896 (mapcar
@@ -5295,7 +5304,7 @@ pass to the OPERATION."
5295 "Return file name related to OPERATION file primitive. 5304 "Return file name related to OPERATION file primitive.
5296ARGS are the arguments OPERATION has been called with." 5305ARGS are the arguments OPERATION has been called with."
5297 (cond 5306 (cond
5298 ; FILE resp DIRECTORY 5307 ;; FILE resp DIRECTORY.
5299 ((member operation 5308 ((member operation
5300 (list 'access-file 'byte-compiler-base-file-name 'delete-directory 5309 (list 'access-file 'byte-compiler-base-file-name 'delete-directory
5301 'delete-file 'diff-latest-backup-file 'directory-file-name 5310 'delete-file 'diff-latest-backup-file 'directory-file-name
@@ -5313,9 +5322,9 @@ ARGS are the arguments OPERATION has been called with."
5313 'load 'make-directory 'make-directory-internal 5322 'load 'make-directory 'make-directory-internal
5314 'set-file-modes 'substitute-in-file-name 5323 'set-file-modes 'substitute-in-file-name
5315 'unhandled-file-name-directory 'vc-registered 5324 'unhandled-file-name-directory 'vc-registered
5316 ; Emacs 22 only 5325 ;; Emacs 22+ only.
5317 'set-file-times 5326 'set-file-times
5318 ; XEmacs only 5327 ;; XEmacs only.
5319 'abbreviate-file-name 'create-file-buffer 5328 'abbreviate-file-name 'create-file-buffer
5320 'dired-file-modtime 'dired-make-compressed-filename 5329 'dired-file-modtime 'dired-make-compressed-filename
5321 'dired-recursive-delete-directory 'dired-set-file-modtime 5330 'dired-recursive-delete-directory 'dired-set-file-modtime
@@ -5325,14 +5334,14 @@ ARGS are the arguments OPERATION has been called with."
5325 (if (file-name-absolute-p (nth 0 args)) 5334 (if (file-name-absolute-p (nth 0 args))
5326 (nth 0 args) 5335 (nth 0 args)
5327 (expand-file-name (nth 0 args)))) 5336 (expand-file-name (nth 0 args))))
5328 ; FILE DIRECTORY resp FILE1 FILE2 5337 ;; FILE DIRECTORY resp FILE1 FILE2.
5329 ((member operation 5338 ((member operation
5330 (list 'add-name-to-file 'copy-file 'expand-file-name 5339 (list 'add-name-to-file 'copy-file 'expand-file-name
5331 'file-name-all-completions 'file-name-completion 5340 'file-name-all-completions 'file-name-completion
5332 'file-newer-than-file-p 'make-symbolic-link 'rename-file 5341 'file-newer-than-file-p 'make-symbolic-link 'rename-file
5333 ; Emacs 23 only 5342 ;; Emacs 23+ only.
5334 'copy-directory 5343 'copy-directory
5335 ; XEmacs only 5344 ;; XEmacs only.
5336 'dired-make-relative-symlink 5345 'dired-make-relative-symlink
5337 'vm-imap-move-mail 'vm-pop-move-mail 'vm-spool-move-mail)) 5346 'vm-imap-move-mail 'vm-pop-move-mail 'vm-spool-move-mail))
5338 (save-match-data 5347 (save-match-data
@@ -5340,39 +5349,39 @@ ARGS are the arguments OPERATION has been called with."
5340 ((string-match tramp-file-name-regexp (nth 0 args)) (nth 0 args)) 5349 ((string-match tramp-file-name-regexp (nth 0 args)) (nth 0 args))
5341 ((string-match tramp-file-name-regexp (nth 1 args)) (nth 1 args)) 5350 ((string-match tramp-file-name-regexp (nth 1 args)) (nth 1 args))
5342 (t (buffer-file-name (current-buffer)))))) 5351 (t (buffer-file-name (current-buffer))))))
5343 ; START END FILE 5352 ;; START END FILE.
5344 ((eq operation 'write-region) 5353 ((eq operation 'write-region)
5345 (nth 2 args)) 5354 (nth 2 args))
5346 ; BUF 5355 ;; BUFFER.
5347 ((member operation 5356 ((member operation
5348 (list 'set-visited-file-modtime 'verify-visited-file-modtime 5357 (list 'set-visited-file-modtime 'verify-visited-file-modtime
5349 ; since Emacs 22 only 5358 ;; Emacs 22+ only.
5350 'make-auto-save-file-name 5359 'make-auto-save-file-name
5351 ; XEmacs only 5360 ;; XEmacs only.
5352 'backup-buffer)) 5361 'backup-buffer))
5353 (buffer-file-name 5362 (buffer-file-name
5354 (if (bufferp (nth 0 args)) (nth 0 args) (current-buffer)))) 5363 (if (bufferp (nth 0 args)) (nth 0 args) (current-buffer))))
5355 ; COMMAND 5364 ;; COMMAND.
5356 ((member operation 5365 ((member operation
5357 (list ; not in Emacs 23 5366 (list ;; not in Emacs 23+.
5358 'dired-call-process 5367 'dired-call-process
5359 ; Emacs only 5368 ;; Emacs only.
5360 'shell-command 5369 'shell-command
5361 ; since Emacs 22 only 5370 ;; Emacs 22+ only.
5362 'process-file 5371 'process-file
5363 ; since Emacs 23 only 5372 ;; Emacs 23+ only.
5364 'start-file-process 5373 'start-file-process
5365 ; XEmacs only 5374 ;; XEmacs only.
5366 'dired-print-file 'dired-shell-call-process 5375 'dired-print-file 'dired-shell-call-process
5367 ; nowhere yet 5376 ;; nowhere yet.
5368 'executable-find 'start-process 'call-process)) 5377 'executable-find 'start-process 'call-process))
5369 default-directory) 5378 default-directory)
5370 ; unknown file primitive 5379 ;; Unknown file primitive.
5371 (t (error "unknown file I/O primitive: %s" operation)))) 5380 (t (error "unknown file I/O primitive: %s" operation))))
5372 5381
5373(defun tramp-find-foreign-file-name-handler (filename) 5382(defun tramp-find-foreign-file-name-handler (filename)
5374 "Return foreign file name handler if exists." 5383 "Return foreign file name handler if exists."
5375 (when (and (stringp filename) (tramp-tramp-file-p filename)) 5384 (when (tramp-tramp-file-p filename)
5376 (let ((v (tramp-dissect-file-name filename t)) 5385 (let ((v (tramp-dissect-file-name filename t))
5377 (handler tramp-foreign-file-name-handler-alist) 5386 (handler tramp-foreign-file-name-handler-alist)
5378 elt res) 5387 elt res)
@@ -6257,22 +6266,24 @@ from the default one."
6257 (format "*debug tramp/%s %s@%s*" method user host) 6266 (format "*debug tramp/%s %s@%s*" method user host)
6258 (format "*debug tramp/%s %s*" method host)))) 6267 (format "*debug tramp/%s %s*" method host))))
6259 6268
6269(defconst tramp-debug-outline-regexp
6270 "[0-9]+:[0-9]+:[0-9]+\\.[0-9]+ [a-z0-9-]+ (\\([0-9]+\\)) #")
6271
6260(defun tramp-get-debug-buffer (vec) 6272(defun tramp-get-debug-buffer (vec)
6261 "Get the debug buffer for VEC." 6273 "Get the debug buffer for VEC."
6262 (with-current-buffer 6274 (with-current-buffer
6263 (get-buffer-create (tramp-debug-buffer-name vec)) 6275 (get-buffer-create (tramp-debug-buffer-name vec))
6264 (when (bobp) 6276 (when (bobp)
6265 (setq buffer-undo-list t) 6277 (setq buffer-undo-list t)
6266 ;; Activate outline-mode. This runs `text-mode-hook' and 6278 ;; Activate `outline-mode'. This runs `text-mode-hook' and
6267 ;; `outline-mode-hook'. We must prevent that local processes 6279 ;; `outline-mode-hook'. We must prevent that local processes
6268 ;; die. Yes: I've seen `flyspell-mode', which starts "ispell" 6280 ;; die. Yes: I've seen `flyspell-mode', which starts "ispell".
6269 ;; ... 6281 ;; Furthermore, `outline-regexp' must have the correct value
6270 (let ((default-directory (tramp-compat-temporary-file-directory))) 6282 ;; already, because it is used by `font-lock-compile-keywords'.
6283 (let ((default-directory (tramp-compat-temporary-file-directory))
6284 (outline-regexp tramp-debug-outline-regexp))
6271 (outline-mode)) 6285 (outline-mode))
6272 (set (make-local-variable 'outline-regexp) 6286 (set (make-local-variable 'outline-regexp) tramp-debug-outline-regexp)
6273 "[0-9]+:[0-9]+:[0-9]+\\.[0-9]+ [a-z0-9-]+ (\\([0-9]+\\)) #")
6274; (set (make-local-variable 'outline-regexp)
6275; "[a-z.-]+:[0-9]+: [a-z0-9-]+ (\\([0-9]+\\)) #")
6276 (set (make-local-variable 'outline-level) 'tramp-outline-level)) 6287 (set (make-local-variable 'outline-level) 'tramp-outline-level))
6277 (current-buffer))) 6288 (current-buffer)))
6278 6289
@@ -6307,7 +6318,7 @@ This function expects to be in the right *tramp* buffer."
6307 (setq result (concat "\\" progname)))) 6318 (setq result (concat "\\" progname))))
6308 (unless result 6319 (unless result
6309 (when ignore-tilde 6320 (when ignore-tilde
6310 ;; Remove all ~/foo directories from dirlist. In Emacs 20, 6321 ;; Remove all ~/foo directories from dirlist. In XEmacs,
6311 ;; `remove' is in CL, and we want to avoid CL dependencies. 6322 ;; `remove' is in CL, and we want to avoid CL dependencies.
6312 (let (newdl d) 6323 (let (newdl d)
6313 (while dirlist 6324 (while dirlist
@@ -6624,7 +6635,7 @@ Erase echoed commands if exists."
6624 ;; Discard echo from remote output. 6635 ;; Discard echo from remote output.
6625 (tramp-set-connection-property proc "check-remote-echo" nil) 6636 (tramp-set-connection-property proc "check-remote-echo" nil)
6626 (tramp-message proc 5 "echo-mark found") 6637 (tramp-message proc 5 "echo-mark found")
6627 (forward-line) 6638 (forward-line 1)
6628 (delete-region begin (point)) 6639 (delete-region begin (point))
6629 (goto-char (point-min))))) 6640 (goto-char (point-min)))))
6630 6641
@@ -6895,7 +6906,7 @@ process to set up. VEC specifies the connection."
6895 "List of local coding commands for inline transfer. 6906 "List of local coding commands for inline transfer.
6896Each item is a list that looks like this: 6907Each item is a list that looks like this:
6897 6908
6898\(FORMAT ENCODING DECODING) 6909\(FORMAT ENCODING DECODING\)
6899 6910
6900FORMAT is symbol describing the encoding/decoding format. It can be 6911FORMAT is symbol describing the encoding/decoding format. It can be
6901`b64' for base64 encoding, `uu' for uu encoding, or `pack' for simple packing. 6912`b64' for base64 encoding, `uu' for uu encoding, or `pack' for simple packing.
@@ -6928,7 +6939,7 @@ with the encoded or decoded results, respectively.")
6928 "List of remote coding commands for inline transfer. 6939 "List of remote coding commands for inline transfer.
6929Each item is a list that looks like this: 6940Each item is a list that looks like this:
6930 6941
6931\(FORMAT ENCODING DECODING) 6942\(FORMAT ENCODING DECODING\)
6932 6943
6933FORMAT is symbol describing the encoding/decoding format. It can be 6944FORMAT is symbol describing the encoding/decoding format. It can be
6934`b64' for base64 encoding, `uu' for uu encoding, or `pack' for simple packing. 6945`b64' for base64 encoding, `uu' for uu encoding, or `pack' for simple packing.
@@ -7089,8 +7100,9 @@ Gateway hops are already opened."
7089 (setq proxy 7100 (setq proxy
7090 (format-spec 7101 (format-spec
7091 proxy 7102 proxy
7092 `((?u . ,(or (tramp-file-name-user (car target-alist)) "")) 7103 (format-spec-make
7093 (?h . ,(or (tramp-file-name-host (car target-alist)) ""))))) 7104 ?u (or (tramp-file-name-user (car target-alist)) "")
7105 ?h (or (tramp-file-name-host (car target-alist)) ""))))
7094 (with-parsed-tramp-file-name proxy l 7106 (with-parsed-tramp-file-name proxy l
7095 ;; Add the hop. 7107 ;; Add the hop.
7096 (add-to-list 'target-alist l) 7108 (add-to-list 'target-alist l)
@@ -7308,8 +7320,7 @@ connection if a previous connection has died for some reason."
7308 l-host (or l-host "") 7320 l-host (or l-host "")
7309 l-user (or l-user "") 7321 l-user (or l-user "")
7310 l-port (or l-port "") 7322 l-port (or l-port "")
7311 spec `((?h . ,l-host) (?u . ,l-user) (?p . ,l-port) 7323 spec (format-spec-make ?h l-host ?u l-user ?p l-port ?t tmpfile)
7312 (?t . ,tmpfile))
7313 command 7324 command
7314 (concat 7325 (concat
7315 ;; We do not want to see the trailing local prompt in 7326 ;; We do not want to see the trailing local prompt in
@@ -7981,7 +7992,7 @@ necessary only. This function will be used in file name completion."
7981 (tramp-get-connection-process vec) 7992 (tramp-get-connection-process vec)
7982 vec) 7993 vec)
7983 "remote-path" 7994 "remote-path"
7984 (let* ((remote-path (tramp-compat-copy-tree tramp-remote-path)) 7995 (let* ((remote-path (copy-tree tramp-remote-path))
7985 (elt1 (memq 'tramp-default-remote-path remote-path)) 7996 (elt1 (memq 'tramp-default-remote-path remote-path))
7986 (elt2 (memq 'tramp-own-remote-path remote-path)) 7997 (elt2 (memq 'tramp-own-remote-path remote-path))
7987 (default-remote-path 7998 (default-remote-path
@@ -8280,7 +8291,7 @@ If the `tramp-methods' entry does not exist, return NIL."
8280 (defadvice make-auto-save-file-name 8291 (defadvice make-auto-save-file-name
8281 (around tramp-advice-make-auto-save-file-name () activate) 8292 (around tramp-advice-make-auto-save-file-name () activate)
8282 "Invoke `tramp-handle-make-auto-save-file-name' for Tramp files." 8293 "Invoke `tramp-handle-make-auto-save-file-name' for Tramp files."
8283 (if (and (buffer-file-name) (tramp-tramp-file-p (buffer-file-name))) 8294 (if (tramp-tramp-file-p (buffer-file-name))
8284 ;; We cannot call `tramp-handle-make-auto-save-file-name' 8295 ;; We cannot call `tramp-handle-make-auto-save-file-name'
8285 ;; directly, because this would bypass the locking mechanism. 8296 ;; directly, because this would bypass the locking mechanism.
8286 (setq ad-return-value 8297 (setq ad-return-value
@@ -8294,14 +8305,13 @@ If the `tramp-methods' entry does not exist, return NIL."
8294 'around 'tramp-advice-make-auto-save-file-name) 8305 'around 'tramp-advice-make-auto-save-file-name)
8295 (ad-activate 'make-auto-save-file-name)))) 8306 (ad-activate 'make-auto-save-file-name))))
8296 8307
8297;; In Emacs < 22 and XEmacs < 21.5 autosaved remote files have 8308;; In XEmacs < 21.5, autosaved remote files have permission 0666 minus
8298;; permission 0666 minus umask. This is a security threat. 8309;; umask. This is a security threat.
8299 8310
8300(defun tramp-set-auto-save-file-modes () 8311(defun tramp-set-auto-save-file-modes ()
8301 "Set permissions of autosaved remote files to the original permissions." 8312 "Set permissions of autosaved remote files to the original permissions."
8302 (let ((bfn (buffer-file-name))) 8313 (let ((bfn (buffer-file-name)))
8303 (when (and (stringp bfn) 8314 (when (and (tramp-tramp-file-p bfn)
8304 (tramp-tramp-file-p bfn)
8305 (buffer-modified-p) 8315 (buffer-modified-p)
8306 (stringp buffer-auto-save-file-name) 8316 (stringp buffer-auto-save-file-name)
8307 (not (equal bfn buffer-auto-save-file-name))) 8317 (not (equal bfn buffer-auto-save-file-name)))
@@ -8313,10 +8323,9 @@ If the `tramp-methods' entry does not exist, return NIL."
8313 (set-file-modes buffer-auto-save-file-name 8323 (set-file-modes buffer-auto-save-file-name
8314 (or (file-modes bfn) (tramp-octal-to-decimal "0600")))))) 8324 (or (file-modes bfn) (tramp-octal-to-decimal "0600"))))))
8315 8325
8316(unless (or (> emacs-major-version 21) 8326(unless (and (featurep 'xemacs)
8317 (and (featurep 'xemacs) 8327 (= emacs-major-version 21)
8318 (= emacs-major-version 21) 8328 (> emacs-minor-version 4))
8319 (> emacs-minor-version 4)))
8320 (add-hook 'auto-save-hook 'tramp-set-auto-save-file-modes) 8329 (add-hook 'auto-save-hook 'tramp-set-auto-save-file-modes)
8321 (add-hook 'tramp-unload-hook 8330 (add-hook 'tramp-unload-hook
8322 (lambda () 8331 (lambda ()
@@ -8625,7 +8634,7 @@ Only works for Bourne-like shells."
8625;; expects only English messages? (Juri Linkov) 8634;; expects only English messages? (Juri Linkov)
8626;; * Make shadowfile.el grok Tramp filenames. (Bug#4526, Bug#4846) 8635;; * Make shadowfile.el grok Tramp filenames. (Bug#4526, Bug#4846)
8627;; * Do not handle files with drive letter as remote. (Bug#5447) 8636;; * Do not handle files with drive letter as remote. (Bug#5447)
8628;; * Load Tramp subpackages only when needed. (Bug#1529, Bug#5448) 8637;; * Load Tramp subpackages only when needed. (Bug#1529, Bug#5448, Bug#5705)
8629;; * Try telnet+curl as new method. It might be useful for busybox, 8638;; * Try telnet+curl as new method. It might be useful for busybox,
8630;; without built-in uuencode/uudecode. 8639;; without built-in uuencode/uudecode.
8631;; * Let `shell-dynamic-complete-*' and `comint-dynamic-complete' work 8640;; * Let `shell-dynamic-complete-*' and `comint-dynamic-complete' work
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index c5387a26722..471a344b860 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -1,8 +1,8 @@
1;;; trampver.el --- Transparent Remote Access, Multiple Protocol 1;;; trampver.el --- Transparent Remote Access, Multiple Protocol
2;;; lisp/trampver.el. Generated from trampver.el.in by configure. 2;;; lisp/trampver.el. Generated from trampver.el.in by configure.
3 3
4;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 4;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009,
5;; 2009, 2010 Free Software Foundation, Inc. 5;; 2010 Free Software Foundation, Inc.
6 6
7;; Author: Kai Großjohann <kai.grossjohann@gmx.net> 7;; Author: Kai Großjohann <kai.grossjohann@gmx.net>
8;; Keywords: comm, processes 8;; Keywords: comm, processes
@@ -24,19 +24,20 @@
24 24
25;;; Code: 25;;; Code:
26 26
27;; In the Tramp CVS repository, the version numer and the bug report address 27;; In the Tramp CVS repository, the version number and the bug report
28;; are auto-frobbed from configure.ac, so you should edit that file and run 28;; address are auto-frobbed from configure.ac, so you should edit that
29;; "autoconf && ./configure" to change them. (X)Emacs version check is defined 29;; file and run "autoconf && ./configure" to change them. (X)Emacs
30;; in macro AC_EMACS_INFO of aclocal.m4; should be changed only there. 30;; version check is defined in macro AC_EMACS_INFO of aclocal.m4;
31;; should be changed only there.
31 32
32(defconst tramp-version "2.1.18-23.2" 33(defconst tramp-version "2.1.19-pre"
33 "This version of Tramp.") 34 "This version of Tramp.")
34 35
35(defconst tramp-bug-report-address "tramp-devel@gnu.org" 36(defconst tramp-bug-report-address "tramp-devel@gnu.org"
36 "Email address to send bug reports to.") 37 "Email address to send bug reports to.")
37 38
38;; Check for (X)Emacs version. 39;; Check for (X)Emacs version.
39(let ((x (if (or (< emacs-major-version 21) (and (featurep 'xemacs) (= emacs-major-version 21) (< emacs-minor-version 4))) (format "Tramp 2.1.18-pre is not fit for %s" (when (string-match "^.*$" (emacs-version)) (match-string 0 (emacs-version)))) "ok"))) 40(let ((x (if (or (>= emacs-major-version 22) (and (featurep 'xemacs) (= emacs-major-version 21) (>= emacs-minor-version 4))) "ok" (format "Tramp 2.1.19-pre is not fit for %s" (when (string-match "^.*$" (emacs-version)) (match-string 0 (emacs-version)))))))
40 (unless (string-match "\\`ok\\'" x) (error "%s" x))) 41 (unless (string-match "\\`ok\\'" x) (error "%s" x)))
41 42
42(provide 'trampver) 43(provide 'trampver)