From c8ea14e7825d536f41a230fc1298341a2462635e Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 13 Oct 2023 16:09:51 +0200 Subject: [PATCH] Handle quoted tilde in Tramp * lisp/net/tramp.el (tramp-handle-expand-file-name): * lisp/net/tramp-gvfs.el (tramp-gvfs-handle-expand-file-name): * lisp/net/tramp-sh.el (tramp-sh-handle-expand-file-name): * lisp/net/tramp-smb.el (tramp-smb-handle-expand-file-name): * lisp/net/tramp-sudoedit.el (tramp-sudoedit-handle-expand-file-name): Handle quoted tilde. (Bug#65685) * test/lisp/net/tramp-tests.el (tramp-test05-expand-file-name-tilde): New test. --- lisp/net/tramp-gvfs.el | 5 ++++- lisp/net/tramp-sh.el | 3 +++ lisp/net/tramp-smb.el | 3 +++ lisp/net/tramp-sudoedit.el | 3 +++ lisp/net/tramp.el | 3 +++ test/lisp/net/tramp-tests.el | 11 +++++++++++ 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index 46342042880..07390b50df2 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -1176,10 +1176,13 @@ file names." (tramp-run-real-handler #'expand-file-name (list name)) ;; Dissect NAME. (with-parsed-tramp-file-name name nil + ;; Tilde expansion shall be possible also for quoted localname. + (when (string-prefix-p "~" (file-name-unquote localname)) + (setq localname (file-name-unquote localname))) ;; If there is a default location, expand tilde. (when (string-match (tramp-compat-rx bos "~" (group (* (not "/"))) (group (* nonl)) eos) - localname) + localname) (let ((uname (match-string 1 localname)) (fname (match-string 2 localname)) hname) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 59d5c00515f..74b1638f120 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2831,6 +2831,9 @@ the result will be a local, non-Tramp, file name." (tramp-run-real-handler #'expand-file-name (list name))) (unless (tramp-run-real-handler #'file-name-absolute-p (list localname)) (setq localname (concat "~/" localname))) + ;; Tilde expansion shall be possible also for quoted localname. + (when (string-prefix-p "~" (file-name-unquote localname)) + (setq localname (file-name-unquote localname))) ;; Tilde expansion if necessary. This needs a shell which ;; groks tilde expansion! The function `tramp-find-shell' is ;; supposed to find such a shell on the remote host. Please diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el index 7249fa266ac..0ba24352a3d 100644 --- a/lisp/net/tramp-smb.el +++ b/lisp/net/tramp-smb.el @@ -731,6 +731,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." (tramp-run-real-handler #'expand-file-name (list name)) ;; Dissect NAME. (with-parsed-tramp-file-name name nil + ;; Tilde expansion shall be possible also for quoted localname. + (when (string-prefix-p "~" (file-name-unquote localname)) + (setq localname (file-name-unquote localname))) ;; Tilde expansion if necessary. (when (string-match (tramp-compat-rx bos "~" (group (* (not "/"))) (group (* nonl)) eos) diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el index d167bf13b14..9939d93ba35 100644 --- a/lisp/net/tramp-sudoedit.el +++ b/lisp/net/tramp-sudoedit.el @@ -380,6 +380,9 @@ the result will be a local, non-Tramp, file name." ;; but to the root home directory. (when (tramp-string-empty-or-nil-p localname) (setq localname "~")) + ;; Tilde expansion shall be possible also for quoted localname. + (when (string-prefix-p "~" (file-name-unquote localname)) + (setq localname (file-name-unquote localname))) (unless (file-name-absolute-p localname) (setq localname (format "~%s/%s" user localname))) (when (string-match diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 02051736cc5..d1b38cfeb93 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -3982,6 +3982,9 @@ Let-bind it when necessary.") (with-parsed-tramp-file-name name nil (unless (tramp-run-real-handler #'file-name-absolute-p (list localname)) (setq localname (concat "/" localname))) + ;; Tilde expansion shall be possible also for quoted localname. + (when (string-prefix-p "~" (file-name-unquote localname)) + (setq localname (file-name-unquote localname))) ;; Expand tilde. Usually, the methods applying this handler do ;; not support tilde expansion. But users could declare a ;; respective connection property. (Bug#53847) diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 0648fe9e80f..e74837b926a 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -2335,6 +2335,17 @@ Also see `ignore'." (should (string-equal (expand-file-name local dir) dir)) (should (string-equal (expand-file-name (concat dir local)) dir))))) +;; The following test is inspired by Bug#65685. +(ert-deftest tramp-test05-expand-file-name-tilde () + "Check `expand-file-name'." + (skip-unless (tramp--test-enabled)) + (skip-unless (not (tramp--test-ange-ftp-p))) + + (let ((dir (file-remote-p ert-remote-temporary-file-directory)) + (tramp-tolerate-tilde t)) + (should (string-equal (expand-file-name (concat dir "~")) + (expand-file-name (concat dir "/:~")))))) + (ert-deftest tramp-test06-directory-file-name () "Check `directory-file-name'. This checks also `file-name-as-directory', `file-name-directory', -- 2.39.2