Some minor Tramp changes

* lisp/net/tramp-sh.el (tramp-sh-handle-process-file): Do proper quoting.

* lisp/net/tramp.el (tramp-string-empty-or-nil-p):
Declare `tramp-suppress-trace' property.
(tramp-skeleton-make-symbolic-link): Drop volume letter when flushing.

* test/lisp/net/tramp-tests.el (tramp-test39-make-lock-file-name):
Adapt test.
(tramp-test42-utf8): Do not run expensive tests on MS Windows.
This commit is contained in:
Michael Albinus 2024-12-29 12:26:05 +01:00
parent 72eb5f8bed
commit 680906c136
3 changed files with 70 additions and 50 deletions

View file

@ -3278,8 +3278,7 @@ will be used."
(setq ret (tramp-send-command-and-check
v (format
"cd %s && %s"
(tramp-unquote-shell-quote-argument localname)
command)
(tramp-shell-quote-argument localname) command)
t t t))
(unless (natnump ret) (setq ret 1))
;; We should add the output anyway.
@ -5675,7 +5674,7 @@ Nonexistent directories are removed from spec."
(dolist (cmd
;; Prefer GNU ls on *BSD and macOS.
(if (tramp-check-remote-uname vec tramp-bsd-unames)
'( "gls" "ls" "gnuls") '("ls" "gnuls" "gls")))
'("gls" "ls" "gnuls") '("ls" "gnuls" "gls")))
(let ((dl (tramp-get-remote-path vec))
result)
(while (and dl (setq result (tramp-find-executable vec cmd dl t t)))

View file

@ -1888,8 +1888,14 @@ See `tramp-dissect-file-name' for details."
;;;###tramp-autoload
(defsubst tramp-string-empty-or-nil-p (string)
"Check whether STRING is empty or nil."
;; (declare (tramp-suppress-trace t))
(or (null string) (string= string "")))
;; We cannot use the `declare' form for `tramp-suppress-trace' in
;; autoloaded functions, because the tramp-loaddefs.el generation
;; would fail.
(function-put #'tramp-string-empty-or-nil-p 'tramp-suppress-trace t)
(defun tramp-buffer-name (vec)
"A name for the connection buffer VEC."
(declare (tramp-suppress-trace t))
@ -3717,7 +3723,9 @@ on the same host. Otherwise, TARGET is quoted."
(setf ,target (tramp-file-local-name (expand-file-name ,target))))
;; There could be a cyclic link.
(tramp-flush-file-properties
v (expand-file-name ,target (tramp-file-local-name default-directory))))
v (tramp-drop-volume-letter
(expand-file-name
,target (tramp-file-local-name default-directory)))))
;; If TARGET is still remote, quote it.
(if (tramp-tramp-file-p ,target)

View file

@ -6878,34 +6878,40 @@ INPUT, if non-nil, is a string sent to the process."
(should-not (file-locked-p tmp-name1))
;; `kill-buffer' removes the lock.
(lock-file tmp-name1)
(should (eq (file-locked-p tmp-name1) t))
(with-temp-buffer
(set-visited-file-name tmp-name1)
(insert "foo")
(should (buffer-modified-p))
(cl-letf (((symbol-function #'read-from-minibuffer)
(lambda (&rest _args) "yes")))
(kill-buffer)))
(should-not (file-locked-p tmp-name1))
;; `kill-buffer--possibly-save' exists since Emacs 29.1.
(when (fboundp 'kill-buffer--possibly-save)
(lock-file tmp-name1)
(should (eq (file-locked-p tmp-name1) t))
(with-temp-buffer
(set-visited-file-name tmp-name1)
(insert "foo")
(should (buffer-modified-p))
;; Modifying `read-from-minibuffer' doesn't work on MS Windows.
(cl-letf (((symbol-function #'kill-buffer--possibly-save)
#'always))
(kill-buffer)))
(should-not (file-locked-p tmp-name1)))
;; `kill-buffer' should not remove the lock when the
;; connection is broken. See Bug#61663.
(lock-file tmp-name1)
(should (eq (file-locked-p tmp-name1) t))
(with-temp-buffer
(set-visited-file-name tmp-name1)
(insert "foo")
(should (buffer-modified-p))
(tramp-cleanup-connection
tramp-test-vec 'keep-debug 'keep-password)
(cl-letf (((symbol-function #'read-from-minibuffer)
(lambda (&rest _args) "yes")))
(kill-buffer)))
;; A new connection changes process id, and also the
;; lock file contents. But it still exists.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
(should (stringp (file-locked-p tmp-name1)))
;; `kill-buffer--possibly-save' exists since Emacs 29.1.
(when (fboundp 'kill-buffer--possibly-save)
(lock-file tmp-name1)
(should (eq (file-locked-p tmp-name1) t))
(with-temp-buffer
(set-visited-file-name tmp-name1)
(insert "foo")
(should (buffer-modified-p))
(tramp-cleanup-connection
tramp-test-vec 'keep-debug 'keep-password)
;; Modifying `read-from-minibuffer' doesn't work on MS Windows.
(cl-letf (((symbol-function #'kill-buffer--possibly-save)
#'always))
(kill-buffer)))
;; A new connection changes process id, and also the
;; lock file contents. But it still exists.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
(should (stringp (file-locked-p tmp-name1))))
;; When `remote-file-name-inhibit-locks' is set, nothing happens.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
@ -6928,34 +6934,41 @@ INPUT, if non-nil, is a string sent to the process."
;; Steal the file lock.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
(cl-letf (((symbol-function #'read-char) (lambda (&rest _args) ?s)))
;; Modifying `read-char' doesn't work on MS Windows.
(cl-letf (((symbol-function #'ask-user-about-lock) #'always))
(lock-file tmp-name1))
(should (eq (file-locked-p tmp-name1) t))
;; Ignore the file lock.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
(cl-letf (((symbol-function #'read-char) (lambda (&rest _args) ?p)))
;; Modifying `read-char' doesn't work on MS Windows.
(cl-letf (((symbol-function #'ask-user-about-lock) #'ignore))
(lock-file tmp-name1))
(should (stringp (file-locked-p tmp-name1)))
;; Quit the file lock machinery.
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
(cl-letf (((symbol-function #'read-char) (lambda (&rest _args) ?q)))
(should-error
(lock-file tmp-name1)
:type 'file-locked)
;; The same for `write-region'.
(should-error
(write-region "foo" nil tmp-name1)
:type 'file-locked)
(should-error
(write-region "foo" nil tmp-name1 nil nil tmp-name1)
:type 'file-locked)
;; The same for `set-visited-file-name'.
(with-temp-buffer
(should-error
(set-visited-file-name tmp-name1)
:type 'file-locked)))
;; Quit the file lock machinery. There are problems with
;; "sftp" and "podman", so we test on Emacs 29.1 only.
(when (tramp--test-emacs29-p )
(tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password)
;; Modifying `read-char' doesn't work on MS Windows.
(cl-letf (((symbol-function #'ask-user-about-lock)
(lambda (&rest args)
(signal 'file-locked args))))
(should-error
(lock-file tmp-name1)
:type 'file-locked)
;; The same for `write-region'.
(should-error
(write-region "foo" nil tmp-name1)
:type 'file-locked)
(should-error
(write-region "foo" nil tmp-name1 nil nil tmp-name1)
:type 'file-locked)
;; The same for `set-visited-file-name'.
(with-temp-buffer
(should-error
(set-visited-file-name tmp-name1)
:type 'file-locked))))
(should (stringp (file-locked-p tmp-name1))))
;; Cleanup.
@ -7647,7 +7660,7 @@ This requires restrictions of file name syntax."
;; to U+1FFFF).
"🌈🍒👋")
(when (tramp--test-expensive-test-p)
(when (and (tramp--test-expensive-test-p) (not (tramp--test-windows-nt-p)))
(delete-dups
(mapcar
;; Use all available language specific snippets.