Mercurial > emacs
diff lisp/net/tramp.el @ 85024:ef71cdab0d5c
* net/tramp.el (top): Add tramp-compat to `tramp-unload-hook'.
(tramp-file-name-handler-alist): Add
`tramp-handle-insert-file-contents-literally'. Neded for XEmacs.
(tramp-make-temp-file): Use `make-temp-name'. `make-temp-file',
used before, creates the file already, which is not desired.
(tramp-do-copy-or-rename-file-directly): Simplify handling of
temporary file.
(tramp-handle-insert-file-contents): Assign the result in the
short track case.
(tramp-handle-insert-file-contents-literally): New defun.
(tramp-completion-mode-p): Revert change from 2007-09-24.
Checking for `return' etc as last character is not sufficient, for
example in dired-mode when entering <g> (revert-buffer) or
<s> (dired-sort).
* net/tramp-compat.el (top): Add also compatibility code for loading
appropriate timer package.
(tramp-compat-copy-tree): Check for `subrp' and `symbol-file' in
order to avoid autoloading problems.
* net/tramp-fish.el:
* net/tramp-smb.el: Move further compatibility code to
tramp-compat.el.
* net/tramp-ftp.el (tramp-ftp-file-name-handler): Handle the case
where the second parameter of `copy-file' or `rename-file' is a
remote file but not via ftp.
author | Michael Albinus <michael.albinus@gmx.de> |
---|---|
date | Wed, 03 Oct 2007 10:54:03 +0000 |
parents | f7642749252b |
children | a42b8750a992 |
line wrap: on
line diff
--- a/lisp/net/tramp.el Tue Oct 02 22:07:41 2007 +0000 +++ b/lisp/net/tramp.el Wed Oct 03 10:54:03 2007 +0000 @@ -73,18 +73,10 @@ (unload-feature 'trampver 'force)))) (require 'tramp-compat) - -;; `directory-sep-char' is an obsolete variable in Emacs. But it is -;; used in XEmacs, so we set it here and there. The following is needed -;; to pacify Emacs byte-compiler. -(eval-when-compile - (setq byte-compile-not-obsolete-var 'directory-sep-char)) - -(require 'custom) - -(if (featurep 'xemacs) - (require 'timer-funcs) - (require 'timer)) +(add-hook 'tramp-unload-hook + '(lambda () + (when (featurep 'tramp-compat) + (unload-feature 'tramp-compat 'force)))) (require 'format-spec) ;from Gnus 5.8, also in tar ball ;; As long as password.el is not part of (X)Emacs, it shouldn't @@ -176,7 +168,7 @@ :version "22.1") (defcustom tramp-verbose 3 - "*Verbosity level for tramp. + "*Verbosity level for Tramp. Any level x includes messages for all levels 1 .. x-1. The levels are 0 silent (no tramp messages at all) @@ -1279,7 +1271,7 @@ ((equal tramp-syntax 'sep) tramp-file-name-regexp-separate) ((equal tramp-syntax 'url) tramp-file-name-regexp-url) (t (error "Wrong `tramp-syntax' defined"))) - "*Regular expression matching file names handled by tramp. + "*Regular expression matching file names handled by Tramp. This regexp should match tramp file names but no other file names. \(When tramp.el is loaded, this regular expression is prepended to `file-name-handler-alist', and that is searched sequentially. Thus, @@ -1762,6 +1754,8 @@ (file-local-copy . tramp-handle-file-local-copy) (file-remote-p . tramp-handle-file-remote-p) (insert-file-contents . tramp-handle-insert-file-contents) + (insert-file-contents-literally + . tramp-handle-insert-file-contents-literally) (write-region . tramp-handle-write-region) (find-backup-file-name . tramp-handle-find-backup-file-name) (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) @@ -1982,9 +1976,9 @@ (defsubst tramp-make-temp-file (filename) (concat - (funcall (if (fboundp 'make-temp-file) 'make-temp-file 'make-temp-name) - (expand-file-name tramp-temp-name-prefix - (tramp-compat-temporary-file-directory))) + (make-temp-name + (expand-file-name + tramp-temp-name-prefix (tramp-compat-temporary-file-directory))) (file-name-extension filename t))) (defsubst tramp-make-tramp-temp-file (vec) @@ -3159,18 +3153,11 @@ (t2 (tramp-send-command v (format - "%s %s %s" cmd + "mv -f %s %s" (tramp-shell-quote-argument tmpfile) (tramp-shell-quote-argument localname2)))) (t1 - (if (eq op 'copy) - (tramp-compat-copy-file - tmpfile localname2 ok-if-already-exists - keep-date preserve-uid-gid) - (rename-file tmpfile localname2 ok-if-already-exists)))) - - ;; Remove temporary file. - (when (eq op 'copy) (delete-file tmpfile))))))) + (rename-file tmpfile localname2 ok-if-already-exists)))))))) ;; Set the time and mode. Mask possible errors. ;; Won't be applied for 'rename. @@ -3811,7 +3798,7 @@ (with-parsed-tramp-file-name filename nil (let ((rem-enc (tramp-get-remote-coding v "remote-encoding")) (loc-dec (tramp-get-local-coding v "local-decoding")) - (tmpfil (tramp-make-temp-file filename))) + (tmpfile (tramp-make-temp-file filename))) (unless (file-exists-p filename) (tramp-error v 'file-error @@ -3822,7 +3809,7 @@ ((or (tramp-local-host-p v) (and (tramp-method-out-of-band-p v) (> (nth 7 (file-attributes filename)) tramp-copy-size-limit))) - (copy-file filename tmpfil t t)) + (copy-file filename tmpfile t t)) ;; Use inline encoding for file transfer. (rem-enc @@ -3847,29 +3834,29 @@ filename loc-dec) (funcall loc-dec (point-min) (point-max)) (let ((coding-system-for-write 'binary)) - (write-region (point-min) (point-max) tmpfil)))) + (write-region (point-min) (point-max) tmpfile)))) ;; If tramp-decoding-function is not defined for this ;; method, we invoke tramp-decoding-command instead. - (let ((tmpfil2 (tramp-make-temp-file filename))) + (let ((tmpfile2 (tramp-make-temp-file filename))) (let ((coding-system-for-write 'binary)) - (write-region (point-min) (point-max) tmpfil2)) + (write-region (point-min) (point-max) tmpfile2)) (tramp-message v 5 "Decoding remote file %s with command %s..." filename loc-dec) - (tramp-call-local-coding-command loc-dec tmpfil2 tmpfil) - (delete-file tmpfil2))) + (tramp-call-local-coding-command loc-dec tmpfile2 tmpfile) + (delete-file tmpfile2))) (tramp-message v 5 "Decoding remote file %s...done" filename) ;; Set proper permissions. - (set-file-modes tmpfil (file-modes filename)) + (set-file-modes tmpfile (file-modes filename)) ;; Set local user ownership. - (tramp-set-file-uid-gid tmpfil))) + (tramp-set-file-uid-gid tmpfile))) ;; Oops, I don't know what to do. (t (tramp-error v 'file-error "Wrong method specification for `%s'" method))) (run-hooks 'tramp-handle-file-local-copy-hook) - tmpfil))) + tmpfile))) (defun tramp-handle-file-remote-p (filename &optional identification connected) "Like `file-remote-p' for Tramp files." @@ -3906,7 +3893,7 @@ (if (and (tramp-local-host-p v) (file-readable-p localname)) ;; Short track: if we are on the local host, we can run directly. - (insert-file-contents localname visit beg end replace) + (setq result (insert-file-contents localname visit beg end replace)) ;; `insert-file-contents-literally' takes care to avoid calling ;; jka-compr. By let-binding inhibit-file-name-operation, we @@ -3935,6 +3922,28 @@ (list (expand-file-name filename) (cadr result)))))) +;; This is needed for XEmacs only. Code stolen from files.el. +(defun tramp-handle-insert-file-contents-literally + (filename &optional visit beg end replace) + "Like `insert-file-contents-literally' for Tramp files." + (let ((format-alist nil) + (after-insert-file-functions nil) + (coding-system-for-read 'no-conversion) + (coding-system-for-write 'no-conversion) + (find-buffer-file-type-function + (if (fboundp 'find-buffer-file-type) + (symbol-function 'find-buffer-file-type) + nil)) + (inhibit-file-name-handlers '(jka-compr-handler image-file-handler)) + (inhibit-file-name-operation 'insert-file-contents)) + (unwind-protect + (progn + (fset 'find-buffer-file-type (lambda (filename) t)) + (insert-file-contents filename visit beg end replace)) + (if find-buffer-file-type-function + (fset 'find-buffer-file-type find-buffer-file-type-function) + (fmakunbound 'find-buffer-file-type))))) + (defun tramp-handle-find-backup-file-name (filename) "Like `find-backup-file-name' for Tramp files." (with-parsed-tramp-file-name filename nil @@ -4041,7 +4050,7 @@ ;; (error ;; "tramp-handle-write-region: LOCKNAME must be nil or equal FILENAME")) - ;; XEmacs takes a coding system as the seventh argument, not `confirm' + ;; XEmacs takes a coding system as the seventh argument, not `confirm'. (when (and (not (featurep 'xemacs)) confirm (file-exists-p filename)) (unless (y-or-n-p (format "File %s exists; overwrite anyway? " filename)) (tramp-error v 'file-error "File not overwritten"))) @@ -4059,7 +4068,7 @@ ;; Write region into a tmp file. This isn't really needed if we ;; use an encoding function, but currently we use it always ;; because this makes the logic simpler. - (tmpfil (tramp-make-temp-file filename))) + (tmpfile (tramp-make-temp-file filename))) (if (and (tramp-local-host-p v) (file-writable-p (file-name-directory localname))) @@ -4075,8 +4084,8 @@ (tramp-run-real-handler 'write-region (if confirm ; don't pass this arg unless defined for backward compat. - (list start end tmpfil append 'no-message lockname confirm) - (list start end tmpfil append 'no-message lockname))) + (list start end tmpfile append 'no-message lockname confirm) + (list start end tmpfile append 'no-message lockname))) ;; Now, `last-coding-system-used' has the right value. Remember it. (when (boundp 'last-coding-system-used) (setq coding-system-used (symbol-value 'last-coding-system-used))) @@ -4084,7 +4093,7 @@ ;; filename does not exist (eq modes nil) it has been renamed to ;; the backup file. This case `save-buffer' handles ;; permissions. - (when modes (set-file-modes tmpfil modes)) + (when modes (set-file-modes tmpfile modes)) ;; This is a bit lengthy due to the different methods possible for ;; file transfer. First, we check whether the method uses an rcp @@ -4098,11 +4107,11 @@ (and (tramp-method-out-of-band-p v) (integerp start) (> (- end start) tramp-copy-size-limit))) - (rename-file tmpfil filename t)) + (rename-file tmpfile filename t)) ;; Use inline file transfer (rem-dec - ;; Encode tmpfil + ;; Encode tmpfile (tramp-message v 5 "Encoding region...") (unwind-protect (with-temp-buffer @@ -4113,7 +4122,7 @@ v 5 "Encoding region using function `%s'..." (symbol-name loc-enc)) (let ((coding-system-for-read 'binary)) - (insert-file-contents-literally tmpfil)) + (insert-file-contents-literally tmpfile)) ;; CCC. The following `let' is a workaround for ;; the base64.el that comes with pgnus-0.84. If ;; both of the following conditions are @@ -4130,7 +4139,7 @@ (tramp-message v 5 "Encoding region using command `%s'..." loc-enc) (unless (equal 0 (tramp-call-local-coding-command - loc-enc tmpfil t)) + loc-enc tmpfile t)) (tramp-error v 'file-error "Cannot write to `%s', local encoding command `%s' failed" @@ -4156,14 +4165,14 @@ filename rem-dec) ;; When `file-precious-flag' is set, the region is ;; written to a temporary file. Check that the - ;; checksum is equal to that from the local tmpfil. + ;; checksum is equal to that from the local tmpfile. (when file-precious-flag (erase-buffer) (and ;; cksum runs locally (let ((default-directory (tramp-compat-temporary-file-directory))) - (zerop (call-process "cksum" tmpfil t))) + (zerop (call-process "cksum" tmpfile t))) ;; cksum runs remotely (zerop (tramp-send-command-and-check @@ -4184,7 +4193,7 @@ (tramp-flush-file-property v localname)) ;; Save exit. - (delete-file tmpfil))) + (delete-file tmpfile))) ;; That's not expected. (t @@ -4568,22 +4577,32 @@ "Checks whether method / user name / host name completion is active." (or ;; Emacs - (not (memq last-input-event '(return newline))) + (equal last-input-event 'tab) (and (natnump last-input-event) - (not (char-equal last-input-event ?\n)) - (not (char-equal last-input-event ?\r))) + (or + ;; ?\t has event-modifier 'control + (char-equal last-input-event ?\t) + (and (not (event-modifiers last-input-event)) + (or (char-equal last-input-event ?\?) + (char-equal last-input-event ?\ ))))) ;; XEmacs (and (featurep 'xemacs) ;; `last-input-event' might be nil. (not (null last-input-event)) ;; `last-input-event' may have no character approximation. (funcall (symbol-function 'event-to-character) last-input-event) - (not (char-equal - (funcall (symbol-function 'event-to-character) - last-input-event) ?\n)) - (not (char-equal - (funcall (symbol-function 'event-to-character) - last-input-event) ?\r))))) + (or + ;; ?\t has event-modifier 'control + (char-equal + (funcall (symbol-function 'event-to-character) + last-input-event) ?\t) + (and (not (event-modifiers last-input-event)) + (or (char-equal + (funcall (symbol-function 'event-to-character) + last-input-event) ?\?) + (char-equal + (funcall (symbol-function 'event-to-character) + last-input-event) ?\ ))))))) ;; Method, host name and user name completion. ;; `tramp-completion-dissect-file-name' returns a list of @@ -6644,8 +6663,7 @@ (tramp-equal-remote \"/sudo::/etc\" \"/su::/etc\")" (and (stringp (file-remote-p file1)) (stringp (file-remote-p file2)) - (string-equal (file-remote-p file1) - (file-remote-p file2)))) + (string-equal (file-remote-p file1) (file-remote-p file2)))) (defun tramp-make-tramp-file-name (method user host localname) "Constructs a Tramp file name from METHOD, USER, HOST and LOCALNAME." @@ -7261,7 +7279,7 @@ If you can give a simple set of instructions to make this bug happen reliably, please include those. Thank you for helping -kill bugs in TRAMP. +kill bugs in Tramp. Another useful thing to do is to put