mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-04 11:00:45 -08:00
Sync with Tramp 2.5.0-pre
* doc/misc/tramp.texi: Protext Tramp x.y and Emacs x.y by @w{}.
(GVFS-based methods): Move "GNOME Online Accounts" index.
(Customizing Methods, Android shell setup, File name completion)
(Frequently Asked Questions): Fix typos.
* doc/misc/trampver.texi: Change version to "2.5.0-pre".
* lisp/net/trampver.el: Change version to "2.5.0-pre".
(inhibit-message): Don't declare.
* lisp/net/tramp.el: Bump version to 2.5.0-pre. Require Emacs 25.1.
(tramp-debug-message): Simplify.
(tramp-message): Don't use `tramp-message-show-message'.
(tramp-with-demoted-errors, with-parsed-tramp-file-name)
(with-tramp-file-property, with-tramp-connection-property):
Adapt `declare' form.
(with-tramp-progress-reporter): Suppress progress reporter when
noninteractive.
(tramp-completion-mode, tramp-completion-mode-p): Remove.
* lisp/net/tramp-compat.el (tramp-compat-process-running-p)
(format-message): Remove compatibility code.
(tramp-compat-directory-name-p)
(tramp-compat-tramp-file-name-slots): Remove.
* lisp/net/tramp.el (tramp-debug-message, tramp-message)
(tramp-backtrace, tramp-error, tramp-error-with-buffer)
(tramp-user-error, tramp-with-demoted-errors)
(tramp-signal-hook-function):
* lisp/net/tramp-compat.el (tramp-compat-funcall)
* lisp/net/tramp-gvfs.el (tramp-dbus-function):
Add `tramp-suppress-trace' property.
* lisp/net/tramp.el (tramp-get-method-parameter)
(tramp-dissect-file-name, tramp-error, tramp-error-with-buffer)
(tramp-user-error, with-parsed-tramp-file-name)
(with-tramp-progress-reporter, tramp-file-name-handler)
(tramp-completion-file-name-handler, tramp-autoload-file-name-handler)
(tramp-register-file-name-handlers, tramp-connectable-p)
(tramp-handle-file-modes, tramp-handle-file-regular-p)
(tramp-handle-file-truename, tramp-handle-insert-directory)
(tramp-handle-load, tramp-set-file-uid-gid):
* lisp/net/tramp-adb.el (tramp-adb-file-name-handler)
(tramp-adb-handle-file-truename, tramp-adb-handle-copy-file)
(tramp-adb-handle-rename-file):
* lisp/net/tramp-archive.el (with-parsed-tramp-archive-file-name):
* lisp/net/tramp-cache.el (tramp-get-file-property, tramp-cache-print):
* lisp/net/tramp-compat.el (tramp-compat-process-running-p)
(tramp-compat-exec-path):
* lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler)
(tramp-gvfs-dbus-byte-array-to-string)
(tramp-gvfs-do-copy-or-rename-file):
* lisp/net/tramp-rclone.el (tramp-rclone-file-name-handler)
(tramp-rclone-do-copy-or-rename-file):
* lisp/net/tramp-sh.el (tramp-sh-handle-file-truename)
(tramp-sh-handle-copy-directory, tramp-do-copy-or-rename-file)
(tramp-sh-handle-insert-directory, tramp-sh-file-name-handler)
(tramp-maybe-open-connection):
* lisp/net/tramp-smb.el (tramp-smb-file-name-handler)
(tramp-smb-handle-copy-file, tramp-smb-handle-copy-directory)
(tramp-smb-handle-copy-file, tramp-smb-handle-insert-directory)
(tramp-smb-handle-rename-file, tramp-smb-maybe-open-connection):
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-file-name-handler)
(tramp-sudoedit-do-copy-or-rename-file)
(tramp-sudoedit-handle-file-truename):
Use `if-let', `when-let', `directory-name-p', `inhibit-message',
`non-essential and `cl-struct-slot-info'. Don't use `seconds-to-time'.
* test/lisp/net/tramp-archive-tests.el (tramp-message-show-message):
Don't set.
* test/lisp/net/tramp-tests.el (inhibit-message): Don't declare.
(tramp-message-show-message): Don't set.
(tramp-test06-directory-file-name): Use `non-essential'.
(tramp-test10-write-region): Use `inhibit-message'.
(tramp-test36-vc-registered): No special handling for old Emacsen.
(tramp--test-emacs25-p): Remove.
(tramp-test45-unload): Special case of `tramp-completion-mode'.
This commit is contained in:
parent
35a1a007bb
commit
0ad895df50
16 changed files with 299 additions and 439 deletions
|
|
@ -46,7 +46,7 @@ copy and modify this GNU manual.''
|
|||
@node Top, Overview, (dir), (dir)
|
||||
@top @value{tramp} @value{trampver} User Manual
|
||||
|
||||
This file documents @value{tramp} @value{trampver}, a remote file
|
||||
This file documents @w{@value{tramp} @value{trampver}}, a remote file
|
||||
editing package for Emacs.
|
||||
|
||||
@value{tramp} stands for ``Transparent Remote (file) Access, Multiple
|
||||
|
|
@ -312,7 +312,7 @@ behind the scenes when you open a file with @value{tramp}.
|
|||
@cindex GNU ELPA
|
||||
@vindex tramp-version
|
||||
|
||||
@value{tramp} is included as part of Emacs (since Emacs 22.1).
|
||||
@value{tramp} is included as part of Emacs (since @w{Emacs 22.1}).
|
||||
|
||||
@value{tramp} is also freely packaged for download on the Internet at
|
||||
@uref{https://ftp.gnu.org/gnu/tramp/}. The version number of
|
||||
|
|
@ -324,9 +324,9 @@ A @value{tramp} release, which is packaged with Emacs, could differ
|
|||
slightly from the corresponding standalone release. This is because
|
||||
it isn't always possible to synchronize release dates between Emacs
|
||||
and @value{tramp}. Such version numbers have the Emacs version number
|
||||
as suffix, like ``2.3.5.26.3''. This means @value{tramp} 2.3.5 as
|
||||
integrated in Emacs 26.3. A complete list of @value{tramp} versions
|
||||
packaged with Emacs can be retrieved by
|
||||
as suffix, like ``2.3.5.26.3''. This means @w{@value{tramp} 2.3.5} as
|
||||
integrated in @w{Emacs 26.3}. A complete list of @value{tramp}
|
||||
versions packaged with Emacs can be retrieved by
|
||||
|
||||
@vindex customize-package-emacs-version-alist
|
||||
@lisp
|
||||
|
|
@ -1227,6 +1227,7 @@ supported by these methods. See method @option{nextcloud} for
|
|||
handling them.
|
||||
|
||||
@item @option{gdrive}
|
||||
@cindex @acronym{GNOME} Online Accounts
|
||||
@cindex method @option{gdrive}
|
||||
@cindex @option{gdrive} method
|
||||
@cindex google drive
|
||||
|
|
@ -1243,7 +1244,6 @@ could produce unexpected behavior in case two files in the same
|
|||
directory have the same @code{display-name}, such a situation must be avoided.
|
||||
|
||||
@item @option{nextcloud}
|
||||
@cindex @acronym{GNOME} Online Accounts
|
||||
@cindex method @option{nextcloud}
|
||||
@cindex @option{nextcloud} method
|
||||
@cindex nextcloud
|
||||
|
|
@ -1642,7 +1642,7 @@ suitable settings. Refer to the Lisp documentation of that variable,
|
|||
accessible with @kbd{C-h v tramp-methods @key{RET}}.
|
||||
|
||||
In the ELPA archives, there are several examples of such extensions.
|
||||
They can be installed with Emacs' Package Manager. This includes
|
||||
They can be installed with Emacs's Package Manager. This includes
|
||||
|
||||
@table @samp
|
||||
@c @item anything-tramp
|
||||
|
|
@ -2095,8 +2095,8 @@ preserves the path value, which can be used to update
|
|||
shell supports the login argument @samp{-l}.
|
||||
@end defopt
|
||||
|
||||
Starting with Emacs 26, @code{tramp-remote-path} can be set per host
|
||||
via connection-local
|
||||
Starting with @w{Emacs 26}, @code{tramp-remote-path} can be set per
|
||||
host via connection-local
|
||||
@ifinfo
|
||||
variables, @xref{Connection Variables, , , emacs}.
|
||||
@end ifinfo
|
||||
|
|
@ -2450,7 +2450,7 @@ where @samp{192.168.0.1} is the remote host IP address
|
|||
Android devices provide a restricted shell access through an USB
|
||||
connection. The local host must have the @command{adb} program
|
||||
installed. Usually, it is sufficient to open the file
|
||||
@file{@trampfn{adb,,/}}. Then you can navigate in the filesystem via
|
||||
@file{@trampfn{adb,,/}}. Then you can navigate in the file system via
|
||||
@code{dired}.
|
||||
|
||||
Alternatively, applications such as @code{Termux} or @code{SSHDroid}
|
||||
|
|
@ -2937,10 +2937,10 @@ Example:
|
|||
@end example
|
||||
|
||||
During file name completion, remote directory contents are re-read
|
||||
regularly to account for any changes in the filesystem that may affect
|
||||
the completion candidates. Such re-reads can account for changes to
|
||||
the file system by applications outside Emacs (@pxref{Connection
|
||||
caching}).
|
||||
regularly to account for any changes in the file system that may
|
||||
affect the completion candidates. Such re-reads can account for
|
||||
changes to the file system by applications outside Emacs
|
||||
(@pxref{Connection caching}).
|
||||
|
||||
@defopt tramp-completion-reread-directory-timeout
|
||||
The timeout is number of seconds since last remote command for
|
||||
|
|
@ -3161,8 +3161,8 @@ ensures the correct name of the remote shell program.
|
|||
When @code{explicit-shell-file-name} is equal to @code{nil}, calling
|
||||
@code{shell} interactively will prompt for a shell name.
|
||||
|
||||
Starting with Emacs 26, you could use connection-local variables for
|
||||
setting different values of @code{explicit-shell-file-name} for
|
||||
Starting with @w{Emacs 26}, you could use connection-local variables
|
||||
for setting different values of @code{explicit-shell-file-name} for
|
||||
different remote hosts.
|
||||
@ifinfo
|
||||
@xref{Connection Variables, , , emacs}.
|
||||
|
|
@ -3231,7 +3231,7 @@ variables.
|
|||
@vindex async-shell-command-width
|
||||
@vindex COLUMNS@r{, environment variable}
|
||||
If Emacs supports the variable @code{async-shell-command-width} (since
|
||||
Emacs 27.1), @value{tramp} cares about its value for asynchronous
|
||||
@w{Emacs 27.1}), @value{tramp} cares about its value for asynchronous
|
||||
shell commands. It specifies the number of display columns for
|
||||
command output. For synchronous shell commands, a similar effect can
|
||||
be achieved by adding the environment variable @env{COLUMNS} to
|
||||
|
|
@ -3840,8 +3840,8 @@ Where is the latest @value{tramp}?
|
|||
@item
|
||||
Which systems does it work on?
|
||||
|
||||
The package works successfully on Emacs 24, Emacs 25, Emacs 26, Emacs
|
||||
27, and Emacs 28.
|
||||
The package works successfully on @w{Emacs 25}, @w{Emacs 26}, @w{Emacs
|
||||
27}, and @w{Emacs 28}.
|
||||
|
||||
While Unix and Unix-like systems are the primary remote targets,
|
||||
@value{tramp} has equal success connecting to other platforms, such as
|
||||
|
|
@ -4178,7 +4178,7 @@ Host indication in the mode line?
|
|||
|
||||
@cindex @value{tramp} theme
|
||||
@vindex tramp-theme-face-remapping-alist
|
||||
Install @file{tramp-theme} from GNU ELPA via Emacs' Package Manager.
|
||||
Install @file{tramp-theme} from GNU ELPA via Emacs's Package Manager.
|
||||
Enable it via @kbd{M-x load-theme @key{RET} tramp @key{RET}}. Further
|
||||
customization is explained in user option
|
||||
@code{tramp-theme-face-remapping-alist}.
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@
|
|||
@c In the Tramp GIT, the version numbers are auto-frobbed from
|
||||
@c tramp.el, and the bug report address is auto-frobbed from
|
||||
@c configure.ac.
|
||||
@set trampver 2.4.4-pre
|
||||
@set trampver 2.5.0-pre
|
||||
@set tramp-bug-report-address tramp-devel@@gnu.org
|
||||
@set emacsver 24.4
|
||||
@set emacsver 25.1
|
||||
|
||||
@c Other flags from configuration.
|
||||
@set instprefix /usr/local
|
||||
|
|
|
|||
|
|
@ -181,10 +181,9 @@ It is used for TCP/IP devices."
|
|||
"Invoke the ADB handler for OPERATION.
|
||||
First arg specifies the OPERATION, second arg is a list of
|
||||
ARGUMENTS to pass to the OPERATION."
|
||||
(let ((fn (assoc operation tramp-adb-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-adb-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) arguments))
|
||||
(tramp-run-real-handler operation arguments))))
|
||||
(tramp-run-real-handler operation arguments)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(tramp--with-startup
|
||||
|
|
@ -234,8 +233,7 @@ ARGUMENTS to pass to the OPERATION."
|
|||
"Like `file-truename' for Tramp files."
|
||||
;; Preserve trailing "/".
|
||||
(funcall
|
||||
(if (tramp-compat-directory-name-p filename)
|
||||
#'file-name-as-directory #'identity)
|
||||
(if (directory-name-p filename) #'file-name-as-directory #'identity)
|
||||
;; Quote properly.
|
||||
(funcall
|
||||
(if (tramp-compat-file-name-quoted-p filename)
|
||||
|
|
@ -719,7 +717,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(with-tramp-progress-reporter
|
||||
|
|
@ -739,9 +737,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(tramp-shell-quote-argument l2))
|
||||
"Error copying %s to %s" filename newname))
|
||||
|
||||
(let ((tmpfile (file-local-copy filename)))
|
||||
|
||||
(if tmpfile
|
||||
(if-let ((tmpfile (file-local-copy filename)))
|
||||
;; Remote filename.
|
||||
(condition-case err
|
||||
(rename-file tmpfile newname ok-if-already-exists)
|
||||
|
|
@ -751,7 +747,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
|
||||
;; Remote newname.
|
||||
(when (and (file-directory-p newname)
|
||||
(tramp-compat-directory-name-p newname))
|
||||
(directory-name-p newname))
|
||||
(setq newname
|
||||
(expand-file-name
|
||||
(file-name-nondirectory filename) newname)))
|
||||
|
|
@ -771,7 +767,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(tramp-compat-file-name-unquote localname))
|
||||
(tramp-error
|
||||
v 'file-error
|
||||
"Cannot copy `%s' `%s'" filename newname)))))))))
|
||||
"Cannot copy `%s' `%s'" filename newname))))))))
|
||||
|
||||
;; KEEP-DATE handling.
|
||||
(when keep-date
|
||||
|
|
@ -801,7 +797,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(with-tramp-progress-reporter
|
||||
|
|
|
|||
|
|
@ -350,7 +350,7 @@ arguments to pass to the OPERATION."
|
|||
(add-to-list 'file-name-handler-alist
|
||||
(cons (tramp-archive-autoload-file-name-regexp)
|
||||
#'tramp-archive-autoload-file-name-handler))
|
||||
(put 'tramp-archive-autoload-file-name-handler 'safe-magic t))))
|
||||
(put #'tramp-archive-autoload-file-name-handler 'safe-magic t))))
|
||||
|
||||
;;;###autoload
|
||||
(progn
|
||||
|
|
@ -366,7 +366,7 @@ arguments to pass to the OPERATION."
|
|||
(tramp-register-archive-file-name-handler)
|
||||
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-archive-file-name-handler 'operations
|
||||
(put #'tramp-archive-file-name-handler 'operations
|
||||
(mapcar #'car tramp-archive-file-name-handler-alist))
|
||||
|
||||
;; `tramp-archive-file-name-handler' must be placed before `url-file-handler'.
|
||||
|
|
@ -517,13 +517,16 @@ offered."
|
|||
(declare (debug (form symbolp body))
|
||||
(indent 2))
|
||||
(let ((bindings
|
||||
(mapcar (lambda (elem)
|
||||
(mapcar
|
||||
(lambda (elem)
|
||||
`(,(if var (intern (format "%s-%s" var elem)) elem)
|
||||
(,(intern (format "tramp-file-name-%s" elem))
|
||||
,(or var 'v))))
|
||||
`,(cons
|
||||
(cons
|
||||
'archive
|
||||
(delete 'hop (tramp-compat-tramp-file-name-slots))))))
|
||||
(delete
|
||||
'hop
|
||||
(cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name))))))))
|
||||
`(let* ((,(or var 'v) (tramp-archive-dissect-file-name ,filename))
|
||||
,@bindings)
|
||||
;; We don't know which of those vars will be used, so we bind them all,
|
||||
|
|
|
|||
|
|
@ -130,13 +130,8 @@ Returns DEFAULT if not set."
|
|||
(or (null remote-file-name-inhibit-cache)
|
||||
(and (integerp remote-file-name-inhibit-cache)
|
||||
(time-less-p
|
||||
;; `current-time' can be nil once we get rid of Emacs 24.
|
||||
(current-time)
|
||||
(time-add
|
||||
(car value)
|
||||
;; `seconds-to-time' can be removed once we get
|
||||
;; rid of Emacs 24.
|
||||
(seconds-to-time remote-file-name-inhibit-cache))))
|
||||
nil
|
||||
(time-add (car value) remote-file-name-inhibit-cache)))
|
||||
(and (consp remote-file-name-inhibit-cache)
|
||||
(time-less-p
|
||||
remote-file-name-inhibit-cache (car value)))))
|
||||
|
|
@ -386,19 +381,14 @@ used to cache connection properties of the local machine."
|
|||
(maphash
|
||||
(lambda (key value)
|
||||
;; Remove text properties from KEY and VALUE.
|
||||
;; `cl-struct-slot-*' functions exist since Emacs 25 only; we
|
||||
;; ignore errors.
|
||||
(when (tramp-file-name-p key)
|
||||
;; (dolist
|
||||
;; (slot
|
||||
;; (mapcar #'car (cdr (cl-struct-slot-info 'tramp-file-name))))
|
||||
;; (when (stringp (cl-struct-slot-value 'tramp-file-name slot key))
|
||||
;; (setf (cl-struct-slot-value 'tramp-file-name slot key)
|
||||
;; (substring-no-properties
|
||||
;; (cl-struct-slot-value 'tramp-file-name slot key))))))
|
||||
(dotimes (i (length key))
|
||||
(when (stringp (elt key i))
|
||||
(setf (elt key i) (substring-no-properties (elt key i))))))
|
||||
(dolist
|
||||
(slot
|
||||
(mapcar #'car (cdr (cl-struct-slot-info 'tramp-file-name))))
|
||||
(when (stringp (cl-struct-slot-value 'tramp-file-name slot key))
|
||||
(setf (cl-struct-slot-value 'tramp-file-name slot key)
|
||||
(substring-no-properties
|
||||
(cl-struct-slot-value 'tramp-file-name slot key))))))
|
||||
(when (stringp key)
|
||||
(setq key (substring-no-properties key)))
|
||||
(when (stringp value)
|
||||
|
|
|
|||
|
|
@ -23,15 +23,15 @@
|
|||
|
||||
;;; Commentary:
|
||||
|
||||
;; Tramp's main Emacs version for development is Emacs 27. This
|
||||
;; package provides compatibility functions for Emacs 24, Emacs 25 and
|
||||
;; Emacs 26.
|
||||
;; Tramp's main Emacs version for development is Emacs 28. This
|
||||
;; package provides compatibility functions for Emacs 25, Emacs 26 and
|
||||
;; Emacs 27.
|
||||
|
||||
;;; Code:
|
||||
|
||||
;; In Emacs 24 and 25, `tramp-unload-file-name-handlers' is not
|
||||
;; autoloaded. So we declare it here in order to avoid recursive
|
||||
;; load. This will be overwritten in tramp.el.
|
||||
;; In Emacs 25, `tramp-unload-file-name-handlers' is not autoloaded.
|
||||
;; So we declare it here in order to avoid recursive load. This will
|
||||
;; be overwritten in tramp.el.
|
||||
(defun tramp-unload-file-name-handlers () ".")
|
||||
|
||||
(require 'auth-source)
|
||||
|
|
@ -52,6 +52,8 @@
|
|||
`(when (functionp ,function)
|
||||
(with-no-warnings (funcall ,function ,@arguments))))
|
||||
|
||||
(put #'tramp-compat-funcall 'tramp-suppress-trace t)
|
||||
|
||||
(defsubst tramp-compat-temporary-file-directory ()
|
||||
"Return name of directory for temporary files.
|
||||
It is the default value of `temporary-file-directory'."
|
||||
|
|
@ -78,28 +80,18 @@ Add the extension of F, if existing."
|
|||
(defun tramp-compat-process-running-p (process-name)
|
||||
"Return t if system process PROCESS-NAME is running for `user-login-name'."
|
||||
(when (stringp process-name)
|
||||
(cond
|
||||
;; GNU Emacs 22 on w32.
|
||||
((fboundp 'w32-window-exists-p)
|
||||
(tramp-compat-funcall 'w32-window-exists-p process-name process-name))
|
||||
|
||||
;; GNU Emacs 23+.
|
||||
((and (fboundp 'list-system-processes) (fboundp 'process-attributes))
|
||||
(let (result)
|
||||
(dolist (pid (tramp-compat-funcall 'list-system-processes) result)
|
||||
(let ((attributes (process-attributes pid)))
|
||||
(when (and (string-equal
|
||||
(cdr (assoc 'user attributes)) (user-login-name))
|
||||
(let ((comm (cdr (assoc 'comm attributes))))
|
||||
;; The returned command name could be truncated
|
||||
;; to 15 characters. Therefore, we cannot check
|
||||
;; for `string-equal'.
|
||||
(and comm (string-match-p
|
||||
(concat "^" (regexp-quote comm))
|
||||
process-name))))
|
||||
(setq result t)))))))))
|
||||
(and (string-equal (cdr (assoc 'user attributes)) (user-login-name))
|
||||
(when-let ((comm (cdr (assoc 'comm attributes))))
|
||||
;; The returned command name could be truncated to 15
|
||||
;; characters. Therefore, we cannot check for
|
||||
;; `string-equal'.
|
||||
(string-match-p (concat "^" (regexp-quote comm)) process-name))
|
||||
(setq result t)))))))
|
||||
|
||||
;; `file-attribute-*' are introduced in Emacs 25.1.
|
||||
;; `file-attribute-*' are introduced in Emacs 26.1.
|
||||
|
||||
(defalias 'tramp-compat-file-attribute-type
|
||||
(if (fboundp 'file-attribute-type)
|
||||
|
|
@ -181,24 +173,6 @@ and later, and is a float in Emacs 26 and earlier."
|
|||
This is a string of ten letters or dashes as in ls -l."
|
||||
(nth 8 attributes))))
|
||||
|
||||
;; `format-message' is new in Emacs 25.1.
|
||||
(unless (fboundp 'format-message)
|
||||
(defalias 'format-message #'format))
|
||||
|
||||
;; `directory-name-p' is new in Emacs 25.1.
|
||||
(defalias 'tramp-compat-directory-name-p
|
||||
(if (fboundp 'directory-name-p)
|
||||
#'directory-name-p
|
||||
(lambda (name)
|
||||
"Return non-nil if NAME ends with a directory separator character."
|
||||
(let ((len (length name))
|
||||
(lastc ?.))
|
||||
(if (> len 0)
|
||||
(setq lastc (aref name (1- len))))
|
||||
(or (= lastc ?/)
|
||||
(and (memq system-type '(windows-nt ms-dos))
|
||||
(= lastc ?\\)))))))
|
||||
|
||||
;; `file-missing' is introduced in Emacs 26.1.
|
||||
(defconst tramp-file-missing
|
||||
(if (get 'file-missing 'error-conditions) 'file-missing 'file-error)
|
||||
|
|
@ -266,13 +240,6 @@ NAME is unquoted."
|
|||
((eq tramp-syntax 'sep) 'separate)
|
||||
(t tramp-syntax)))
|
||||
|
||||
;; `cl-struct-slot-info' has been introduced with Emacs 25.
|
||||
(defmacro tramp-compat-tramp-file-name-slots ()
|
||||
"Return a list of slot names."
|
||||
(if (fboundp 'cl-struct-slot-info)
|
||||
'(cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name)))
|
||||
'(cdr (mapcar #'car (get 'tramp-file-name 'cl-struct-slots)))))
|
||||
|
||||
;; The signature of `tramp-make-tramp-file-name' has been changed.
|
||||
;; Therefore, we cannot use `url-tramp-convert-url-to-tramp' prior
|
||||
;; Emacs 26.1. We use `temporary-file-directory' as indicator.
|
||||
|
|
@ -285,10 +252,9 @@ NAME is unquoted."
|
|||
#'exec-path
|
||||
(lambda ()
|
||||
"List of directories to search programs to run in remote subprocesses."
|
||||
(let ((handler (find-file-name-handler default-directory 'exec-path)))
|
||||
(if handler
|
||||
(if-let ((handler (find-file-name-handler default-directory 'exec-path)))
|
||||
(funcall handler 'exec-path)
|
||||
exec-path)))))
|
||||
exec-path))))
|
||||
|
||||
;; `time-equal-p' has appeared in Emacs 27.1.
|
||||
(defalias 'tramp-compat-time-equal-p
|
||||
|
|
@ -328,11 +294,6 @@ A nil value for either argument stands for the current time."
|
|||
(unload-feature 'tramp-loaddefs 'force)
|
||||
(unload-feature 'tramp-compat 'force)))
|
||||
|
||||
;;; TODO:
|
||||
;;
|
||||
;; * Starting with Emacs 25.1, replace `tramp-message-show-message' by
|
||||
;; the reverse of `inhibit-message'.
|
||||
|
||||
(provide 'tramp-compat)
|
||||
|
||||
;;; tramp-compat.el ends here
|
||||
|
|
|
|||
|
|
@ -457,7 +457,7 @@ It has been changed in GVFS 1.14.")
|
|||
;; </interface>
|
||||
|
||||
;; The basic structure for GNOME Online Accounts. We use a list :type,
|
||||
;; in order to be compatible with Emacs 24 and 25.
|
||||
;; in order to be compatible with Emacs 25.
|
||||
(cl-defstruct (tramp-goa-name (:type list) :named) method user host port)
|
||||
|
||||
;; "gvfs-<command>" utilities have been deprecated in GVFS 1.31.1. We
|
||||
|
|
@ -625,10 +625,9 @@ First arg specifies the OPERATION, second arg is a list of arguments to
|
|||
pass to the OPERATION."
|
||||
(unless tramp-gvfs-enabled
|
||||
(tramp-user-error nil "Package `tramp-gvfs' not supported"))
|
||||
(let ((fn (assoc operation tramp-gvfs-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-gvfs-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
(tramp-run-real-handler operation args)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(when (featurep 'dbusbind)
|
||||
|
|
@ -649,13 +648,12 @@ pass to the OPERATION."
|
|||
"Like `dbus-byte-array-to-string' but remove trailing \\0 if exists.
|
||||
Return nil for null BYTE-ARRAY."
|
||||
;; The byte array could be a variant. Take care.
|
||||
(let ((byte-array
|
||||
(when-let ((byte-array
|
||||
(if (and (consp byte-array) (atom (car byte-array)))
|
||||
byte-array (car byte-array))))
|
||||
(and byte-array
|
||||
(dbus-byte-array-to-string
|
||||
(if (and (consp byte-array) (zerop (car (last byte-array))))
|
||||
(butlast byte-array) byte-array)))))
|
||||
(butlast byte-array) byte-array))))
|
||||
|
||||
(defun tramp-gvfs-stringify-dbus-message (message)
|
||||
"Convert a D-Bus MESSAGE into readable UTF8 strings, used for traces."
|
||||
|
|
@ -680,6 +678,8 @@ The call will be traced by Tramp with trace level 6."
|
|||
(tramp-message vec 6 "%s" result(tramp-gvfs-stringify-dbus-message result))
|
||||
result))
|
||||
|
||||
(put #'tramp-dbus-function 'tramp-suppress-trace t)
|
||||
|
||||
(defmacro with-tramp-dbus-call-method
|
||||
(vec synchronous bus service path interface method &rest args)
|
||||
"Apply a D-Bus call on bus BUS.
|
||||
|
|
@ -689,14 +689,13 @@ it is an asynchronous call, with `ignore' as callback function.
|
|||
|
||||
The other arguments have the same meaning as with `dbus-call-method'
|
||||
or `dbus-call-method-asynchronously'."
|
||||
(declare (indent 2) (debug t))
|
||||
`(let ((func (if ,synchronous
|
||||
#'dbus-call-method #'dbus-call-method-asynchronously))
|
||||
(args (append (list ,bus ,service ,path ,interface ,method)
|
||||
(if ,synchronous (list ,@args) (list 'ignore ,@args)))))
|
||||
(tramp-dbus-function ,vec func args)))
|
||||
|
||||
(put 'with-tramp-dbus-call-method 'lisp-indent-function 2)
|
||||
(put 'with-tramp-dbus-call-method 'edebug-form-spec '(form symbolp body))
|
||||
(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-call-method\\>"))
|
||||
|
||||
(defmacro with-tramp-dbus-get-all-properties
|
||||
|
|
@ -704,6 +703,7 @@ or `dbus-call-method-asynchronously'."
|
|||
"Return all properties of INTERFACE.
|
||||
The call will be traced by Tramp with trace level 6."
|
||||
;; Check, that interface exists at object path. Retrieve properties.
|
||||
(declare (indent 1) (debug t))
|
||||
`(when (member
|
||||
,interface
|
||||
(tramp-dbus-function
|
||||
|
|
@ -712,8 +712,6 @@ The call will be traced by Tramp with trace level 6."
|
|||
(tramp-dbus-function
|
||||
,vec #'dbus-get-all-properties (list ,bus ,service ,path ,interface))))
|
||||
|
||||
(put 'with-tramp-dbus-get-all-properties 'lisp-indent-function 1)
|
||||
(put 'with-tramp-dbus-get-all-properties 'edebug-form-spec '(form symbolp body))
|
||||
(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-dbus-get-all-properties\\>"))
|
||||
|
||||
(defvar tramp-gvfs-dbus-event-vector nil
|
||||
|
|
@ -772,7 +770,7 @@ file names."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(if (or (and equal-remote
|
||||
|
|
|
|||
|
|
@ -157,10 +157,9 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
|
|||
"Invoke the rclone handler for OPERATION and ARGS.
|
||||
First arg specifies the OPERATION, second arg is a list of arguments to
|
||||
pass to the OPERATION."
|
||||
(let ((fn (assoc operation tramp-rclone-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-rclone-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
(tramp-run-real-handler operation args)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(tramp--with-startup
|
||||
|
|
@ -220,7 +219,7 @@ file names."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(if (or (and t1 (not (tramp-rclone-file-name-p filename)))
|
||||
|
|
|
|||
|
|
@ -1114,8 +1114,7 @@ component is used as the target of the symlink."
|
|||
"Like `file-truename' for Tramp files."
|
||||
;; Preserve trailing "/".
|
||||
(funcall
|
||||
(if (tramp-compat-directory-name-p filename)
|
||||
#'file-name-as-directory #'identity)
|
||||
(if (directory-name-p filename) #'file-name-as-directory #'identity)
|
||||
;; Quote properly.
|
||||
(funcall
|
||||
(if (tramp-compat-file-name-quoted-p filename)
|
||||
|
|
@ -1958,7 +1957,7 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
|
|||
;; scp or rsync DTRT.
|
||||
(progn
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(setq dirname (directory-file-name (expand-file-name dirname))
|
||||
newname (directory-file-name (expand-file-name newname)))
|
||||
|
|
@ -2040,7 +2039,7 @@ file names."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(with-tramp-progress-reporter
|
||||
|
|
@ -2724,7 +2723,7 @@ The method used must be an out-of-band method."
|
|||
(when (file-symlink-p filename)
|
||||
(goto-char (search-backward "->" beg 'noerror)))
|
||||
(search-backward
|
||||
(if (tramp-compat-directory-name-p filename)
|
||||
(if (directory-name-p filename)
|
||||
"."
|
||||
(file-name-nondirectory filename))
|
||||
beg 'noerror)
|
||||
|
|
@ -2734,12 +2733,11 @@ The method used must be an out-of-band method."
|
|||
(goto-char (point-min))
|
||||
;; First find the line to put it on.
|
||||
(when (re-search-forward "^\\([[:space:]]*total\\)" nil t)
|
||||
(let ((available (get-free-disk-space ".")))
|
||||
(when available
|
||||
(when-let ((available (get-free-disk-space ".")))
|
||||
;; Replace "total" with "total used", to avoid confusion.
|
||||
(replace-match "\\1 used in directory")
|
||||
(end-of-line)
|
||||
(insert " available " available))))
|
||||
(insert " available " available)))
|
||||
|
||||
(goto-char (point-max)))))))
|
||||
|
||||
|
|
@ -3501,8 +3499,7 @@ STDERR can also be a file name."
|
|||
(defun tramp-sh-handle-vc-registered (file)
|
||||
"Like `vc-registered' for Tramp files."
|
||||
(when vc-handled-backends
|
||||
(let ((tramp-message-show-message
|
||||
(and (not revert-buffer-in-progress-p) tramp-message-show-message))
|
||||
(let ((inhibit-message (or revert-buffer-in-progress-p inhibit-message))
|
||||
(temp-message (unless revert-buffer-in-progress-p "")))
|
||||
(with-temp-message temp-message
|
||||
(with-parsed-tramp-file-name file nil
|
||||
|
|
@ -3592,10 +3589,9 @@ STDERR can also be a file name."
|
|||
(defun tramp-sh-file-name-handler (operation &rest args)
|
||||
"Invoke remote-shell Tramp file name handler.
|
||||
Fall back to normal file name handler if no Tramp handler exists."
|
||||
(let ((fn (assoc operation tramp-sh-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-sh-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
(tramp-run-real-handler operation args)))
|
||||
|
||||
;; This must be the last entry, because `identity' always matches.
|
||||
;;;###tramp-autoload
|
||||
|
|
@ -4883,11 +4879,8 @@ connection if a previous connection has died for some reason."
|
|||
(not (tramp-file-name-equal-p
|
||||
vec (car tramp-current-connection)))
|
||||
(time-less-p
|
||||
;; `current-time' can be removed once we get rid of Emacs 24.
|
||||
(time-since (or (cdr tramp-current-connection) (current-time)))
|
||||
;; `seconds-to-time' can be removed once we get rid
|
||||
;; of Emacs 24.
|
||||
(seconds-to-time (or tramp-connection-min-time-diff 0))))
|
||||
(time-since (cdr tramp-current-connection))
|
||||
(or tramp-connection-min-time-diff 0)))
|
||||
(throw 'suppress 'suppress))
|
||||
|
||||
;; If too much time has passed since last command was sent, look
|
||||
|
|
@ -4898,11 +4891,9 @@ connection if a previous connection has died for some reason."
|
|||
;; try to send a command from time to time, then look again
|
||||
;; whether the process is really alive.
|
||||
(condition-case nil
|
||||
;; `seconds-to-time' can be removed once we get rid of Emacs 24.
|
||||
(when (and (time-less-p (seconds-to-time 60)
|
||||
(time-since
|
||||
(tramp-get-connection-property
|
||||
p "last-cmd-time" (seconds-to-time 0))))
|
||||
(when (and (time-less-p
|
||||
60 (time-since
|
||||
(tramp-get-connection-property p "last-cmd-time" 0)))
|
||||
(process-live-p p))
|
||||
(tramp-send-command vec "echo are you awake" t t)
|
||||
(unless (and (process-live-p p)
|
||||
|
|
@ -5995,9 +5986,6 @@ function cell is returned to be applied on a buffer."
|
|||
;; likely to produce long command lines, and some shells choke on
|
||||
;; long command lines.
|
||||
;;
|
||||
;; * Don't search for perl5 and perl. Instead, only search for perl and
|
||||
;; then look if it's the right version (with `perl -v').
|
||||
;;
|
||||
;; * When editing a remote CVS controlled file as a different user, VC
|
||||
;; gets confused about the file locking status. Try to find out why
|
||||
;; the workaround doesn't work.
|
||||
|
|
|
|||
|
|
@ -329,10 +329,9 @@ This can be used to disable echo etc."
|
|||
"Invoke the SMB related OPERATION and ARGS.
|
||||
First arg specifies the OPERATION, second arg is a list of arguments to
|
||||
pass to the OPERATION."
|
||||
(let ((fn (assoc operation tramp-smb-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-smb-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
(tramp-run-real-handler operation args)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(unless (memq system-type '(cygwin windows-nt))
|
||||
|
|
@ -420,7 +419,7 @@ pass to the OPERATION."
|
|||
v tramp-file-missing
|
||||
"Copying directory" "No such file or directory" dirname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(cond
|
||||
;; We must use a local temporary directory.
|
||||
|
|
@ -581,8 +580,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
tramp-file-missing
|
||||
"Copying file" "No such file or directory" filename))
|
||||
|
||||
(let ((tmpfile (file-local-copy filename)))
|
||||
(if tmpfile
|
||||
(if-let ((tmpfile (file-local-copy filename)))
|
||||
;; Remote filename.
|
||||
(condition-case err
|
||||
(rename-file tmpfile newname ok-if-already-exists)
|
||||
|
|
@ -592,7 +590,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
|
||||
;; Remote newname.
|
||||
(when (and (file-directory-p newname)
|
||||
(tramp-compat-directory-name-p newname))
|
||||
(directory-name-p newname))
|
||||
(setq newname
|
||||
(expand-file-name (file-name-nondirectory filename) newname)))
|
||||
|
||||
|
|
@ -600,7 +598,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
;; We must also flush the cache of the directory, because
|
||||
|
|
@ -614,7 +612,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(tramp-compat-file-name-unquote filename)
|
||||
(tramp-smb-get-localname v)))
|
||||
(tramp-error
|
||||
v 'file-error "Cannot copy `%s' to `%s'" filename newname))))))
|
||||
v 'file-error "Cannot copy `%s' to `%s'" filename newname)))))
|
||||
|
||||
;; KEEP-DATE handling.
|
||||
(when keep-date
|
||||
|
|
@ -1003,7 +1001,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
|
|||
(setq filename (expand-file-name filename))
|
||||
(unless switches (setq switches ""))
|
||||
;; Mark trailing "/".
|
||||
(when (and (tramp-compat-directory-name-p filename)
|
||||
(when (and (directory-name-p filename)
|
||||
(not full-directory-p))
|
||||
(setq switches (concat switches "F")))
|
||||
(if full-directory-p
|
||||
|
|
@ -1355,7 +1353,7 @@ component is used as the target of the symlink."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(with-tramp-progress-reporter
|
||||
|
|
@ -1922,11 +1920,9 @@ If ARGUMENT is non-nil, use it as argument for
|
|||
;; connection timeout.
|
||||
(with-current-buffer buf
|
||||
(goto-char (point-min))
|
||||
;; `seconds-to-time' can be removed once we get rid of Emacs 24.
|
||||
(when (and (time-less-p (seconds-to-time 60)
|
||||
(time-since
|
||||
(tramp-get-connection-property
|
||||
p "last-cmd-time" (seconds-to-time 0))))
|
||||
(when (and (time-less-p
|
||||
60 (time-since
|
||||
(tramp-get-connection-property p "last-cmd-time" 0)))
|
||||
(process-live-p p)
|
||||
(re-search-forward tramp-smb-errors nil t))
|
||||
(delete-process p)
|
||||
|
|
@ -1992,7 +1988,7 @@ If ARGUMENT is non-nil, use it as argument for
|
|||
(set-process-query-on-exit-flag p nil)
|
||||
|
||||
(condition-case err
|
||||
(let (tramp-message-show-message)
|
||||
(let ((inhibit-message t))
|
||||
;; Play login scenario.
|
||||
(tramp-process-actions
|
||||
p vec nil
|
||||
|
|
@ -2130,7 +2126,5 @@ Removes smb prompt. Returns nil if an error message has appeared."
|
|||
;;
|
||||
;; * Try to remove the inclusion of dummy "" directory. Seems to be at
|
||||
;; several places, especially in `tramp-smb-handle-insert-directory'.
|
||||
;;
|
||||
;; * Ignore case in file names.
|
||||
|
||||
;;; tramp-smb.el ends here
|
||||
|
|
|
|||
|
|
@ -153,10 +153,9 @@ See `tramp-actions-before-shell' for more info.")
|
|||
"Invoke the SUDOEDIT handler for OPERATION and ARGS.
|
||||
First arg specifies the OPERATION, second arg is a list of arguments to
|
||||
pass to the OPERATION."
|
||||
(let ((fn (assoc operation tramp-sudoedit-file-name-handler-alist)))
|
||||
(if fn
|
||||
(if-let ((fn (assoc operation tramp-sudoedit-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
(tramp-run-real-handler operation args)))
|
||||
|
||||
;;;###tramp-autoload
|
||||
(tramp--with-startup
|
||||
|
|
@ -248,7 +247,7 @@ absolute file names."
|
|||
(when (and (not ok-if-already-exists) (file-exists-p newname))
|
||||
(tramp-error v 'file-already-exists newname))
|
||||
(when (and (file-directory-p newname)
|
||||
(not (tramp-compat-directory-name-p newname)))
|
||||
(not (directory-name-p newname)))
|
||||
(tramp-error v 'file-error "File is a directory %s" newname))
|
||||
|
||||
(if (or (and (file-remote-p filename) (not t1))
|
||||
|
|
@ -541,8 +540,7 @@ the result will be a local, non-Tramp, file name."
|
|||
"Like `file-truename' for Tramp files."
|
||||
;; Preserve trailing "/".
|
||||
(funcall
|
||||
(if (tramp-compat-directory-name-p filename)
|
||||
#'file-name-as-directory #'identity)
|
||||
(if (directory-name-p filename) #'file-name-as-directory #'identity)
|
||||
;; Quote properly.
|
||||
(funcall
|
||||
(if (tramp-compat-file-name-quoted-p filename)
|
||||
|
|
|
|||
|
|
@ -94,8 +94,3 @@
|
|||
(provide 'tramp-uu)
|
||||
|
||||
;;; tramp-uu.el ends here
|
||||
|
||||
;; Local Variables:
|
||||
;; mode: Emacs-Lisp
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@
|
|||
;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
|
||||
;; Keywords: comm, processes
|
||||
;; Package: tramp
|
||||
;; Version: 2.4.4-pre
|
||||
;; Package-Requires: ((emacs "24.4"))
|
||||
;; Version: 2.5.0-pre
|
||||
;; Package-Requires: ((emacs "25.1"))
|
||||
;; Package-Type: multi
|
||||
;; URL: https://savannah.gnu.org/projects/tramp
|
||||
|
||||
|
|
@ -1258,7 +1258,7 @@ calling HANDLER.")
|
|||
;; data structure.
|
||||
|
||||
;; The basic structure for remote file names. We use a list :type,
|
||||
;; in order to be compatible with Emacs 24 and 25.
|
||||
;; in order to be compatible with Emacs 25.
|
||||
(cl-defstruct (tramp-file-name (:type list) :named)
|
||||
method user domain host port localname hop)
|
||||
|
||||
|
|
@ -1306,9 +1306,10 @@ entry does not exist, return nil."
|
|||
;; We use the cached property.
|
||||
(tramp-get-connection-property vec hash-entry nil)
|
||||
;; Use the static value from `tramp-methods'.
|
||||
(let ((methods-entry
|
||||
(assoc param (assoc (tramp-file-name-method vec) tramp-methods))))
|
||||
(when methods-entry (cadr methods-entry))))))
|
||||
(when-let ((methods-entry
|
||||
(assoc
|
||||
param (assoc (tramp-file-name-method vec) tramp-methods))))
|
||||
(cadr methods-entry)))))
|
||||
|
||||
;; The localname can be quoted with "/:". Extract this.
|
||||
(defun tramp-file-name-unquote-localname (vec)
|
||||
|
|
@ -1473,7 +1474,7 @@ default values are used."
|
|||
:method method :user user :domain domain :host host
|
||||
:port port :localname localname :hop hop))
|
||||
;; The method must be known.
|
||||
(unless (or nodefault (tramp-completion-mode-p)
|
||||
(unless (or nodefault non-essential
|
||||
(string-equal method tramp-default-method-marker)
|
||||
(assoc method tramp-methods))
|
||||
(tramp-user-error
|
||||
|
|
@ -1749,29 +1750,10 @@ ARGUMENTS to actually emit the message (if applicable)."
|
|||
(setq btf (nth 1 (backtrace-frame btn)))
|
||||
(if (not btf)
|
||||
(setq fn "")
|
||||
(when (symbolp btf)
|
||||
(setq fn (symbol-name btf))
|
||||
(unless
|
||||
(and
|
||||
(string-match-p "^tramp" fn)
|
||||
(not
|
||||
(string-match-p
|
||||
(eval-when-compile
|
||||
(concat
|
||||
"^"
|
||||
(regexp-opt
|
||||
'("tramp-backtrace"
|
||||
"tramp-compat-funcall"
|
||||
"tramp-debug-message"
|
||||
"tramp-error"
|
||||
"tramp-error-with-buffer"
|
||||
"tramp-message"
|
||||
"tramp-signal-hook-function"
|
||||
"tramp-user-error")
|
||||
t)
|
||||
"$"))
|
||||
fn)))
|
||||
(setq fn nil)))
|
||||
(and (symbolp btf) (setq fn (symbol-name btf))
|
||||
(or (not (string-match-p "^tramp" fn))
|
||||
(get btf 'tramp-suppress-trace))
|
||||
(setq fn nil))
|
||||
(setq btn (1+ btn))))
|
||||
;; The following code inserts filename and line number. Should
|
||||
;; be inactive by default, because it is time consuming.
|
||||
|
|
@ -1786,11 +1768,7 @@ ARGUMENTS to actually emit the message (if applicable)."
|
|||
;; The message.
|
||||
(insert (apply #'format-message fmt-string arguments))))
|
||||
|
||||
(defvar tramp-message-show-message (null noninteractive)
|
||||
"Show Tramp message in the minibuffer.
|
||||
This variable is used to suppress progress reporter output, and
|
||||
to disable messages from `tramp-error'. Those messages are
|
||||
visible anyway, because an error is raised.")
|
||||
(put #'tramp-debug-message 'tramp-suppress-trace t)
|
||||
|
||||
(defsubst tramp-message (vec-or-proc level fmt-string &rest arguments)
|
||||
"Emit a message depending on verbosity level.
|
||||
|
|
@ -1808,7 +1786,7 @@ applicable)."
|
|||
(ignore-errors
|
||||
(when (<= level tramp-verbose)
|
||||
;; Display only when there is a minimum level.
|
||||
(when (and tramp-message-show-message (<= level 3))
|
||||
(when (<= level 3)
|
||||
(apply #'message
|
||||
(concat
|
||||
(cond
|
||||
|
|
@ -1840,6 +1818,8 @@ applicable)."
|
|||
(concat (format "(%d) # " level) fmt-string)
|
||||
arguments))))))
|
||||
|
||||
(put #'tramp-message 'tramp-suppress-trace t)
|
||||
|
||||
(defsubst tramp-backtrace (&optional vec-or-proc)
|
||||
"Dump a backtrace into the debug buffer.
|
||||
If VEC-OR-PROC is nil, the buffer *debug tramp* is used. This
|
||||
|
|
@ -1850,13 +1830,16 @@ function is meant for debugging purposes."
|
|||
vec-or-proc 10 "\n%s" (with-output-to-string (backtrace)))
|
||||
(with-output-to-temp-buffer "*debug tramp*" (backtrace)))))
|
||||
|
||||
(put #'tramp-backtrace 'tramp-suppress-trace t)
|
||||
|
||||
(defsubst tramp-error (vec-or-proc signal fmt-string &rest arguments)
|
||||
"Emit an error.
|
||||
VEC-OR-PROC identifies the connection to use, SIGNAL is the
|
||||
signal identifier to be raised, remaining arguments passed to
|
||||
`tramp-message'. Finally, signal SIGNAL is raised with
|
||||
FMT-STRING and ARGUMENTS."
|
||||
(let (tramp-message-show-message signal-hook-function)
|
||||
(let ((inhibit-message t)
|
||||
signal-hook-function)
|
||||
(tramp-backtrace vec-or-proc)
|
||||
(unless arguments
|
||||
;; FMT-STRING could be just a file name, as in
|
||||
|
|
@ -1874,6 +1857,8 @@ FMT-STRING and ARGUMENTS."
|
|||
(signal signal (list (substring-no-properties
|
||||
(apply #'format-message fmt-string arguments))))))
|
||||
|
||||
(put #'tramp-error 'tramp-suppress-trace t)
|
||||
|
||||
(defsubst tramp-error-with-buffer
|
||||
(buf vec-or-proc signal fmt-string &rest arguments)
|
||||
"Emit an error, and show BUF.
|
||||
|
|
@ -1891,13 +1876,13 @@ an input event arrives. The other arguments are passed to `tramp-error'."
|
|||
(apply #'tramp-error vec-or-proc signal fmt-string arguments)
|
||||
;; Save exit.
|
||||
(when (and buf
|
||||
tramp-message-show-message
|
||||
(not (zerop tramp-verbose))
|
||||
;; Do not show when flagged from outside.
|
||||
(not (tramp-completion-mode-p))
|
||||
(not non-essential)
|
||||
;; Show only when Emacs has started already.
|
||||
(current-message))
|
||||
(let ((enable-recursive-minibuffers t))
|
||||
(let ((enable-recursive-minibuffers t)
|
||||
inhibit-message)
|
||||
;; `tramp-error' does not show messages. So we must do it
|
||||
;; ourselves.
|
||||
(apply #'message fmt-string arguments)
|
||||
|
|
@ -1909,19 +1894,21 @@ an input event arrives. The other arguments are passed to `tramp-error'."
|
|||
(when (tramp-file-name-equal-p vec (car tramp-current-connection))
|
||||
(setcdr tramp-current-connection (current-time)))))))
|
||||
|
||||
(put #'tramp-error-with-buffer 'tramp-suppress-trace t)
|
||||
|
||||
;; We must make it a defun, because it is used earlier already.
|
||||
(defun tramp-user-error (vec-or-proc fmt-string &rest arguments)
|
||||
"Signal a user error (or \"pilot error\")."
|
||||
(unwind-protect
|
||||
(apply #'tramp-error vec-or-proc 'user-error fmt-string arguments)
|
||||
;; Save exit.
|
||||
(when (and tramp-message-show-message
|
||||
(not (zerop tramp-verbose))
|
||||
(when (and (not (zerop tramp-verbose))
|
||||
;; Do not show when flagged from outside.
|
||||
(not (tramp-completion-mode-p))
|
||||
(not non-essential)
|
||||
;; Show only when Emacs has started already.
|
||||
(current-message))
|
||||
(let ((enable-recursive-minibuffers t))
|
||||
(let ((enable-recursive-minibuffers t)
|
||||
inhibit-message)
|
||||
;; `tramp-error' does not show messages. So we must do it ourselves.
|
||||
(apply #'message fmt-string arguments)
|
||||
(discard-input)
|
||||
|
|
@ -1931,18 +1918,21 @@ an input event arrives. The other arguments are passed to `tramp-error'."
|
|||
(tramp-file-name-equal-p vec-or-proc (car tramp-current-connection))
|
||||
(setcdr tramp-current-connection (current-time)))))))
|
||||
|
||||
(put #'tramp-user-error 'tramp-suppress-trace t)
|
||||
|
||||
(defmacro tramp-with-demoted-errors (vec-or-proc format &rest body)
|
||||
"Execute BODY while redirecting the error message to `tramp-message'.
|
||||
BODY is executed like wrapped by `with-demoted-errors'. FORMAT
|
||||
is a format-string containing a %-sequence meaning to substitute
|
||||
the resulting error message."
|
||||
(declare (debug (symbolp body))
|
||||
(indent 2))
|
||||
(declare (indent 2) (debug (symbolp form body)))
|
||||
(let ((err (make-symbol "err")))
|
||||
`(condition-case-unless-debug ,err
|
||||
(progn ,@body)
|
||||
(error (tramp-message ,vec-or-proc 3 ,format ,err) nil))))
|
||||
|
||||
(put #'tramp-with-demoted-errors 'tramp-suppress-trace t)
|
||||
|
||||
;; This function provides traces in case of errors not triggered by
|
||||
;; Tramp functions.
|
||||
(defun tramp-signal-hook-function (error-symbol data)
|
||||
|
|
@ -1954,6 +1944,8 @@ the resulting error message."
|
|||
(car tramp-current-connection) error-symbol
|
||||
"%s" (mapconcat (lambda (x) (format "%s" x)) data " "))))
|
||||
|
||||
(put #'tramp-signal-hook-function 'tramp-suppress-trace t)
|
||||
|
||||
(defmacro with-parsed-tramp-file-name (filename var &rest body)
|
||||
"Parse a Tramp filename and make components available in the body.
|
||||
|
||||
|
|
@ -1970,12 +1962,14 @@ Remaining args are Lisp expressions to be evaluated (inside an implicit
|
|||
|
||||
If VAR is nil, then we bind `v' to the structure and `method', `user',
|
||||
`domain', `host', `port', `localname', `hop' to the components."
|
||||
(declare (indent 2) (debug (form symbolp body)))
|
||||
(let ((bindings
|
||||
(mapcar (lambda (elem)
|
||||
(mapcar
|
||||
(lambda (elem)
|
||||
`(,(if var (intern (format "%s-%s" var elem)) elem)
|
||||
(,(intern (format "tramp-file-name-%s" elem))
|
||||
,(or var 'v))))
|
||||
`,(tramp-compat-tramp-file-name-slots))))
|
||||
(cdr (mapcar #'car (cl-struct-slot-info 'tramp-file-name))))))
|
||||
`(let* ((,(or var 'v) (tramp-dissect-file-name ,filename))
|
||||
,@bindings)
|
||||
;; We don't know which of those vars will be used, so we bind them all,
|
||||
|
|
@ -1984,8 +1978,6 @@ If VAR is nil, then we bind `v' to the structure and `method', `user',
|
|||
(ignore ,@(mapcar #'car bindings))
|
||||
,@body)))
|
||||
|
||||
(put 'with-parsed-tramp-file-name 'lisp-indent-function 2)
|
||||
(put 'with-parsed-tramp-file-name 'edebug-form-spec '(form symbolp body))
|
||||
(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-parsed-tramp-file-name\\>"))
|
||||
|
||||
(defun tramp-progress-reporter-update (reporter &optional value suffix)
|
||||
|
|
@ -1996,22 +1988,20 @@ If VAR is nil, then we bind `v' to the structure and `method', `user',
|
|||
(tramp-compat-progress-reporter-update reporter value suffix))))
|
||||
|
||||
(defmacro with-tramp-progress-reporter (vec level message &rest body)
|
||||
"Execute BODY, spinning a progress reporter with MESSAGE.
|
||||
"Execute BODY, spinning a progress reporter with MESSAGE in interactive mode.
|
||||
If LEVEL does not fit for visible messages, there are only traces
|
||||
without a visible progress reporter."
|
||||
(declare (indent 3) (debug t))
|
||||
`(progn
|
||||
`(if (or noninteractive inhibit-message)
|
||||
(progn ,@body)
|
||||
(tramp-message ,vec ,level "%s..." ,message)
|
||||
(let ((cookie "failed")
|
||||
(tm
|
||||
;; We start a pulsing progress reporter after 3 seconds.
|
||||
(when (and tramp-message-show-message
|
||||
;; Display only when there is a minimum level.
|
||||
(<= ,level (min tramp-verbose 3)))
|
||||
(let ((pr (make-progress-reporter ,message nil nil)))
|
||||
(when pr
|
||||
(run-at-time
|
||||
3 0.1 #'tramp-progress-reporter-update pr))))))
|
||||
;; We start a pulsing progress reporter after 3
|
||||
;; seconds. Display only when there is a minimum level.
|
||||
(when (<= ,level (min tramp-verbose 3))
|
||||
(when-let ((pr (make-progress-reporter ,message nil nil)))
|
||||
(run-at-time 3 0.1 #'tramp-progress-reporter-update pr)))))
|
||||
(unwind-protect
|
||||
;; Execute the body.
|
||||
(prog1 (progn ,@body) (setq cookie "done"))
|
||||
|
|
@ -2025,6 +2015,7 @@ without a visible progress reporter."
|
|||
(defmacro with-tramp-file-property (vec file property &rest body)
|
||||
"Check in Tramp cache for PROPERTY, otherwise execute BODY and set cache.
|
||||
FILE must be a local file name on a connection identified via VEC."
|
||||
(declare (indent 3) (debug t))
|
||||
`(if (file-name-absolute-p ,file)
|
||||
(let ((value (tramp-get-file-property ,vec ,file ,property 'undef)))
|
||||
(when (eq value 'undef)
|
||||
|
|
@ -2036,12 +2027,11 @@ FILE must be a local file name on a connection identified via VEC."
|
|||
value)
|
||||
,@body))
|
||||
|
||||
(put 'with-tramp-file-property 'lisp-indent-function 3)
|
||||
(put 'with-tramp-file-property 'edebug-form-spec t)
|
||||
(font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-file-property\\>"))
|
||||
|
||||
(defmacro with-tramp-connection-property (key property &rest body)
|
||||
"Check in Tramp for property PROPERTY, otherwise execute BODY and set."
|
||||
(declare (indent 2) (debug t))
|
||||
`(let ((value (tramp-get-connection-property ,key ,property 'undef)))
|
||||
(when (eq value 'undef)
|
||||
;; We cannot pass ,@body as parameter to
|
||||
|
|
@ -2051,8 +2041,6 @@ FILE must be a local file name on a connection identified via VEC."
|
|||
(tramp-set-connection-property ,key ,property value))
|
||||
value))
|
||||
|
||||
(put 'with-tramp-connection-property 'lisp-indent-function 2)
|
||||
(put 'with-tramp-connection-property 'edebug-form-spec t)
|
||||
(font-lock-add-keywords
|
||||
'emacs-lisp-mode '("\\<with-tramp-connection-property\\>"))
|
||||
|
||||
|
|
@ -2106,7 +2094,7 @@ Example:
|
|||
;; Zeroconf service type.
|
||||
((string-match-p
|
||||
"^_[[:alpha:]]+\\._[[:alpha:]]+$" (nth 1 (car v))))
|
||||
;; Configuration file.
|
||||
;; Configuration file or empty string.
|
||||
(t (file-exists-p (nth 1 (car v))))))
|
||||
(setq r (delete (car v) r)))
|
||||
(setq v (cdr v)))
|
||||
|
|
@ -2272,10 +2260,7 @@ Must be handled by the callers."
|
|||
exec-path make-process))
|
||||
default-directory)
|
||||
;; PROC.
|
||||
((member operation
|
||||
'(file-notify-rm-watch
|
||||
;; Emacs 25+ only.
|
||||
file-notify-valid-p))
|
||||
((member operation '(file-notify-rm-watch file-notify-valid-p))
|
||||
(when (processp (nth 0 args))
|
||||
(with-current-buffer (process-buffer (nth 0 args))
|
||||
default-directory)))
|
||||
|
|
@ -2395,7 +2380,7 @@ Fall back to normal file name handler if no Tramp file name handler exists."
|
|||
(cons operation args))
|
||||
(tramp-run-real-handler operation args))
|
||||
((eq result 'suppress)
|
||||
(let (tramp-message-show-message)
|
||||
(let ((inhibit-message t))
|
||||
(tramp-message
|
||||
v 1 "Suppress received in operation %s"
|
||||
(cons operation args))
|
||||
|
|
@ -2424,8 +2409,8 @@ Fall back to normal file name handler if no Tramp file name handler exists."
|
|||
(defun tramp-completion-file-name-handler (operation &rest args)
|
||||
"Invoke Tramp file name completion handler for OPERATION and ARGS.
|
||||
Falls back to normal file name handler if no Tramp file name handler exists."
|
||||
(let ((fn (assoc operation tramp-completion-file-name-handler-alist)))
|
||||
(if (and fn tramp-mode)
|
||||
(when tramp-mode
|
||||
(if-let ((fn (assoc operation tramp-completion-file-name-handler-alist)))
|
||||
(save-match-data (apply (cdr fn) args))
|
||||
(tramp-run-real-handler operation args))))
|
||||
|
||||
|
|
@ -2433,7 +2418,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
|
|||
(progn (defun tramp-autoload-file-name-handler (operation &rest args)
|
||||
"Load Tramp file name handler, and perform OPERATION."
|
||||
(tramp-unload-file-name-handlers)
|
||||
(if tramp-mode
|
||||
(when tramp-mode
|
||||
(let ((default-directory temporary-file-directory))
|
||||
(load "tramp" 'noerror 'nomessage)))
|
||||
(apply operation args)))
|
||||
|
|
@ -2447,7 +2432,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
|
|||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-autoload-file-name-regexp
|
||||
'tramp-autoload-file-name-handler))
|
||||
(put 'tramp-autoload-file-name-handler 'safe-magic t)))
|
||||
(put #'tramp-autoload-file-name-handler 'safe-magic t)))
|
||||
|
||||
;;;###autoload (tramp-register-autoload-file-name-handlers)
|
||||
|
||||
|
|
@ -2488,29 +2473,28 @@ remote file names."
|
|||
;; respective foreign handlers.
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-file-name-regexp #'tramp-file-name-handler))
|
||||
(put 'tramp-file-name-handler 'safe-magic t)
|
||||
(put #'tramp-file-name-handler 'safe-magic t)
|
||||
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-completion-file-name-regexp
|
||||
#'tramp-completion-file-name-handler))
|
||||
(put 'tramp-completion-file-name-handler 'safe-magic t)
|
||||
(put #'tramp-completion-file-name-handler 'safe-magic t)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-completion-file-name-handler 'operations
|
||||
(put #'tramp-completion-file-name-handler 'operations
|
||||
(mapcar #'car tramp-completion-file-name-handler-alist))
|
||||
|
||||
(when (bound-and-true-p tramp-archive-enabled)
|
||||
(add-to-list 'file-name-handler-alist
|
||||
(cons tramp-archive-file-name-regexp
|
||||
#'tramp-archive-file-name-handler))
|
||||
(put 'tramp-archive-file-name-handler 'safe-magic t))
|
||||
(put #'tramp-archive-file-name-handler 'safe-magic t))
|
||||
|
||||
;; If jka-compr or epa-file are already loaded, move them to the
|
||||
;; front of `file-name-handler-alist'.
|
||||
(dolist (fnh '(epa-file-handler jka-compr-handler))
|
||||
(let ((entry (rassoc fnh file-name-handler-alist)))
|
||||
(when entry
|
||||
(when-let ((entry (rassoc fnh file-name-handler-alist)))
|
||||
(setq file-name-handler-alist
|
||||
(cons entry (delete entry file-name-handler-alist)))))))
|
||||
(cons entry (delete entry file-name-handler-alist))))))
|
||||
|
||||
(tramp--with-startup (tramp-register-file-name-handlers))
|
||||
|
||||
|
|
@ -2522,7 +2506,7 @@ Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'."
|
|||
(add-to-list
|
||||
'tramp-foreign-file-name-handler-alist `(,func . ,handler) append)
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
(put 'tramp-file-name-handler
|
||||
(put #'tramp-file-name-handler
|
||||
'operations
|
||||
(delete-dups
|
||||
(append
|
||||
|
|
@ -2563,19 +2547,6 @@ Add operations defined in `HANDLER-alist' to `tramp-file-name-handler'."
|
|||
|
||||
;;; File name handler functions for completion mode:
|
||||
|
||||
;;;###autoload
|
||||
(defvar tramp-completion-mode nil
|
||||
"If non-nil, external packages signal that they are in file name completion.")
|
||||
(make-obsolete-variable 'tramp-completion-mode 'non-essential "26.1")
|
||||
|
||||
(defun tramp-completion-mode-p ()
|
||||
"Check, whether method / user name / host name completion is active."
|
||||
(or
|
||||
;; Signal from outside.
|
||||
non-essential
|
||||
;; This variable has been obsoleted in Emacs 26.
|
||||
tramp-completion-mode))
|
||||
|
||||
(defun tramp-connectable-p (vec-or-filename)
|
||||
"Check, whether it is possible to connect the remote host w/o side-effects.
|
||||
This is true, if either the remote host is already connected, or if we are
|
||||
|
|
@ -2590,7 +2561,7 @@ not in completion mode."
|
|||
;; `tramp-buffer-name'; otherwise `start-file-process'
|
||||
;; wouldn't run ever when `non-essential' is non-nil.
|
||||
(and vec (process-live-p (get-process (tramp-buffer-name vec))))
|
||||
(not (tramp-completion-mode-p)))))
|
||||
(not non-essential))))
|
||||
|
||||
;; Method, host name and user name completion.
|
||||
;; `tramp-completion-dissect-file-name' returns a list of
|
||||
|
|
@ -2881,7 +2852,7 @@ Either user or host may be nil."
|
|||
(defun tramp-parse-rhosts-group ()
|
||||
"Return a (user host) tuple allowed to access.
|
||||
Either user or host may be nil."
|
||||
(let ((result)
|
||||
(let (result
|
||||
(regexp
|
||||
(concat
|
||||
"^\\(" tramp-host-regexp "\\)"
|
||||
|
|
@ -2966,7 +2937,7 @@ Host is always \"localhost\"."
|
|||
(defun tramp-parse-passwd-group ()
|
||||
"Return a (user host) tuple allowed to access.
|
||||
Host is always \"localhost\"."
|
||||
(let ((result)
|
||||
(let (result
|
||||
(regexp (concat "^\\(" tramp-user-regexp "\\):")))
|
||||
(when (re-search-forward regexp (point-at-eol) t)
|
||||
(setq result (list (match-string 1) "localhost")))
|
||||
|
|
@ -2988,7 +2959,7 @@ Host is always \"localhost\"."
|
|||
(defun tramp-parse-etc-group-group ()
|
||||
"Return a (group host) tuple allowed to access.
|
||||
Host is always \"localhost\"."
|
||||
(let ((result)
|
||||
(let (result
|
||||
(split (split-string (buffer-substring (point) (point-at-eol)) ":")))
|
||||
(when (member (user-login-name) (split-string (nth 3 split) "," 'omit))
|
||||
(setq result (list (nth 0 split) "localhost")))
|
||||
|
|
@ -3025,7 +2996,7 @@ User is always nil."
|
|||
(defun tramp-parse-putty-group (registry)
|
||||
"Return a (user host) tuple allowed to access.
|
||||
User is always nil."
|
||||
(let ((result)
|
||||
(let (result
|
||||
(regexp (concat (regexp-quote registry) "\\\\\\(.+\\)")))
|
||||
(when (re-search-forward regexp (point-at-eol) t)
|
||||
(setq result (list nil (match-string 1))))
|
||||
|
|
@ -3206,10 +3177,8 @@ User is always nil."
|
|||
|
||||
(defun tramp-handle-file-modes (filename)
|
||||
"Like `file-modes' for Tramp files."
|
||||
;; Starting with Emacs 25.1, `when-let' can be used.
|
||||
(let ((attrs (file-attributes (or (file-truename filename) filename))))
|
||||
(when attrs
|
||||
(tramp-mode-string-to-int (tramp-compat-file-attribute-modes attrs)))))
|
||||
(when-let ((attrs (file-attributes (or (file-truename filename) filename))))
|
||||
(tramp-mode-string-to-int (tramp-compat-file-attribute-modes attrs))))
|
||||
|
||||
;; Localname manipulation functions that grok Tramp localnames...
|
||||
(defun tramp-handle-file-name-as-directory (file)
|
||||
|
|
@ -3327,8 +3296,8 @@ User is always nil."
|
|||
(cond
|
||||
((not (file-exists-p file1)) nil)
|
||||
((not (file-exists-p file2)) t)
|
||||
(t (time-less-p (tramp-compat-file-attribute-modification-time
|
||||
(file-attributes file2))
|
||||
(t (time-less-p
|
||||
(tramp-compat-file-attribute-modification-time (file-attributes file2))
|
||||
(tramp-compat-file-attribute-modification-time
|
||||
(file-attributes file1))))))
|
||||
|
||||
|
|
@ -3337,11 +3306,8 @@ User is always nil."
|
|||
(and (file-exists-p filename)
|
||||
;; Sometimes, `file-attributes' does not return a proper value
|
||||
;; even if `file-exists-p' does.
|
||||
(ignore-errors
|
||||
(eq ?-
|
||||
(aref
|
||||
(tramp-compat-file-attribute-modes (file-attributes filename))
|
||||
0)))))
|
||||
(when-let ((attr (file-attributes filename)))
|
||||
(eq ?- (aref (tramp-compat-file-attribute-modes attr) 0)))))
|
||||
|
||||
(defun tramp-handle-file-remote-p (filename &optional identification connected)
|
||||
"Like `file-remote-p' for Tramp files."
|
||||
|
|
@ -3380,8 +3346,7 @@ User is always nil."
|
|||
"Like `file-truename' for Tramp files."
|
||||
;; Preserve trailing "/".
|
||||
(funcall
|
||||
(if (tramp-compat-directory-name-p filename)
|
||||
#'file-name-as-directory #'identity)
|
||||
(if (directory-name-p filename) #'file-name-as-directory #'identity)
|
||||
;; Quote properly.
|
||||
(funcall
|
||||
(if (tramp-compat-file-name-quoted-p filename)
|
||||
|
|
@ -3452,7 +3417,7 @@ User is always nil."
|
|||
"Like `insert-directory' for Tramp files."
|
||||
(unless switches (setq switches ""))
|
||||
;; Mark trailing "/".
|
||||
(when (and (tramp-compat-directory-name-p filename)
|
||||
(when (and (directory-name-p filename)
|
||||
(not full-directory-p))
|
||||
(setq switches (concat switches "F")))
|
||||
;; Check, whether directory is accessible.
|
||||
|
|
@ -3621,7 +3586,7 @@ User is always nil."
|
|||
v tramp-file-missing "Cannot load nonexistent file `%s'" file))
|
||||
(if (not (file-exists-p file))
|
||||
nil
|
||||
(let ((tramp-message-show-message (not nomessage)))
|
||||
(let ((inhibit-message nomessage))
|
||||
(with-tramp-progress-reporter v 0 (format "Loading %s" file)
|
||||
(let ((local-copy (file-local-copy file)))
|
||||
(unwind-protect
|
||||
|
|
@ -4505,8 +4470,7 @@ If FILENAME is remote, a file name handler is called."
|
|||
(when (and modes (not (zerop (logand modes #o2000))))
|
||||
(setq gid (tramp-compat-file-attribute-group-id (file-attributes dir)))))
|
||||
|
||||
(let ((handler (find-file-name-handler filename 'tramp-set-file-uid-gid)))
|
||||
(if handler
|
||||
(if-let ((handler (find-file-name-handler filename 'tramp-set-file-uid-gid)))
|
||||
(funcall handler #'tramp-set-file-uid-gid filename uid gid)
|
||||
;; On W32 systems, "chown" does not work.
|
||||
(unless (memq system-type '(ms-dos windows-nt))
|
||||
|
|
@ -4514,7 +4478,7 @@ If FILENAME is remote, a file name handler is called."
|
|||
(gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer))))
|
||||
(tramp-call-process
|
||||
nil "chown" nil nil nil (format "%d:%d" uid gid)
|
||||
(tramp-unquote-shell-quote-argument filename)))))))
|
||||
(tramp-unquote-shell-quote-argument filename))))))
|
||||
|
||||
(defun tramp-get-local-uid (id-format)
|
||||
"The uid of the local user, in ID-FORMAT.
|
||||
|
|
@ -5058,10 +5022,4 @@ name of a process or buffer, or nil to default to the current buffer."
|
|||
;; `start-file-process-shell-command', which is sufficient due to
|
||||
;; connection-local `shell-file-name'.
|
||||
|
||||
|
||||
;;; tramp.el ends here
|
||||
|
||||
;; Local Variables:
|
||||
;; mode: Emacs-Lisp
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
|
|
|
|||
|
|
@ -35,11 +35,8 @@
|
|||
;; Emacs version check is defined in macro AC_EMACS_INFO of
|
||||
;; aclocal.m4; should be changed only there.
|
||||
|
||||
;; Needed for Emacs 24.
|
||||
(defvar inhibit-message)
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-version "2.4.4-pre"
|
||||
(defconst tramp-version "2.5.0-pre"
|
||||
"This version of Tramp.")
|
||||
|
||||
;;;###tramp-autoload
|
||||
|
|
@ -71,9 +68,9 @@
|
|||
"The repository revision of the Tramp sources.")
|
||||
|
||||
;; Check for Emacs version.
|
||||
(let ((x (if (not (string-lessp emacs-version "24.4"))
|
||||
(let ((x (if (not (string-lessp emacs-version "25.1"))
|
||||
"ok"
|
||||
(format "Tramp 2.4.4-pre is not fit for %s"
|
||||
(format "Tramp 2.5.0-pre is not fit for %s"
|
||||
(replace-regexp-in-string "\n" "" (emacs-version))))))
|
||||
(unless (string-equal "ok" x) (error "%s" x)))
|
||||
|
||||
|
|
@ -102,8 +99,3 @@
|
|||
(provide 'trampver)
|
||||
|
||||
;;; trampver.el ends here
|
||||
|
||||
;; Local Variables:
|
||||
;; mode: Emacs-Lisp
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@
|
|||
(setq password-cache-expiry nil
|
||||
tramp-cache-read-persistent-data t ;; For auth-sources.
|
||||
tramp-copy-size-limit nil
|
||||
tramp-message-show-message nil
|
||||
tramp-persistency-file-name nil
|
||||
tramp-verbose 0)
|
||||
|
||||
|
|
@ -971,4 +970,5 @@ If INTERACTIVE is non-nil, the tests are run interactively."
|
|||
"^tramp-archive"))
|
||||
|
||||
(provide 'tramp-archive-tests)
|
||||
|
||||
;;; tramp-archive-tests.el ends here
|
||||
|
|
|
|||
|
|
@ -67,8 +67,6 @@
|
|||
(defvar tramp-remote-path)
|
||||
(defvar tramp-remote-process-environment)
|
||||
|
||||
;; Needed for Emacs 24.
|
||||
(defvar inhibit-message)
|
||||
;; Needed for Emacs 25.
|
||||
(defvar connection-local-criteria-alist)
|
||||
(defvar connection-local-profile-alist)
|
||||
|
|
@ -100,8 +98,8 @@
|
|||
(add-to-list
|
||||
'tramp-default-host-alist
|
||||
`("\\`mock\\'" nil ,(system-name)))
|
||||
;; Emacs' Makefile sets $HOME to a nonexistent value. Needed in
|
||||
;; batch mode only, therefore.
|
||||
;; Emacs's Makefile sets $HOME to a nonexistent value. Needed
|
||||
;; in batch mode only, therefore.
|
||||
(unless (and (null noninteractive) (file-directory-p "~/"))
|
||||
(setenv "HOME" temporary-file-directory))
|
||||
(format "/mock::%s" temporary-file-directory)))
|
||||
|
|
@ -112,7 +110,6 @@
|
|||
remote-file-name-inhibit-cache nil
|
||||
tramp-cache-read-persistent-data t ;; For auth-sources.
|
||||
tramp-copy-size-limit nil
|
||||
tramp-message-show-message nil
|
||||
tramp-persistency-file-name nil
|
||||
tramp-verbose 0)
|
||||
|
||||
|
|
@ -177,7 +174,6 @@ Print the content of the Tramp connection and debug buffers, if
|
|||
properly. BODY shall not contain a timeout."
|
||||
(declare (indent 1) (debug (natnump body)))
|
||||
`(let ((tramp-verbose (max (or ,verbose 0) (or tramp-verbose 0)))
|
||||
(tramp-message-show-message t)
|
||||
(debug-ignored-errors
|
||||
(append
|
||||
'("^make-symbolic-link not supported$"
|
||||
|
|
@ -2039,7 +2035,7 @@ properly. BODY shall not contain a timeout."
|
|||
"/method:host:/:/path//foo"))
|
||||
|
||||
;; Forwhatever reasons, the following tests let Emacs crash for
|
||||
;; Emacs 24 and Emacs 25, occasionally. No idea what's up.
|
||||
;; Emacs 25, occasionally. No idea what's up.
|
||||
(when (tramp--test-emacs26-p)
|
||||
(should
|
||||
(string-equal (substitute-in-file-name "/method:host://~foo") "/~foo"))
|
||||
|
|
@ -2238,7 +2234,7 @@ This checks also `file-name-as-directory', `file-name-directory',
|
|||
(should
|
||||
(string-equal
|
||||
(file-name-as-directory file)
|
||||
(if (tramp-completion-mode-p)
|
||||
(if non-essential
|
||||
file (concat file (if (tramp--test-ange-ftp-p) "/" "./")))))
|
||||
(should (string-equal (file-name-directory file) file))
|
||||
(should (string-equal (file-name-nondirectory file) "")))))))
|
||||
|
|
@ -2376,7 +2372,7 @@ This checks also `file-name-as-directory', `file-name-directory',
|
|||
;; Check message.
|
||||
;; Macro `ert-with-message-capture' was introduced in Emacs 26.1.
|
||||
(with-no-warnings (when (symbol-plist 'ert-with-message-capture)
|
||||
(let ((tramp-message-show-message t))
|
||||
(let (inhibit-message)
|
||||
(dolist
|
||||
(noninteractive (unless (tramp--test-ange-ftp-p) '(nil t)))
|
||||
(dolist (visit '(nil t "string" no-message))
|
||||
|
|
@ -4242,8 +4238,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'."
|
|||
:tags '(:expensive-test)
|
||||
(skip-unless (tramp--test-enabled))
|
||||
(skip-unless (or (tramp--test-adb-p) (tramp--test-sh-p)))
|
||||
;; `make-process' has been inserted in Emacs 25.1. It supports file
|
||||
;; name handlers since Emacs 27.
|
||||
;; `make-process' supports file name handlers since Emacs 27.
|
||||
(skip-unless (tramp--test-emacs27-p))
|
||||
|
||||
(dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
|
||||
|
|
@ -4965,13 +4960,9 @@ INPUT, if non-nil, is a string sent to the process."
|
|||
(error (ert-skip "`vc-create-repo' not supported")))
|
||||
;; The structure of VC-FILESET is not documented. Let's
|
||||
;; hope it won't change.
|
||||
(condition-case nil
|
||||
(vc-register
|
||||
(list (car vc-handled-backends)
|
||||
(list (file-name-nondirectory tmp-name2))))
|
||||
;; `vc-register' has changed its arguments in Emacs
|
||||
;; 25.1. Let's skip it for older Emacsen.
|
||||
(error (skip-unless (tramp--test-emacs25-p))))
|
||||
;; vc-git uses an own process sentinel, Tramp's sentinel
|
||||
;; for flushing the cache isn't used.
|
||||
(dired-uncache (concat (file-remote-p default-directory) "/"))
|
||||
|
|
@ -5228,12 +5219,6 @@ INPUT, if non-nil, is a string sent to the process."
|
|||
(delete-directory tmp-file)
|
||||
(should-not (file-exists-p tmp-file))))
|
||||
|
||||
(defun tramp--test-emacs25-p ()
|
||||
"Check for Emacs version >= 25.1.
|
||||
Some semantics has been changed for there, w/o new functions or
|
||||
variables, so we check the Emacs version directly."
|
||||
(>= emacs-major-version 25))
|
||||
|
||||
(defun tramp--test-emacs26-p ()
|
||||
"Check for Emacs version >= 26.1.
|
||||
Some semantics has been changed for there, w/o new functions or
|
||||
|
|
@ -6162,12 +6147,14 @@ Since it unloads Tramp, it shall be the last test to run."
|
|||
(and (or (and (boundp x) (null (local-variable-if-set-p x)))
|
||||
(and (functionp x) (null (autoloadp (symbol-function x)))))
|
||||
(string-match "^tramp" (symbol-name x))
|
||||
;; `tramp-completion-mode' is autoloaded in Emacs < 28.1.
|
||||
(not (eq 'tramp-completion-mode x))
|
||||
(not (string-match "^tramp\\(-archive\\)?--?test" (symbol-name x)))
|
||||
(not (string-match "unload-hook$" (symbol-name x)))
|
||||
(ert-fail (format "`%s' still bound" x)))))
|
||||
;; The defstruct `tramp-file-name' and all its internal functions
|
||||
;; shall be purged. `cl--find-class' must be protected in Emacs 24.
|
||||
(with-no-warnings (should-not (cl--find-class 'tramp-file-name)))
|
||||
;; shall be purged.
|
||||
(should-not (cl--find-class 'tramp-file-name))
|
||||
(mapatoms
|
||||
(lambda (x)
|
||||
(and (functionp x)
|
||||
|
|
@ -6214,4 +6201,5 @@ If INTERACTIVE is non-nil, the tests are run interactively."
|
|||
;; file name operation cannot run in the timer. Remove `:unstable' tag?
|
||||
|
||||
(provide 'tramp-tests)
|
||||
|
||||
;;; tramp-tests.el ends here
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue