]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/tramp.el (top): Put load of all tramp-* files into a dolist.
authorMichael Albinus <michael.albinus@gmx.de>
Sun, 21 Oct 2007 14:02:38 +0000 (14:02 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Sun, 21 Oct 2007 14:02:38 +0000 (14:02 +0000)
Require tramp-cmds.el.
(tramp-make-tramp-temp-file): We can get rid of DONT-CREATE.
(tramp-handle-file-name-all-completions): Expand DIRECTORY.
 (tramp-do-copy-or-rename-file-directly): Make more rigid checks.
(tramp-do-copy-or-rename-file-out-of-band)
(tramp-maybe-open-connection): Use `make-temp-name'.  This is
possible, because we don't need to create the temporary file, but
we need a prefix for ssh, which has its own temporary file
handling.
(tramp-handle-delete-directory): Add "-f" to rmdir.
(tramp-handle-dired-recursive-delete-directory): Call "rm -rf".
(tramp-handle-insert-file-contents): Don't raise a tramp-error but
a signal, in order to give the callee a chance to suppress.
(tramp-handle-write-region): Set owner also in case of short
track.  Don't use compatibility calls for `write-region' anymore.
(tramp-clear-passwd): Add parameter VEC.  Adapt all callees.
(tramp-append-tramp-buffers): Apply `tramp-list-tramp-buffers'.

* net/tramp-cmds.el: New file.

* net/tramp-gw.el (tramp-gw-basic-authentication): Apply VEC to
`tramp-clear-passwd'.

* net/trampver.el: Update release number.

lisp/ChangeLog
lisp/net/tramp-cmds.el [new file with mode: 0644]
lisp/net/tramp-gw.el
lisp/net/tramp.el
lisp/net/trampver.el

index bd281c4521eb034736e3775e002da10b44b0374f..de0b965335f658127ff13887753265b1cd7a8db0 100644 (file)
@@ -6,6 +6,32 @@
        * net/ange-ftp.el (ange-ftp-copy-file): Add PRESERVE-UID-GID for
        compatibility.  It is not used, though.
 
+       * net/tramp.el (top): Put load of all tramp-* files into a dolist.
+       Require tramp-cmds.el.
+       (tramp-make-tramp-temp-file): We can get rid of DONT-CREATE.
+       (tramp-handle-file-name-all-completions): Expand DIRECTORY.
+        (tramp-do-copy-or-rename-file-directly): Make more rigid checks.
+       (tramp-do-copy-or-rename-file-out-of-band)
+       (tramp-maybe-open-connection): Use `make-temp-name'.  This is
+       possible, because we don't need to create the temporary file, but
+       we need a prefix for ssh, which has its own temporary file
+       handling.
+       (tramp-handle-delete-directory): Add "-f" to rmdir.
+       (tramp-handle-dired-recursive-delete-directory): Call "rm -rf".
+       (tramp-handle-insert-file-contents): Don't raise a tramp-error but
+       a signal, in order to give the callee a chance to suppress.
+       (tramp-handle-write-region): Set owner also in case of short
+       track.  Don't use compatibility calls for `write-region' anymore.
+       (tramp-clear-passwd): Add parameter VEC.  Adapt all callees.
+       (tramp-append-tramp-buffers): Apply `tramp-list-tramp-buffers'.
+
+       * net/tramp-cmds.el: New file.
+
+       * net/tramp-gw.el (tramp-gw-basic-authentication): Apply VEC to
+       `tramp-clear-passwd'.
+
+       * net/trampver.el: Update release number.
+
 2007-10-21  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * progmodes/gud.el (gud-target-name): Move definition before use.
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
new file mode 100644 (file)
index 0000000..43df393
--- /dev/null
@@ -0,0 +1,147 @@
+;;; tramp-cmds.el --- Interactive commands for Tramp
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Michael Albinus <michael.albinus@gmx.de>
+;; Keywords: comm, processes
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, see
+;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides all interactive commands which are releated
+;; to Tramp.
+
+;;; Code:
+
+(require 'tramp)
+
+(defun tramp-list-tramp-buffers ()
+  "Return a list of all Tramp connection buffers."
+  (append
+   (all-completions
+    "*tramp" (mapcar 'list (mapcar 'buffer-name (buffer-list))))
+   (all-completions
+    "*debug tramp" (mapcar 'list (mapcar 'buffer-name (buffer-list))))))
+
+(defun tramp-list-remote-buffers ()
+  "Return a list of all buffers with remote default-directory."
+  (delq
+   nil
+   (mapcar
+    (lambda (x)
+      (with-current-buffer x
+       (when (and (stringp default-directory)
+                  (file-remote-p default-directory))
+         x)))
+    (buffer-list))))
+
+(defun tramp-cleanup-connection (vec)
+  "Flush all connection related objects.
+This includes password cache, file cache, connection cache, buffers.
+When called interactively, a Tramp connection has to be selected."
+  (interactive
+   ;; When interactive, select the Tramp remote identification.
+   ;; Return nil when there is no Tramp connection.
+   (list
+    (let ((connections
+          (mapcar
+           (lambda (x)
+             (with-current-buffer x (list (file-remote-p default-directory))))
+           ;; We shall not count debug buffers, because their
+           ;; default-directory is random.  It could be even a remote
+           ;; one from another connection.
+           (all-completions
+            "*tramp" (mapcar 'list (tramp-list-tramp-buffers)))))
+         name)
+
+      (when connections
+       (setq name
+             (completing-read
+              "Enter Tramp connection: " connections nil t
+              (try-completion "" connections)))
+       (when (and name (file-remote-p name))
+         (with-parsed-tramp-file-name name nil v))))))
+
+  (if (not vec)
+      ;; Nothing to do.
+      (message "No Tramp connection found.")
+
+    ;; Flush password cache.
+    (tramp-clear-passwd vec)
+
+    ;; Flush file cache.
+    (tramp-flush-directory-property vec "/")
+
+    ;; Flush connection cache.
+    (tramp-flush-connection-property (tramp-get-connection-process vec) nil)
+    (tramp-flush-connection-property vec nil)
+
+    ;; Remove buffers.
+    (dolist
+       (buf (list (get-buffer (tramp-buffer-name vec))
+                  (get-buffer (tramp-debug-buffer-name vec))
+                  (tramp-get-connection-property vec "process-buffer" nil)))
+      (when (bufferp buf) (kill-buffer buf)))))
+
+(defun tramp-cleanup-all-connections ()
+  "Flush all Tramp internal objects.
+This includes password cache, file cache, connection cache, buffers."
+  (interactive)
+
+  ;; Flush password cache.
+  (when (functionp 'password-reset)
+    (funcall (symbol-function 'password-reset)))
+
+  ;; Flush file and connection cache.
+  (clrhash tramp-cache-data)
+
+  ;; Remove buffers.
+  (dolist (name (tramp-list-tramp-buffers))
+    (when (bufferp (get-buffer name)) (kill-buffer name))))
+
+(defun tramp-cleanup-all-buffers ()
+  "Kill all remote buffers."
+  (interactive)
+
+  ;; Remove all Tramp related buffers.
+  (tramp-cleanup-all-connections)
+
+  ;; Remove all buffers with a remote default-directory.
+  (dolist (name (tramp-list-remote-buffers))
+    (when (bufferp (get-buffer name)) (kill-buffer name))))
+
+(provide 'tramp-cmds)
+
+;;; TODO:
+
+;; * Clean up unused *tramp/foo* buffers after a while.  (Pete Forman)
+;; * WIBNI there was an interactive command prompting for tramp
+;;   method, hostname, username and filename and translates the user
+;;   input into the correct filename syntax (depending on the Emacs
+;;   flavor) (Reiner Steib)
+;; * Let the user edit the connection properties interactively.
+;;   Something like `gnus-server-edit-server' in Gnus' *Server* buffer.
+;; * It's just that when I come to Customize `tramp-default-user-alist'
+;;   I'm presented with a mismatch and raw lisp for a value.  It is my
+;;   understanding that a variable declared with defcustom is a User
+;;   Option and should not be modified by the code.  add-to-list is
+;;   called in several places. One way to handle that is to have a new
+;;   ordinary variable that gets its initial value from
+;;   tramp-default-user-alist and then is added to. (Pete Forman)
+
+;;; tramp-cmds.el ends here
index 70a37f384fe6e6a9cfd75f1c096a539d6963af29..fa2e9ba68b05e6f3b1c77c5aa62bf7f461a3fc0d 100644 (file)
@@ -284,12 +284,11 @@ PROXY is an indication whether we need a Proxy-Authorization header
 or an Authorization header.  If PW-CACHE is non-nil, check for
 password in password cache.  This is done for the first try only."
 
-  ;; `tramp-current-*' must be set for `tramp-read-passwd' and
-  ;; `tramp-clear-passwd'.
+  ;; `tramp-current-*' must be set for `tramp-read-passwd'.
   (let ((tramp-current-method (tramp-file-name-method tramp-gw-gw-vector))
        (tramp-current-user (tramp-file-name-user tramp-gw-gw-vector))
        (tramp-current-host (tramp-file-name-host tramp-gw-gw-vector)))
-    (unless pw-cache (tramp-clear-passwd))
+    (unless pw-cache (tramp-clear-passwd tramp-gw-gw-vector))
     ;; We are already in the right buffer.
     (tramp-message
      tramp-gw-vector 5 "%s required"
index 0af9c457995ffa08c7b6c6ea7e1fcc87d1bcba0f..10c2043b2043a6c1c5765410769a62fd55faa65e 100644 (file)
 ;; The following Tramp packages must be loaded after Tramp, because
 ;; they require Tramp as well.
 (eval-after-load "tramp"
-  '(progn
+  '(dolist
+       (feature
+       (list
+
+        ;; Tramp commands.
+        'tramp-cmds
+
+        ;; Load foreign FTP method.
+        (if (featurep 'xemacs) 'tramp-efs 'tramp-ftp)
+
+        ;; tramp-smb uses "smbclient" from Samba.  Not available
+        ;; under Cygwin and Windows, because they don't offer
+        ;; "smbclient".  And even not necessary there, because Emacs
+        ;; supports UNC file names like "//host/share/localname".
+        (unless (memq system-type '(cygwin windows-nt)) 'tramp-smb)
+
+        ;; Load foreign FISH method.
+        'tramp-fish
 
-     ;; Load foreign FTP method.
-     (let ((feature (if (featurep 'xemacs) 'tramp-efs 'tramp-ftp)))
+        ;; Load gateways.  It needs `make-network-process' from Emacs 22.
+        (when (functionp 'make-network-process) 'tramp-gw)))
+
+     (when feature
        (require feature)
        (add-hook 'tramp-unload-hook
                 `(lambda ()
                    (when (featurep ,feature)
-                     (unload-feature ,feature 'force)))))
-
-     ;; tramp-smb uses "smbclient" from Samba.  Not available under
-     ;; Cygwin and Windows, because they don't offer "smbclient".  And
-     ;; even not necessary there, because Emacs supports UNC file names
-     ;; like "//host/share/localname".
-     (unless (memq system-type '(cygwin windows-nt))
-       (require 'tramp-smb)
-       (add-hook 'tramp-unload-hook
-                '(lambda ()
-                   (when (featurep 'tramp-smb)
-                     (unload-feature 'tramp-smb 'force)))))
-
-     ;; Load foreign FISH method.
-     (require 'tramp-fish)
-     (add-hook 'tramp-unload-hook
-              '(lambda ()
-                 (when (featurep 'tramp-fish)
-                   (unload-feature 'tramp-fish 'force))))
-
-     ;; Load gateways.  It needs `make-network-process' from Emacs 22.
-     (when (functionp 'make-network-process)
-       (require 'tramp-gw)
-       (add-hook 'tramp-unload-hook
-                '(lambda ()
-                   (when (featurep 'tramp-gw)
-                     (unload-feature 'tramp-gw 'force)))))))
+                     (unload-feature ,feature 'force)))))))
 
 ;;; User Customizable Internal Variables:
 
@@ -1965,42 +1958,30 @@ The intent is to protect against `obsolete variable' warnings."
 (put 'tramp-let-maybe 'lisp-indent-function 2)
 (put 'tramp-let-maybe 'edebug-form-spec t)
 
-(defsubst tramp-make-tramp-temp-file (vec &optional dont-create)
+(defsubst tramp-make-tramp-temp-file (vec)
   "Create a temporary file on the remote host identified by VEC.
-Return the local name of the temporary file.
-If DONT-CREATE is non-nil, just the file name is returned without
-creation of the temporary file.  This is not the preferred way to run,
-but it is necessary during connection setup, because we cannot create
-a remote file at this time.  This parameter shall NOT be set to
-non-nil else."
-  (if dont-create
-      ;; It sounds a little bit stupid to create a LOCAL file name.
-      ;; But we intend to use the remote directory "/tmp", and we have
-      ;; no chance to check whether a temporary file exists already
-      ;; remotely, because we have no working connection yet.
-      (make-temp-name (expand-file-name tramp-temp-name-prefix "/tmp"))
-
-    (let ((prefix
-          (tramp-make-tramp-file-name
-           (tramp-file-name-method vec)
-           (tramp-file-name-user vec)
-           (tramp-file-name-host vec)
-           (expand-file-name tramp-temp-name-prefix "/tmp")))
-         result)
-      (while (not result)
-       ;; `make-temp-file' would be the first choice for
-       ;; implementation.  But it calls `write-region' internally,
-       ;; which also needs a temporary file - we would end in an
-       ;; infinite loop.
-       (setq result (make-temp-name prefix))
-       (if (file-exists-p result)
-           (setq result nil)
-         ;; This creates the file by side effect.
-         (set-file-times result)
-         (set-file-modes result (tramp-octal-to-decimal "0700"))))
-
-      ;; Return the local part.
-      (with-parsed-tramp-file-name result nil localname))))
+Return the local name of the temporary file."
+  (let ((prefix
+        (tramp-make-tramp-file-name
+         (tramp-file-name-method vec)
+         (tramp-file-name-user vec)
+         (tramp-file-name-host vec)
+         (expand-file-name tramp-temp-name-prefix "/tmp")))
+       result)
+    (while (not result)
+      ;; `make-temp-file' would be the natural choice for
+      ;; implementation.  But it calls `write-region' internally,
+      ;; which also needs a temporary file - we would end in an
+      ;; infinite loop.
+      (setq result (make-temp-name prefix))
+      (if (file-exists-p result)
+         (setq result nil)
+       ;; This creates the file by side effect.
+       (set-file-times result)
+       (set-file-modes result (tramp-octal-to-decimal "0700"))))
+
+    ;; Return the local part.
+    (with-parsed-tramp-file-name result nil localname)))
 
 
 ;;; Config Manipulation Functions:
@@ -2824,7 +2805,7 @@ and gid of the corresponding user is taken.  Both parameters must be integers."
 (defun tramp-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
   (unless (save-match-data (string-match "/" filename))
-    (with-parsed-tramp-file-name directory nil
+    (with-parsed-tramp-file-name (expand-file-name directory) nil
       (all-completions
        filename
        (mapcar
@@ -3114,7 +3095,9 @@ the uid and gid from FILENAME."
          (cond
           ;; We can do it directly.
           ((and (file-readable-p localname1)
-                (file-writable-p (file-name-directory localname2)))
+                (file-writable-p (file-name-directory localname2))
+                (or (file-directory-p localname2)
+                    (file-writable-p localname2)))
            (if (eq op 'copy)
                (tramp-compat-copy-file
                 localname1 localname2 ok-if-already-exists
@@ -3209,7 +3192,8 @@ be a local filename.  The method used must be an out-of-band method."
 
       ;; Compose copy command.
       (setq spec `((?h . ,host) (?u . ,user) (?p . ,port)
-                  (?t . ,(tramp-make-tramp-temp-file v 'dont-create))
+                  (?t . ,(tramp-get-connection-property
+                          (tramp-get-connection-process v) "temp-file" ""))
                   (?k . ,(if keep-date " " "")))
            copy-program (tramp-get-method-parameter
                          method 'tramp-copy-program)
@@ -3224,8 +3208,7 @@ be a local filename.  The method used must be an out-of-band method."
                  ;; " " is indication for keep-date argument.
                  x (delete " " (mapcar '(lambda (y) (format-spec y spec)) x)))
                 (unless (member "" x) (mapconcat 'identity x " ")))
-             (tramp-get-method-parameter
-              method 'tramp-copy-args))))
+             (tramp-get-method-parameter method 'tramp-copy-args))))
 
       ;; Check for program.
       (when (and (fboundp 'executable-find)
@@ -3293,7 +3276,7 @@ be a local filename.  The method used must be an out-of-band method."
     (save-excursion
       (tramp-barf-unless-okay
        v
-       (format " %s %s"
+       (format "%s %s"
               (if parents "mkdir -p" "mkdir")
               (tramp-shell-quote-argument localname))
        "Couldn't make directory %s" dir))))
@@ -3305,7 +3288,7 @@ be a local filename.  The method used must be an out-of-band method."
     (tramp-flush-directory-property v localname)
     (unless (zerop (tramp-send-command-and-check
                    v
-                   (format "rmdir %s"
+                   (format "rmdir -f %s"
                            (tramp-shell-quote-argument localname))))
       (tramp-error v 'file-error "Couldn't delete %s" directory))))
 
@@ -3336,7 +3319,7 @@ This is like `dired-recursive-delete-directory' for Tramp files."
     ;; Which is better, -r or -R? (-r works for me <daniel@danann.net>)
     (tramp-send-command
      v
-     (format "rm -r %s" (tramp-shell-quote-argument localname))
+     (format "rm -rf %s" (tramp-shell-quote-argument localname))
      ;; Don't read the output, do it explicitely.
      nil t)
     ;; Wait for the remote system to return to us...
@@ -3896,8 +3879,9 @@ beginning of local filename are not substituted."
              (setq buffer-file-name filename)
              (set-visited-file-modtime)
              (set-buffer-modified-p nil))
-           (tramp-error
-            v 'file-error "File %s not found on remote host" filename)
+           ;; We don't raise a Tramp error, because it might be
+           ;; suppressed, like in `find-file-noselect-1'.
+           (signal 'file-error (list "File not found on remote host" filename))
            (list (expand-file-name filename) 0))
 
        (if (and (tramp-local-host-p v)
@@ -4065,166 +4049,177 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
       (unless (y-or-n-p (format "File %s exists; overwrite anyway? " filename))
        (tramp-error v 'file-error "File not overwritten")))
 
-    (if (and (tramp-local-host-p v)
-            (file-writable-p (file-name-directory localname)))
-       ;; Short track: if we are on the local host, we can run directly.
-       (if confirm
-           (write-region
-            start end localname append 'no-message lockname confirm)
-         (write-region start end localname append 'no-message lockname))
-
-      (let ((rem-dec (tramp-get-remote-coding v "remote-decoding"))
-           (loc-enc (tramp-get-local-coding v "local-encoding"))
-           (modes (save-excursion (file-modes filename)))
-           ;; We use this to save the value of `last-coding-system-used'
-           ;; after writing the tmp file.  At the end of the function,
-           ;; we set `last-coding-system-used' to this saved value.
-           ;; This way, any intermediary coding systems used while
-           ;; talking to the remote shell or suchlike won't hose this
-           ;; variable.  This approach was snarfed from ange-ftp.el.
-           coding-system-used
-           ;; 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.
-           (tmpfile (tramp-compat-make-temp-file filename)))
-
-       ;; We say `no-message' here because we don't want the visited file
-       ;; modtime data to be clobbered from the temp file.  We call
-       ;; `set-visited-file-modtime' ourselves later on.
-       (tramp-run-real-handler
-        'write-region
-        (if confirm ; don't pass this arg unless defined for backward compat.
-            (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)))
-       ;; The permissions of the temporary file should be set.  If
-       ;; filename does not exist (eq modes nil) it has been renamed to
-       ;; the backup file.  This case `save-buffer' handles
-       ;; permissions.
-       (when modes (set-file-modes 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
-       ;; program.  If so, we call it.  Otherwise, both encoding and
-       ;; decoding command must be specified.  However, if the method
-       ;; _also_ specifies an encoding function, then that is used for
-       ;; encoding the contents of the tmp file.
-       (cond
-        ;; `rename-file' handles direct copy and out-of-band methods.
-        ((or (tramp-local-host-p v)
-             (and (tramp-method-out-of-band-p v)
-                  (integerp start)
-                  (> (- end start) tramp-copy-size-limit)))
-         (rename-file tmpfile filename t))
-
-        ;; Use inline file transfer
-        (rem-dec
-         ;; Encode tmpfile
-         (tramp-message v 5 "Encoding region...")
-         (unwind-protect
-             (with-temp-buffer
-               ;; Use encoding function or command.
-               (if (and (symbolp loc-enc) (fboundp loc-enc))
-                   (progn
-                     (tramp-message
-                      v 5 "Encoding region using function `%s'..."
-                      (symbol-name loc-enc))
-                     (let ((coding-system-for-read 'binary))
-                       (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
-                     ;; satisfied, it tries to write to a local file
-                     ;; in default-directory, but at this point,
-                     ;; default-directory is remote.
-                     ;; (CALL-PROCESS-REGION can't write to remote
-                     ;; files, it seems.)  The file in question is a
-                     ;; tmp file anyway.
-                     (let ((default-directory
-                             (tramp-compat-temporary-file-directory)))
-                       (funcall loc-enc (point-min) (point-max))))
+    (let ((uid (or (nth 2 (file-attributes filename 'integer))
+                  (tramp-get-remote-uid v 'integer)))
+         (gid (or (nth 3 (file-attributes filename 'integer))
+                  (tramp-get-remote-gid v 'integer))))
+
+      (if (and (tramp-local-host-p v)
+              (file-writable-p (file-name-directory localname))
+              (or (file-directory-p localname)
+                  (file-writable-p localname)))
+         ;; Short track: if we are on the local host, we can run directly.
+         (write-region start end localname append 'no-message lockname confirm)
+
+       (let ((rem-dec (tramp-get-remote-coding v "remote-decoding"))
+             (loc-enc (tramp-get-local-coding v "local-encoding"))
+             (modes (save-excursion (file-modes filename)))
+             ;; We use this to save the value of
+             ;; `last-coding-system-used' after writing the tmp file.
+             ;; At the end of the function, we set
+             ;; `last-coding-system-used' to this saved value.  This
+             ;; way, any intermediary coding systems used while
+             ;; talking to the remote shell or suchlike won't hose
+             ;; this variable.  This approach was snarfed from
+             ;; ange-ftp.el.
+             coding-system-used
+             ;; 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.
+             (tmpfile (tramp-compat-make-temp-file filename)))
+
+         ;; We say `no-message' here because we don't want the
+         ;; visited file modtime data to be clobbered from the temp
+         ;; file.  We call `set-visited-file-modtime' ourselves later
+         ;; on.
+         (tramp-run-real-handler
+          'write-region
+          (list start end tmpfile append 'no-message lockname confirm))
+         ;; 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)))
+         ;; The permissions of the temporary file should be set.  If
+         ;; filename does not exist (eq modes nil) it has been
+         ;; renamed to the backup file.  This case `save-buffer'
+         ;; handles permissions.
+         (when modes (set-file-modes 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 program.  If so, we call it.
+         ;; Otherwise, both encoding and decoding command must be
+         ;; specified.  However, if the method _also_ specifies an
+         ;; encoding function, then that is used for encoding the
+         ;; contents of the tmp file.
+         (cond
+          ;; `rename-file' handles direct copy and out-of-band methods.
+          ((or (tramp-local-host-p v)
+               (and (tramp-method-out-of-band-p v)
+                    (integerp start)
+                    (> (- end start) tramp-copy-size-limit)))
+           (rename-file tmpfile filename t))
+
+          ;; Use inline file transfer
+          (rem-dec
+           ;; Encode tmpfile
+           (tramp-message v 5 "Encoding region...")
+           (unwind-protect
+               (with-temp-buffer
+                 ;; Use encoding function or command.
+                 (if (and (symbolp loc-enc) (fboundp loc-enc))
+                     (progn
+                       (tramp-message
+                        v 5 "Encoding region using function `%s'..."
+                        (symbol-name loc-enc))
+                       (let ((coding-system-for-read 'binary))
+                         (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 satisfied, it tries to write
+                       ;; to a local file in default-directory, but
+                       ;; at this point, default-directory is remote.
+                       ;; (CALL-PROCESS-REGION can't write to remote
+                       ;; files, it seems.)  The file in question is
+                       ;; a tmp file anyway.
+                       (let ((default-directory
+                               (tramp-compat-temporary-file-directory)))
+                         (funcall loc-enc (point-min) (point-max))))
 
+                   (tramp-message
+                    v 5 "Encoding region using command `%s'..." loc-enc)
+                   (unless (equal 0 (tramp-call-local-coding-command
+                                     loc-enc tmpfile t))
+                     (tramp-error
+                      v 'file-error
+                      "Cannot write to `%s', local encoding command `%s' failed"
+                      filename loc-enc)))
+
+                 ;; Send buffer into remote decoding command which
+                 ;; writes to remote file.  Because this happens on
+                 ;; the remote host, we cannot use the function.
+                 (goto-char (point-max))
+                 (unless (bolp) (newline))
                  (tramp-message
-                  v 5 "Encoding region using command `%s'..." loc-enc)
-                 (unless (equal 0 (tramp-call-local-coding-command
-                                   loc-enc tmpfile t))
-                   (tramp-error
-                    v 'file-error
-                    "Cannot write to `%s', local encoding command `%s' failed"
-                    filename loc-enc)))
-
-               ;; Send buffer into remote decoding command which
-               ;; writes to remote file.  Because this happens on the
-               ;; remote host, we cannot use the function.
-               (goto-char (point-max))
-               (unless (bolp) (newline))
-               (tramp-message
-                v 5 "Decoding region into remote file %s..." filename)
-               (tramp-send-command
-                v
-                (format
-                 "%s >%s <<'EOF'\n%sEOF"
-                 rem-dec
-                 (tramp-shell-quote-argument localname)
-                 (buffer-string)))
-               (tramp-barf-unless-okay
-                v nil
-                "Couldn't write region to `%s', decode using `%s' failed"
-                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 tmpfile.
-               (when file-precious-flag
-                 (erase-buffer)
-                 (and
-                  ;; cksum runs locally
-                  (let ((default-directory
-                          (tramp-compat-temporary-file-directory)))
-                    (zerop (call-process "cksum" tmpfile t)))
-                  ;; cksum runs remotely
-                  (zerop
-                   (tramp-send-command-and-check
-                    v
-                    (format "cksum <%s" (tramp-shell-quote-argument localname))))
-                  ;; ... they are different
-                  (not
-                   (string-equal
-                    (buffer-string)
-                    (with-current-buffer (tramp-get-buffer v) (buffer-string))))
-                  (tramp-error
-                   v 'file-error
-                   (concat "Couldn't write region to `%s',"
-                           " decode using `%s' failed")
-                   filename rem-dec)))
-               (tramp-message
-                v 5 "Decoding region into remote file %s...done" filename)
-               (tramp-flush-file-property v localname))
+                  v 5 "Decoding region into remote file %s..." filename)
+                 (tramp-send-command
+                  v
+                  (format
+                   "%s >%s <<'EOF'\n%sEOF"
+                   rem-dec
+                   (tramp-shell-quote-argument localname)
+                   (buffer-string)))
+                 (tramp-barf-unless-okay
+                  v nil
+                  "Couldn't write region to `%s', decode using `%s' failed"
+                  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 tmpfile.
+                 (when file-precious-flag
+                   (erase-buffer)
+                   (and
+                    ;; cksum runs locally
+                    (let ((default-directory
+                            (tramp-compat-temporary-file-directory)))
+                      (zerop (call-process "cksum" tmpfile t)))
+                    ;; cksum runs remotely
+                    (zerop
+                     (tramp-send-command-and-check
+                      v
+                      (format
+                       "cksum <%s" (tramp-shell-quote-argument localname))))
+                    ;; ... they are different
+                    (not
+                     (string-equal
+                      (buffer-string)
+                      (with-current-buffer (tramp-get-buffer v)
+                        (buffer-string))))
+                    (tramp-error
+                     v 'file-error
+                     (concat "Couldn't write region to `%s',"
+                             " decode using `%s' failed")
+                     filename rem-dec)))
+                 (tramp-message
+                  v 5 "Decoding region into remote file %s...done" filename)
+                 (tramp-flush-file-property v localname))
 
-           ;; Save exit.
-           (delete-file tmpfile)))
+             ;; Save exit.
+             (delete-file tmpfile)))
 
-        ;; That's not expected.
-        (t
-         (tramp-error
-          v 'file-error
-          (concat "Method `%s' should specify both encoding and "
-                  "decoding command or an rcp program")
-          method)))
+          ;; That's not expected.
+          (t
+           (tramp-error
+            v 'file-error
+            (concat "Method `%s' should specify both encoding and "
+                    "decoding command or an rcp program")
+            method)))
 
-       ;; Make `last-coding-system-used' have the right value.
-       (when coding-system-used
-         (set 'last-coding-system-used coding-system-used)))
+         ;; Make `last-coding-system-used' have the right value.
+         (when coding-system-used
+           (set 'last-coding-system-used coding-system-used))))
 
       ;; Set file modification time.
       (when (or (eq visit t) (stringp visit))
        (set-visited-file-modtime
-        ;; We must pass modtime explicitely, because filename can be different
-        ;; from (buffer-file-name), f.e. if `file-precious-flag' is set.
+        ;; We must pass modtime explicitely, because filename can
+        ;; be different from (buffer-file-name), f.e. if
+        ;; `file-precious-flag' is set.
         (nth 5 (file-attributes filename))))
+
       ;; Set the ownership.
-      (tramp-set-file-uid-gid filename)
+      (tramp-set-file-uid-gid filename uid gid)
       (when (or (eq visit t) (null visit) (stringp visit))
        (tramp-message v 0 "Wrote %s" filename))
       (run-hooks 'tramp-handle-write-region-hook))))
@@ -4559,8 +4554,7 @@ Falls back to normal file name handler if no tramp file name handler exists."
                  (insert "\")")
                  (goto-char (point-min))
                  (mapcar
-                  (function (lambda (x)
-                              (tramp-make-tramp-file-name method user host x)))
+                  (lambda (x) (tramp-make-tramp-file-name method user host x))
                   (read (current-buffer)))))))
        (list (expand-file-name name))))))
 
@@ -5542,7 +5536,7 @@ The terminal type can be configured with `tramp-terminal-type'."
     (with-current-buffer (tramp-get-connection-buffer vec)
       (tramp-message vec 6 "\n%s" (buffer-string)))
     (unless (eq exit 'ok)
-      (tramp-clear-passwd)
+      (tramp-clear-passwd vec)
       (tramp-error-with-buffer
        nil vec 'file-error
        (cond
@@ -6158,6 +6152,18 @@ connection if a previous connection has died for some reason."
                 (g-user (and gw (tramp-file-name-user gw)))
                 (g-host (and gw (tramp-file-name-host gw)))
                 (command login-program)
+                ;; We don't create the temporary file.  In fact, it
+                ;; is just a prefix for the ControlPath option of
+                ;; ssh; the real temporary file has another name, and
+                ;; it is created and protected by ssh.  It is also
+                ;; removed by ssh, when the connection is closed.
+                (tmpfile
+                 (tramp-set-connection-property
+                  p "temp-file"
+                  (make-temp-name
+                   (expand-file-name
+                    tramp-temp-name-prefix
+                    (tramp-compat-temporary-file-directory)))))
                 spec)
 
            ;; Add gateway arguments if necessary.
@@ -6182,7 +6188,7 @@ connection if a previous connection has died for some reason."
             l-user (or l-user "")
             l-port (or l-port "")
             spec `((?h . ,l-host) (?u . ,l-user) (?p . ,l-port)
-                   (?t . ,(tramp-make-tramp-temp-file vec 'dont-create)))
+                   (?t . ,tmpfile))
             command
             (concat
              command " "
@@ -7043,17 +7049,16 @@ Invokes `password-read' if available, `read-passwd' else."
          password)
       (read-passwd pw-prompt))))
 
-(defun tramp-clear-passwd ()
-  "Clear password cache for connection related to current-buffer.
-If METHOD, USER or HOST is given, take then for computing the key."
-  (interactive)
+(defun tramp-clear-passwd (vec)
+  "Clear password cache for connection related to VEC."
   (when (functionp 'password-cache-remove)
-    (funcall (symbol-function 'password-cache-remove)
-            (tramp-make-tramp-file-name
-             tramp-current-method
-             tramp-current-user
-             tramp-current-host
-             ""))))
+    (funcall
+     (symbol-function 'password-cache-remove)
+     (tramp-make-tramp-file-name
+      (tramp-file-name-method vec)
+      (tramp-file-name-user vec)
+      (tramp-file-name-host vec)
+      ""))))
 
 ;; Snarfed code from time-date.el and parse-time.el
 
@@ -7410,13 +7415,9 @@ Used for non-7bit chars in strings."
         (boundp 'mml-mode)
         (symbol-value 'mml-mode))
 
-    (let* ((tramp-buf-regexp "\\*\\(debug \\)?tramp/")
-          (buffer-list
-           (delq nil
-                 (mapcar '(lambda (b)
-                    (when (string-match tramp-buf-regexp (buffer-name b)) b))
-                         (buffer-list))))
-          (curbuf (current-buffer)))
+    (let ((tramp-buf-regexp "\\*\\(debug \\)?tramp/")
+         (buffer-list (funcall (symbol-function 'tramp-list-tramp-buffers)))
+         (curbuf (current-buffer)))
 
       ;; There is at least one Tramp buffer.
       (when buffer-list
@@ -7465,8 +7466,8 @@ please ensure that the buffers are attached to your email.\n\n")
              (dolist (buffer buffer-list)
                (funcall (symbol-function 'mml-insert-empty-tag)
                         'part 'type "text/plain" 'encoding "base64"
-                        'disposition "attachment" 'buffer (buffer-name buffer)
-                        'description (buffer-name buffer)))
+                        'disposition "attachment" 'buffer buffer
+                        'description buffer))
              (set-buffer-modified-p nil))
 
          ;; Don't send.  Delete the message buffer.
@@ -7516,20 +7517,6 @@ please ensure that the buffers are attached to your email.\n\n")
 ;;   around one of the loops that calls accept-process-output)
 ;;   (Stefan Monnier).
 ;; * Autodetect if remote `ls' groks the "--dired" switch.
-;; * Add fallback for inline encodings.  This should be used
-;;   if the remote end doesn't support mimencode or a similar program.
-;;   For reading files from the remote host, we can just parse the output
-;;   of `od -b'.  For writing files to the remote host, we construct
-;;   a shell program which contains only "safe" ascii characters
-;;   and which writes the right bytes to the file.  We can use printf(1)
-;;   or "echo -e" or the printf function in awk and use octal escapes
-;;   for the "dangerous" characters.  The null byte might be a problem.
-;;   On some systems, the octal escape doesn't work.  So we try the following
-;;   two commands to write a null byte:
-;;   dd if=/dev/zero bs=1 count=1
-;;   echo | tr '\n' '\000'
-;; * Cooperate with PCL-CVS.  It uses start-process, which doesn't
-;;   work for remote files.
 ;; * Rewrite `tramp-shell-quote-argument' to abstain from using
 ;;   `shell-quote-argument'.
 ;; * Completion gets confused when you leave out the method name.
@@ -7565,7 +7552,6 @@ please ensure that the buffers are attached to your email.\n\n")
 ;;   (Francesco Potortì)
 ;; * Make it work for different encodings, and for different file name
 ;;   encodings, too.  (Daniel Pittman)
-;; * Clean up unused *tramp/foo* buffers after a while.  (Pete Forman)
 ;; * Progress reports while copying files.  (Michael Kifer)
 ;; * Don't search for perl5 and perl.  Instead, only search for perl and
 ;;   then look if it's the right version (with `perl -v').
@@ -7600,21 +7586,8 @@ please ensure that the buffers are attached to your email.\n\n")
 ;;   something. (David Kastrup)
 ;; * Could Tramp reasonably look for a prompt after ^M rather than
 ;;   only after ^J ? (Stefan Monnier)
-;; * WIBNI there was an interactive command prompting for tramp
-;;   method, hostname, username and filename and translates the user
-;;   input into the correct filename syntax (depending on the Emacs
-;;   flavor) (Reiner Steib)
-;; * Let the user edit the connection properties interactively.
-;;   Something like `gnus-server-edit-server' in Gnus' *Server* buffer.
 ;; * Reconnect directly to a compliant shell without first going
 ;;   through the user's default shell. (Pete Forman)
-;; * It's just that when I come to Customize `tramp-default-user-alist'
-;;   I'm presented with a mismatch and raw lisp for a value.  It is my
-;;   understanding that a variable declared with defcustom is a User
-;;   Option and should not be modified by the code.  add-to-list is
-;;   called in several places. One way to handle that is to have a new
-;;   ordinary variable that gets its initial value from
-;;   tramp-default-user-alist and then is added to. (Pete Forman)
 ;; * Make `tramp-default-user' obsolete.
 
 ;; Functions for file-name-handler-alist:
index a83d81966a8adadeb9ca3b004b5cfc844304b800..58ae73d8cd34f97161a3f2ac476ccfc66dda5cf9 100644 (file)
 ;; "autoconf && ./configure" to change them.  (X)Emacs version check is defined
 ;; in macro AC_EMACS_INFO of aclocal.m4; should be changed only there.
 
-(defconst tramp-version "2.1.11"
+(defconst tramp-version "2.1.12-pre"
   "This version of Tramp.")
 
 (defconst tramp-bug-report-address "tramp-devel@gnu.org"
   "Email address to send bug reports to.")
 
 ;; Check for (X)Emacs version.
-(let ((x (if (or (< emacs-major-version 21)    (and (featurep 'xemacs)      (< emacs-minor-version 4)))    (format "Tramp 2.1.11 is not fit for %s"        (when (string-match "^.*$" (emacs-version))       (match-string 0 (emacs-version))))    "ok")))
+(let ((x (if (or (< emacs-major-version 21)    (and (featurep 'xemacs)      (< emacs-minor-version 4)))    (format "Tramp 2.1.12-pre is not fit for %s"            (when (string-match "^.*$" (emacs-version))       (match-string 0 (emacs-version))))    "ok")))
   (unless (string-match "\\`ok\\'" x) (error x)))
 
 (provide 'trampver)