* net/tramp.el (top): Remove declarations of `tramp-gw-*' symbols,
they are useless with the byte compiler. (tramp-make-temp-file, tramp-make-tramp-temp-file): Move up. (tramp-do-copy-or-rename-file-directly): Rearrange let-bindings. (tramp-compute-multi-hops): Mask `tramp-gw-*' symbols. (tramp-file-name-real-host, tramp-file-name-port) (tramp-find-method, tramp-find-user, tramp-find-host): Make them defuns. * net/tramp-cache.el (top): Improve error message when `tramp-persistency-file-name' is corrupted.
This commit is contained in:
parent
d218d6a2ae
commit
8a4438b672
3 changed files with 153 additions and 140 deletions
|
@ -1,3 +1,17 @@
|
|||
2007-09-09 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
* net/tramp.el (top): Remove declarations of `tramp-gw-*' symbols,
|
||||
they are useless with the byte compiler.
|
||||
(tramp-make-temp-file, tramp-make-tramp-temp-file): Move up.
|
||||
(tramp-do-copy-or-rename-file-directly): Rearrange let-bindings.
|
||||
(tramp-compute-multi-hops): Mask `tramp-gw-*' symbols.
|
||||
(tramp-file-name-real-host, tramp-file-name-port)
|
||||
(tramp-find-method, tramp-find-user, tramp-find-host): Make them
|
||||
defuns.
|
||||
|
||||
* net/tramp-cache.el (top): Improve error message when
|
||||
`tramp-persistency-file-name' is corrupted.
|
||||
|
||||
2007-09-09 Carsten Dominik <dominik@science.uva.nl>
|
||||
|
||||
* textmodes/org.el (org-re): Also replace the :alpha: class.
|
||||
|
@ -51,7 +65,7 @@
|
|||
|
||||
* progmodes/which-func.el (which-func-modes): Added diff-mode.
|
||||
|
||||
* progmodes/cc-langs.el: Support new keywords added to
|
||||
* progmodes/cc-langs.el: Support new keywords added to
|
||||
objective-c frontend of gcc.
|
||||
(c-simple-stmt-kwds): Added @throw.
|
||||
(c-block-stmt-2-kwds): Added @synchronized.
|
||||
|
|
|
@ -291,7 +291,8 @@ history."
|
|||
res))
|
||||
|
||||
;; Read persistent connection history.
|
||||
(when (zerop (hash-table-count tramp-cache-data))
|
||||
(when (and (stringp tramp-persistency-file-name)
|
||||
(zerop (hash-table-count tramp-cache-data)))
|
||||
(condition-case err
|
||||
(with-temp-buffer
|
||||
(insert-file-contents tramp-persistency-file-name)
|
||||
|
@ -306,7 +307,8 @@ history."
|
|||
(clrhash tramp-cache-data))
|
||||
(error
|
||||
;; File is corrupted.
|
||||
(message "%s" (error-message-string err))
|
||||
(message "Tramp persistency file '%s' is corrupted: %s"
|
||||
tramp-persistency-file-name (error-message-string err))
|
||||
(clrhash tramp-cache-data))))
|
||||
|
||||
(provide 'tramp-cache)
|
||||
|
|
|
@ -149,17 +149,12 @@
|
|||
(unload-feature 'tramp-fish 'force))))
|
||||
|
||||
;; Load gateways. It needs `make-network-process' from Emacs 22.
|
||||
(if (functionp 'make-network-process)
|
||||
(progn
|
||||
(require 'tramp-gw)
|
||||
(add-hook 'tramp-unload-hook
|
||||
'(lambda ()
|
||||
(when (featurep 'tramp-gw)
|
||||
(unload-feature 'tramp-gw 'force)))))
|
||||
;; We need to declare used tramp-gw-* symbols at least.
|
||||
(setq tramp-gw-tunnel-method ""
|
||||
tramp-gw-socks-method "")
|
||||
(defalias 'tramp-gw-open-connection 'ignore))
|
||||
(when (functionp 'make-network-process)
|
||||
(require 'tramp-gw)
|
||||
(add-hook 'tramp-unload-hook
|
||||
'(lambda ()
|
||||
(when (featurep 'tramp-gw)
|
||||
(unload-feature 'tramp-gw 'force)))))
|
||||
|
||||
;; tramp-util offers integration into other (X)Emacs packages like
|
||||
;; compile.el, gud.el etc. Not necessary in Emacs 23.
|
||||
|
@ -2024,6 +2019,22 @@ 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-temp-file (filename)
|
||||
(concat
|
||||
(funcall (if (fboundp 'make-temp-file) 'make-temp-file 'make-temp-name)
|
||||
(expand-file-name tramp-temp-name-prefix
|
||||
(tramp-temporary-file-directory)))
|
||||
(file-name-extension filename t)))
|
||||
|
||||
(defsubst tramp-make-tramp-temp-file (vec)
|
||||
(format
|
||||
"/tmp/%s%s"
|
||||
tramp-temp-name-prefix
|
||||
(if (get-buffer-process (tramp-get-connection-buffer vec))
|
||||
(process-id (get-buffer-process (tramp-get-connection-buffer vec)))
|
||||
(emacs-pid))))
|
||||
|
||||
|
||||
;;; Config Manipulation Functions:
|
||||
|
||||
(defun tramp-set-completion-function (method function-list)
|
||||
|
@ -3030,114 +3041,114 @@ the file (for rename). Both files must reside on the same host.
|
|||
KEEP-DATE means to make sure that NEWNAME has the same timestamp
|
||||
as FILENAME. PRESERVE-UID-GID, when non-nil, instructs to keep
|
||||
the uid and gid from FILENAME."
|
||||
(with-parsed-tramp-file-name (if t1 filename newname) nil
|
||||
(let* ((cmd (cond ((and (eq op 'copy) preserve-uid-gid) "cp -f -p")
|
||||
((eq op 'copy) "cp -f")
|
||||
((eq op 'rename) "mv -f")
|
||||
(t (tramp-error
|
||||
vec 'file-error
|
||||
"Unknown operation `%s', must be `copy' or `rename'"
|
||||
op))))
|
||||
(t1 (tramp-tramp-file-p filename))
|
||||
(t2 (tramp-tramp-file-p newname))
|
||||
(localname1
|
||||
(if t1 (tramp-handle-file-remote-p filename 'localname) filename))
|
||||
(localname2
|
||||
(if t2 (tramp-handle-file-remote-p newname 'localname) newname))
|
||||
(prefix (tramp-handle-file-remote-p (if t1 filename newname)))
|
||||
(tmpfile (tramp-make-temp-file localname1)))
|
||||
(let ((t1 (tramp-tramp-file-p filename))
|
||||
(t2 (tramp-tramp-file-p newname)))
|
||||
(with-parsed-tramp-file-name (if t1 filename newname) nil
|
||||
(let* ((cmd (cond ((and (eq op 'copy) preserve-uid-gid) "cp -f -p")
|
||||
((eq op 'copy) "cp -f")
|
||||
((eq op 'rename) "mv -f")
|
||||
(t (tramp-error
|
||||
v 'file-error
|
||||
"Unknown operation `%s', must be `copy' or `rename'"
|
||||
op))))
|
||||
(localname1
|
||||
(if t1 (tramp-handle-file-remote-p filename 'localname) filename))
|
||||
(localname2
|
||||
(if t2 (tramp-handle-file-remote-p newname 'localname) newname))
|
||||
(prefix (tramp-handle-file-remote-p (if t1 filename newname)))
|
||||
(tmpfile (tramp-make-temp-file localname1)))
|
||||
|
||||
(cond
|
||||
;; Both files are on a remote host, with same user.
|
||||
((and t1 t2)
|
||||
(tramp-send-command
|
||||
v
|
||||
(format "%s %s %s" cmd
|
||||
(tramp-shell-quote-argument localname1)
|
||||
(tramp-shell-quote-argument localname2)))
|
||||
(with-current-buffer (tramp-get-buffer v)
|
||||
(goto-char (point-min))
|
||||
(unless
|
||||
(or
|
||||
(and keep-date
|
||||
;; Mask cp -f error.
|
||||
(re-search-forward
|
||||
tramp-operation-not-permitted-regexp nil t))
|
||||
(zerop (tramp-send-command-and-check v nil)))
|
||||
(tramp-error-with-buffer
|
||||
nil v 'file-error
|
||||
"Copying directly failed, see buffer `%s' for details."
|
||||
(buffer-name)))))
|
||||
|
||||
;; We are on the local host.
|
||||
((or t1 t2)
|
||||
(cond
|
||||
;; We can do it directly.
|
||||
((and (file-readable-p localname1)
|
||||
(file-writable-p (file-name-directory localname2)))
|
||||
(if (eq op 'copy)
|
||||
(copy-file
|
||||
localname1 localname2 ok-if-already-exists
|
||||
keep-date preserve-uid-gid)
|
||||
(rename-file localname1 localname2 ok-if-already-exists)))
|
||||
;; Both files are on a remote host, with same user.
|
||||
((and t1 t2)
|
||||
(tramp-send-command
|
||||
v
|
||||
(format "%s %s %s" cmd
|
||||
(tramp-shell-quote-argument localname1)
|
||||
(tramp-shell-quote-argument localname2)))
|
||||
(with-current-buffer (tramp-get-buffer v)
|
||||
(goto-char (point-min))
|
||||
(unless
|
||||
(or
|
||||
(and keep-date
|
||||
;; Mask cp -f error.
|
||||
(re-search-forward
|
||||
tramp-operation-not-permitted-regexp nil t))
|
||||
(zerop (tramp-send-command-and-check v nil)))
|
||||
(tramp-error-with-buffer
|
||||
nil v 'file-error
|
||||
"Copying directly failed, see buffer `%s' for details."
|
||||
(buffer-name)))))
|
||||
|
||||
;; We can do it directly with `tramp-send-command'
|
||||
((and (file-readable-p (concat prefix localname1))
|
||||
(file-writable-p
|
||||
(file-name-directory (concat prefix localname2))))
|
||||
(tramp-do-copy-or-rename-file-directly
|
||||
op (concat prefix localname1) (concat prefix localname2)
|
||||
ok-if-already-exists keep-date t)
|
||||
;; We must change the ownership to the local user.
|
||||
(tramp-set-file-uid-gid
|
||||
(concat prefix localname2)
|
||||
(tramp-get-local-uid 'integer)
|
||||
(tramp-get-local-gid 'integer)))
|
||||
|
||||
;; We need a temporary file in between.
|
||||
(t
|
||||
;; Create the temporary file.
|
||||
;; We are on the local host.
|
||||
((or t1 t2)
|
||||
(cond
|
||||
(t1
|
||||
(tramp-send-command
|
||||
v (format
|
||||
"%s %s %s" cmd
|
||||
(tramp-shell-quote-argument localname1)
|
||||
(tramp-shell-quote-argument tmpfile)))
|
||||
;; We must change the ownership as remote user.
|
||||
;; We can do it directly.
|
||||
((and (file-readable-p localname1)
|
||||
(file-writable-p (file-name-directory localname2)))
|
||||
(if (eq op 'copy)
|
||||
(copy-file
|
||||
localname1 localname2 ok-if-already-exists
|
||||
keep-date preserve-uid-gid)
|
||||
(rename-file localname1 localname2 ok-if-already-exists)))
|
||||
|
||||
;; We can do it directly with `tramp-send-command'
|
||||
((and (file-readable-p (concat prefix localname1))
|
||||
(file-writable-p
|
||||
(file-name-directory (concat prefix localname2))))
|
||||
(tramp-do-copy-or-rename-file-directly
|
||||
op (concat prefix localname1) (concat prefix localname2)
|
||||
ok-if-already-exists keep-date t)
|
||||
;; We must change the ownership to the local user.
|
||||
(tramp-set-file-uid-gid
|
||||
(concat prefix tmpfile)
|
||||
(concat prefix localname2)
|
||||
(tramp-get-local-uid 'integer)
|
||||
(tramp-get-local-gid 'integer)))
|
||||
(t2
|
||||
(if (eq op 'copy)
|
||||
(copy-file
|
||||
localname1 tmpfile ok-if-already-exists
|
||||
keep-date preserve-uid-gid)
|
||||
(rename-file localname1 tmpfile ok-if-already-exists))
|
||||
;; We must change the ownership as local user.
|
||||
(tramp-set-file-uid-gid
|
||||
tmpfile
|
||||
(tramp-get-remote-uid v 'integer)
|
||||
(tramp-get-remote-gid v 'integer))))
|
||||
|
||||
;; Move the temporary file to its destination.
|
||||
(cond
|
||||
(t2
|
||||
(tramp-send-command
|
||||
v (format
|
||||
"%s %s %s" cmd
|
||||
(tramp-shell-quote-argument tmpfile)
|
||||
(tramp-shell-quote-argument localname2))))
|
||||
(t1
|
||||
(if (eq op 'copy)
|
||||
(copy-file
|
||||
tmpfile localname2 ok-if-already-exists
|
||||
keep-date preserve-uid-gid)
|
||||
(rename-file tmpfile localname2 ok-if-already-exists))))
|
||||
;; We need a temporary file in between.
|
||||
(t
|
||||
;; Create the temporary file.
|
||||
(cond
|
||||
(t1
|
||||
(tramp-send-command
|
||||
v (format
|
||||
"%s %s %s" cmd
|
||||
(tramp-shell-quote-argument localname1)
|
||||
(tramp-shell-quote-argument tmpfile)))
|
||||
;; We must change the ownership as remote user.
|
||||
(tramp-set-file-uid-gid
|
||||
(concat prefix tmpfile)
|
||||
(tramp-get-local-uid 'integer)
|
||||
(tramp-get-local-gid 'integer)))
|
||||
(t2
|
||||
(if (eq op 'copy)
|
||||
(copy-file
|
||||
localname1 tmpfile ok-if-already-exists
|
||||
keep-date preserve-uid-gid)
|
||||
(rename-file localname1 tmpfile ok-if-already-exists))
|
||||
;; We must change the ownership as local user.
|
||||
(tramp-set-file-uid-gid
|
||||
tmpfile
|
||||
(tramp-get-remote-uid v 'integer)
|
||||
(tramp-get-remote-gid v 'integer))))
|
||||
|
||||
;; Remove temporary file.
|
||||
(when (eq op 'copy) (delete-file tmpfile))))))
|
||||
;; Move the temporary file to its destination.
|
||||
(cond
|
||||
(t2
|
||||
(tramp-send-command
|
||||
v (format
|
||||
"%s %s %s" cmd
|
||||
(tramp-shell-quote-argument tmpfile)
|
||||
(tramp-shell-quote-argument localname2))))
|
||||
(t1
|
||||
(if (eq op 'copy)
|
||||
(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)))))))
|
||||
|
||||
;; Set the time and mode. Mask possible errors.
|
||||
;; Won't be applied for 'rename.
|
||||
|
@ -3577,21 +3588,6 @@ beginning of local filename are not substituted."
|
|||
|
||||
;;; Remote commands.
|
||||
|
||||
(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-temporary-file-directory)))
|
||||
(file-name-extension filename t)))
|
||||
|
||||
(defsubst tramp-make-tramp-temp-file (vec)
|
||||
(format
|
||||
"/tmp/%s%s"
|
||||
tramp-temp-name-prefix
|
||||
(if (get-buffer-process (tramp-get-connection-buffer vec))
|
||||
(process-id (get-buffer-process (tramp-get-connection-buffer vec)))
|
||||
(emacs-pid))))
|
||||
|
||||
(defun tramp-handle-executable-find (command)
|
||||
"Like `executable-find' for Tramp files."
|
||||
(with-parsed-tramp-file-name default-directory nil
|
||||
|
@ -4339,8 +4335,7 @@ Falls back to normal file name handler if no tramp file name handler exists."
|
|||
((and completion (zerop (length localname))
|
||||
(memq operation '(file-name-as-directory)))
|
||||
filename)
|
||||
;; Call the backend function. Set a connection property
|
||||
;; first, it will be reused for user/host name completion.
|
||||
;; Call the backend function.
|
||||
(foreign (apply foreign operation args))
|
||||
;; Nothing to do for us.
|
||||
(t (tramp-run-real-handler operation args)))))))
|
||||
|
@ -5945,10 +5940,12 @@ Gateway hops are already opened."
|
|||
(setq choices tramp-default-proxies-alist)))))
|
||||
|
||||
;; Handle gateways.
|
||||
(when (string-match (format
|
||||
"^\\(%s\\|%s\\)$"
|
||||
tramp-gw-tunnel-method tramp-gw-socks-method)
|
||||
(tramp-file-name-method (car target-alist)))
|
||||
(when (and (boundp 'tramp-gw-tunnel-method)
|
||||
(string-match (format
|
||||
"^\\(%s\\|%s\\)$"
|
||||
(symbol-value 'tramp-gw-tunnel-method)
|
||||
(symbol-value 'tramp-gw-socks-method))
|
||||
(tramp-file-name-method (car target-alist))))
|
||||
(let ((gw (pop target-alist))
|
||||
(hop (pop target-alist)))
|
||||
;; Is the method prepared for gateways?
|
||||
|
@ -5973,7 +5970,7 @@ Gateway hops are already opened."
|
|||
'target-alist
|
||||
(vector
|
||||
(tramp-file-name-method hop) (tramp-file-name-user hop)
|
||||
(tramp-gw-open-connection vec gw hop) nil))
|
||||
(funcall (intern "tramp-gw-open-connection") vec gw hop) nil))
|
||||
;; For the password prompt, we need the correct values.
|
||||
;; Therefore, we must remember the gateway vector. But we
|
||||
;; cannot do it as connection property, because it shouldn't
|
||||
|
@ -6524,7 +6521,7 @@ Not actually used. Use `(format \"%o\" i)' instead?"
|
|||
|
||||
;; The host part of a Tramp file name vector can be of kind
|
||||
;; "host#port". Sometimes, we must extract these parts.
|
||||
(defsubst tramp-file-name-real-host (vec)
|
||||
(defun tramp-file-name-real-host (vec)
|
||||
"Return the host name of VEC without port."
|
||||
(let ((host (tramp-file-name-host vec)))
|
||||
(if (and (stringp host)
|
||||
|
@ -6532,7 +6529,7 @@ Not actually used. Use `(format \"%o\" i)' instead?"
|
|||
(match-string 1 host)
|
||||
host)))
|
||||
|
||||
(defsubst tramp-file-name-port (vec)
|
||||
(defun tramp-file-name-port (vec)
|
||||
"Return the port number of VEC."
|
||||
(let ((host (tramp-file-name-host vec)))
|
||||
(and (stringp host)
|
||||
|
@ -6544,7 +6541,7 @@ Not actually used. Use `(format \"%o\" i)' instead?"
|
|||
(save-match-data
|
||||
(string-match tramp-file-name-regexp name)))
|
||||
|
||||
(defsubst tramp-find-method (method user host)
|
||||
(defun tramp-find-method (method user host)
|
||||
"Return the right method string to use.
|
||||
This is METHOD, if non-nil. Otherwise, do a lookup in
|
||||
`tramp-default-method-alist'."
|
||||
|
@ -6560,7 +6557,7 @@ This is METHOD, if non-nil. Otherwise, do a lookup in
|
|||
lmethod)
|
||||
tramp-default-method))
|
||||
|
||||
(defsubst tramp-find-user (method user host)
|
||||
(defun tramp-find-user (method user host)
|
||||
"Return the right user string to use.
|
||||
This is USER, if non-nil. Otherwise, do a lookup in
|
||||
`tramp-default-user-alist'."
|
||||
|
@ -6576,7 +6573,7 @@ This is USER, if non-nil. Otherwise, do a lookup in
|
|||
luser)
|
||||
tramp-default-user))
|
||||
|
||||
(defsubst tramp-find-host (method user host)
|
||||
(defun tramp-find-host (method user host)
|
||||
"Return the right host string to use.
|
||||
This is HOST, if non-nil. Otherwise, it is `tramp-default-host'."
|
||||
(or (and (> (length host) 0) host)
|
||||
|
|
Loading…
Add table
Reference in a new issue