mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-04-21 05:21:37 -07:00
Make tramp-archive fit for older Emacsen
* lisp/net/tramp-archive.el (tramp-archive-enabled) (tramp-archive-file-name-handler-alist) (tramp-archive-file-name-handler): Adapt docstring. (tramp-register-archive-file-name-handler): Remove it from `after-init-hook' when unloading. (tramp-archive-gvfs-host): New defsubst. (tramp-archive-dissect-file-name): Use it. * lisp/net/tramp-cmds.el (tramp-cleanup-all-connections): Check that `tramp-archive-enabled' is bound. * test/lisp/net/tramp-archive-tests.el (tramp-archive-test42-auto-load): Check also that tramp-archive is not loaded when Tramp is loaded. (tramp-archive-test42-delay-load): Adapt test messages.
This commit is contained in:
parent
327d251f8a
commit
d2630e4569
3 changed files with 56 additions and 38 deletions
|
|
@ -116,8 +116,9 @@
|
|||
;; would load Tramp. So we make a cheaper check.
|
||||
;;;###autoload
|
||||
(defvar tramp-archive-enabled (featurep 'dbusbind)
|
||||
"Non-nil when GVFS is available.")
|
||||
"Non-nil when file archive support is available.")
|
||||
|
||||
;; After loading tramp-gvfs.el, we know it better.
|
||||
(setq tramp-archive-enabled tramp-gvfs-enabled)
|
||||
|
||||
;; <https://github.com/libarchive/libarchive/wiki/LibarchiveFormats>
|
||||
|
|
@ -175,6 +176,9 @@ It must be supported by libarchive(3).")
|
|||
"\\)" ;; \1
|
||||
"\\(" "/" ".*" "\\)" "\\'"))) ;; \2
|
||||
|
||||
;; In older Emacsen (prior 27.1), `tramp-archive-autoload-file-name-regexp'
|
||||
;; is not autoloaded. So we cannot expect it to be known in
|
||||
;; tramp-loaddefs.el. But it exists, when tramp-archive.el is loaded.
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-archive-file-name-regexp
|
||||
(ignore-errors (tramp-archive-autoload-file-name-regexp))
|
||||
|
|
@ -266,7 +270,7 @@ It must be supported by libarchive(3).")
|
|||
(vc-registered . ignore)
|
||||
(verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime)
|
||||
(write-region . tramp-archive-handle-not-implemented))
|
||||
"Alist of handler functions for GVFS archive method.
|
||||
"Alist of handler functions for file archive method.
|
||||
Operations not mentioned here will be handled by the default Emacs primitives.")
|
||||
|
||||
(defsubst tramp-archive-file-name-for-operation (operation &rest args)
|
||||
|
|
@ -288,7 +292,7 @@ pass to the OPERATION."
|
|||
|
||||
;;;###tramp-autoload
|
||||
(defun tramp-archive-file-name-handler (operation &rest args)
|
||||
"Invoke the GVFS archive related OPERATION.
|
||||
"Invoke the file archive related OPERATION.
|
||||
First arg specifies the OPERATION, second arg is a list of arguments to
|
||||
pass to the OPERATION."
|
||||
(let* ((filename (apply 'tramp-archive-file-name-for-operation
|
||||
|
|
@ -323,8 +327,16 @@ pass to the OPERATION."
|
|||
(put 'tramp-archive-file-name-handler 'safe-magic t))))
|
||||
|
||||
;;;###autoload
|
||||
(add-hook 'after-init-hook 'tramp-register-archive-file-name-handler)
|
||||
(progn
|
||||
(add-hook 'after-init-hook 'tramp-register-archive-file-name-handler)
|
||||
(add-hook
|
||||
'tramp-archive-unload-hook
|
||||
(lambda ()
|
||||
(remove-hook
|
||||
'after-init-hook 'tramp-register-archive-file-name-handler))))
|
||||
|
||||
;; In older Emacsen (prior 27.1), the autoload above does not exist.
|
||||
;; So we call it again; it doesn't hurt.
|
||||
(tramp-register-archive-file-name-handler)
|
||||
|
||||
;; Mark `operations' the handler is responsible for.
|
||||
|
|
@ -343,12 +355,6 @@ pass to the OPERATION."
|
|||
(remove-hook
|
||||
'url-handler-mode-hook 'tramp-register-file-name-handlers)))))
|
||||
|
||||
;; Debug.
|
||||
;(trace-function-background 'tramp-archive-file-name-handler)
|
||||
;(trace-function-background 'tramp-gvfs-file-name-handler)
|
||||
;(trace-function-background 'tramp-file-name-archive)
|
||||
;(trace-function-background 'tramp-archive-dissect-file-name)
|
||||
|
||||
|
||||
;; File name conversions.
|
||||
|
||||
|
|
@ -374,6 +380,10 @@ The hash key is the archive name. The value is a cons of the
|
|||
used `tramp-file-name' structure for tramp-gvfs, and the file
|
||||
name of a local copy, if any.")
|
||||
|
||||
(defsubst tramp-archive-gvfs-host (archive)
|
||||
"Return host name of ARCHIVE as used in GVFS for mounting"
|
||||
(url-hexify-string (tramp-gvfs-url-file-name archive)))
|
||||
|
||||
(defun tramp-archive-dissect-file-name (name)
|
||||
"Return a `tramp-file-name' structure.
|
||||
The structure consists of the `tramp-archive-method' method, the
|
||||
|
|
@ -397,8 +407,7 @@ name is kept in slot `hop'"
|
|||
(let ((archive
|
||||
(tramp-make-tramp-file-name
|
||||
(tramp-archive-dissect-file-name archive) nil 'noarchive)))
|
||||
(setf (tramp-file-name-host vec)
|
||||
(url-hexify-string (tramp-gvfs-url-file-name archive))))
|
||||
(setf (tramp-file-name-host vec) (tramp-archive-gvfs-host archive)))
|
||||
(puthash archive (list vec) tramp-archive-hash))
|
||||
|
||||
;; http://...
|
||||
|
|
@ -411,15 +420,13 @@ name is kept in slot `hop'"
|
|||
(url-type (url-generic-parse-url archive))
|
||||
url-tramp-protocols))
|
||||
(archive (url-tramp-convert-url-to-tramp archive)))
|
||||
(setf (tramp-file-name-host vec)
|
||||
(url-hexify-string (tramp-gvfs-url-file-name archive))))
|
||||
(setf (tramp-file-name-host vec) (tramp-archive-gvfs-host archive)))
|
||||
(puthash archive (list vec) tramp-archive-hash))
|
||||
|
||||
;; GVFS supported schemes.
|
||||
((or (tramp-gvfs-file-name-p archive)
|
||||
(not (file-remote-p archive)))
|
||||
(setf (tramp-file-name-host vec)
|
||||
(url-hexify-string (tramp-gvfs-url-file-name archive)))
|
||||
(setf (tramp-file-name-host vec) (tramp-archive-gvfs-host archive))
|
||||
(puthash archive (list vec) tramp-archive-hash))
|
||||
|
||||
;; Anything else. Here we call `file-local-copy', which we
|
||||
|
|
@ -428,8 +435,7 @@ name is kept in slot `hop'"
|
|||
(inhibit-file-name-handlers
|
||||
(cons 'jka-compr-handler inhibit-file-name-handlers))
|
||||
(copy (file-local-copy archive)))
|
||||
(setf (tramp-file-name-host vec)
|
||||
(url-hexify-string (tramp-gvfs-url-file-name copy)))
|
||||
(setf (tramp-file-name-host vec) (tramp-archive-gvfs-host copy))
|
||||
(puthash archive (cons vec copy) tramp-archive-hash))))
|
||||
|
||||
;; So far, `vec' handles just the mount point. Add `localname',
|
||||
|
|
|
|||
|
|
@ -144,7 +144,8 @@ This includes password cache, file cache, connection cache, buffers."
|
|||
(clrhash tramp-cache-data)
|
||||
|
||||
;; Cleanup local copies of archives.
|
||||
(tramp-archive-cleanup-hash)
|
||||
(when (bound-and-true-p tramp-archive-enabled)
|
||||
(tramp-archive-cleanup-hash))
|
||||
|
||||
;; Remove buffers.
|
||||
(dolist (name (tramp-list-tramp-buffers))
|
||||
|
|
|
|||
|
|
@ -808,21 +808,29 @@ This tests also `file-executable-p', `file-writable-p' and `set-file-modes'."
|
|||
;; Autoloading tramp-archive works since Emacs 27.1.
|
||||
(skip-unless (tramp-archive--test-emacs27-p))
|
||||
|
||||
;; tramp-archive is neither loaded at Emacs startup, nor when
|
||||
;; loading a file like "/ssh::" (which loads Tramp).
|
||||
(let ((default-directory (expand-file-name temporary-file-directory))
|
||||
(code
|
||||
"(progn \
|
||||
(message \"tramp-archive loaded: %%s %%s\" \
|
||||
(featurep 'tramp) (featurep 'tramp-archive)) \
|
||||
(file-attributes %S \"/\") \
|
||||
(message \"tramp-archive loaded: %%s %%s\" \
|
||||
(featurep 'tramp) (featurep 'tramp-archive)))"))
|
||||
(dolist (file `("/ssh::foo" ,(concat tramp-archive-test-archive "foo")))
|
||||
(should
|
||||
(string-match
|
||||
(format
|
||||
"tramp-archive loaded: nil nil[[:ascii:]]+tramp-archive loaded: t %s"
|
||||
(tramp-archive-file-name-p file))
|
||||
(shell-command-to-string
|
||||
(format
|
||||
"(message \"Tramp loaded: %%s\" (and (file-exists-p %S) t))"
|
||||
tramp-archive-test-archive)))
|
||||
(should
|
||||
(string-match
|
||||
"Tramp loaded: t[\n\r]+"
|
||||
(shell-command-to-string
|
||||
(format
|
||||
"%s -batch -Q -L %s --eval %s"
|
||||
(shell-quote-argument
|
||||
(expand-file-name invocation-name invocation-directory))
|
||||
(mapconcat 'shell-quote-argument load-path " -L ")
|
||||
(shell-quote-argument code)))))))
|
||||
"%s -batch -Q -L %s --eval %s"
|
||||
(shell-quote-argument
|
||||
(expand-file-name invocation-name invocation-directory))
|
||||
(mapconcat 'shell-quote-argument load-path " -L ")
|
||||
(shell-quote-argument (format code file)))))))))
|
||||
|
||||
(ert-deftest tramp-archive-test42-delay-load ()
|
||||
"Check that `tramp-archive' is loaded lazily, only when needed."
|
||||
|
|
@ -836,18 +844,21 @@ This tests also `file-executable-p', `file-writable-p' and `set-file-modes'."
|
|||
(let ((default-directory (expand-file-name temporary-file-directory))
|
||||
(code
|
||||
"(progn \
|
||||
(setq tramp-archive-enabled %s) \
|
||||
(message \"Tramp loaded: %%s\" (featurep 'tramp-archive)) \
|
||||
(find-file %S \"/\") \
|
||||
(message \"Tramp loaded: %%s\" (featurep 'tramp-archive)) \
|
||||
(file-attributes %S \"/\") \
|
||||
(message \"Tramp loaded: %%s\" (featurep 'tramp-archive)))"))
|
||||
(setq tramp-archive-enabled %s) \
|
||||
(message \"tramp-archive loaded: %%s\" \
|
||||
(featurep 'tramp-archive)) \
|
||||
(file-attributes %S \"/\") \
|
||||
(message \"tramp-archive loaded: %%s\" \
|
||||
(featurep 'tramp-archive)) \
|
||||
(file-attributes %S \"/\") \
|
||||
(message \"tramp-archive loaded: %%s\" \
|
||||
(featurep 'tramp-archive)))"))
|
||||
;; tramp-archive doesn't load when `tramp-archive-enabled' is nil.
|
||||
(dolist (tae '(t nil))
|
||||
(should
|
||||
(string-match
|
||||
(format
|
||||
"Tramp loaded: nil[[:ascii:]]+Tramp loaded: nil[[:ascii:]]+Tramp loaded: %s"
|
||||
"tramp-archive loaded: nil[[:ascii:]]+tramp-archive loaded: nil[[:ascii:]]+tramp-archive loaded: %s"
|
||||
tae)
|
||||
(shell-command-to-string
|
||||
(format
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue