Tramp code cleanup

* lisp/net/tramp-adb.el
(tramp-adb-handle-directory-files-and-attributes): Use it.

* lisp/net/tramp-compat.el (tramp-compat-replace-regexp-in-region):
New defalias.

* lisp/net/tramp-crypt.el (tramp-crypt-do-encrypt-or-decrypt-file-name):
Fix root filename for cache.

* lisp/net/tramp-gvfs.el (tramp-gvfs-do-copy-or-rename-file):
Adapt check for proper remote command.

* lisp/net/tramp-sh.el (tramp-open-shell): Add sanity check for
shell prompt.
(tramp-get-ls-command): Check, that argument "--color=never" has
the intended effect.
This commit is contained in:
Michael Albinus 2022-08-14 17:01:25 +02:00
parent 9d52617935
commit 1d3fe25690
5 changed files with 63 additions and 18 deletions

View file

@ -324,7 +324,7 @@ arguments to pass to the OPERATION."
(tramp-compat-file-name-concat localname "."))
(tramp-shell-quote-argument
(tramp-compat-file-name-concat localname ".."))))
(replace-regexp-in-region
(tramp-compat-replace-regexp-in-region
(regexp-quote
(tramp-compat-file-name-unquote
(file-name-as-directory localname)))

View file

@ -330,6 +330,29 @@ CONDITION can also be a list of error conditions."
(autoload 'netrc-parse "netrc")
(netrc-parse file))))
;; Function `replace-regexp-in-region' is new in Emacs 28.1.
(defalias 'tramp-compat-replace-regexp-in-region
(if (fboundp 'replace-regexp-in-region)
#'replace-regexp-in-region
(lambda (regexp replacement &optional start end)
(if start
(when (< start (point-min))
(error "Start before start of buffer"))
(setq start (point)))
(if end
(when (> end (point-max))
(error "End after end of buffer"))
(setq end (point-max)))
(save-excursion
(let ((matches 0)
(case-fold-search nil))
(goto-char start)
(while (re-search-forward regexp end t)
(replace-match replacement t)
(setq matches (1+ matches)))
(and (not (zerop matches))
matches))))))
(dolist (elt (all-completions "tramp-compat-" obarray 'functionp))
(put (intern elt) 'tramp-suppress-trace t))

View file

@ -426,7 +426,7 @@ Otherwise, return NAME."
(if (directory-name-p name) #'file-name-as-directory #'identity)
(concat
dir
(unless (string-equal localname "/")
(unless (string-match-p (rx (seq bos (opt "/") eos)) localname)
(with-tramp-file-property
crypt-vec localname (concat (symbol-name op) "-file-name")
(unless (tramp-crypt-send-command

View file

@ -1055,9 +1055,10 @@ file names."
;; code in case of direct copy/move. Apply
;; sanity checks.
(or (not equal-remote)
(tramp-gvfs-info newname)
(eq op 'copy)
(not (tramp-gvfs-info filename))))
(and
(tramp-gvfs-info newname)
(or (eq op 'copy)
(not (tramp-gvfs-info filename))))))
(if (or (not equal-remote)
(and equal-remote

View file

@ -4205,14 +4205,17 @@ file exists and nonzero exit status otherwise."
;; by some sh implementations (eg, bash when called as sh) on
;; startup; this way, we avoid the startup file clobbering $PS1.
;; $PROMPT_COMMAND is another way to set the prompt in /bin/bash,
;; it must be discarded as well. $HISTFILE is set according to
;; `tramp-histfile-override'. $TERM and $INSIDE_EMACS set here to
;; ensure they have the correct values when the shell starts, not
;; just processes run within the shell. (Which processes include
;; our initial probes to ensure the remote shell is usable.)
;; For the time being, we assume that all shells interpret -i as
;; interactive shell. Must be the last argument, because (for
;; example) bash expects long options first.
;; it must be discarded as well. Some ssh daemons (for example,
;; on Android devices) do not acknowledge the $PS1 setting in
;; that call, so we make a further sanity check. (Bug#57044)
;; $HISTFILE is set according to `tramp-histfile-override'. $TERM
;; and $INSIDE_EMACS set here to ensure they have the correct
;; values when the shell starts, not just processes run within the
;; shell. (Which processes include our initial probes to ensure
;; the remote shell is usable.) For the time being, we assume
;; that all shells interpret -i as interactive shell. Must be the
;; last argument, because (for example) bash expects long options
;; first.
(tramp-send-command
vec (format
(concat
@ -4228,7 +4231,21 @@ file exists and nonzero exit status otherwise."
""))
(tramp-shell-quote-argument tramp-end-of-output)
shell (or (tramp-get-sh-extra-args shell) ""))
t)
t t)
;; Sanity check.
(tramp-barf-if-no-shell-prompt
(tramp-get-connection-process vec) 10
"Couldn't find remote shell prompt for %s" shell)
(unless
(tramp-check-for-regexp
(tramp-get-connection-process vec) (regexp-quote tramp-end-of-output))
(tramp-message vec 5 "Setting shell prompt")
(tramp-send-command
vec (format "PS1=%s PS2='' PS3='' PROMPT_COMMAND=''"
(tramp-shell-quote-argument tramp-end-of-output))
t))
;; Check proper HISTFILE setting. We give up when not working.
(when (and (stringp tramp-histfile-override)
(file-name-directory tramp-histfile-override))
@ -5524,10 +5541,14 @@ Nonexistent directories are removed from spec."
;; "--color=never" argument (for example on FreeBSD).
(when (tramp-send-command-and-check
vec (format "%s -lnd /" result))
(when (tramp-send-command-and-check
vec (format
"%s --color=never -al %s"
result (tramp-get-remote-null-device vec)))
(when (and (tramp-send-command-and-check
vec (format
"%s --color=never -al %s"
result (tramp-get-remote-null-device vec)))
(not (string-match-p
(regexp-quote "\e")
(tramp-get-buffer-string
(tramp-get-buffer vec)))))
(setq result (concat result " --color=never")))
(throw 'ls-found result))
(setq dl (cdr dl))))))