From: Jim Porter <jporterbugs@gmail.com>
To: Alfonso Sanchez-Beato <alfonsosanchezbeato@yahoo.es>,
Stefan Kangas <stefankangas@gmail.com>
Cc: "68074@debbugs.gnu.org" <68074@debbugs.gnu.org>
Subject: bug#68074: eshell sudo/doas does not work for aliases
Date: Fri, 26 Jan 2024 16:27:44 -0800 [thread overview]
Message-ID: <68241238-add1-af83-9b7c-904732e7bca6@gmail.com> (raw)
In-Reply-To: <713218597.2366797.1706313180478@mail.yahoo.com>
[-- Attachment #1: Type: text/plain, Size: 300 bytes --]
On 1/26/2024 3:53 PM, Alfonso Sanchez-Beato via Bug reports for GNU
Emacs, the Swiss army knife of text editors wrote:
> Unfortunately that does not seem to be the case, I see an error saying "Invalid function" after applying on top of current master:
Oops, I messed up the quoting. How about this?
[-- Attachment #2: 0001-Fix-command-replacement-with-the-Eshell-builtin-vers.patch --]
[-- Type: text/plain, Size: 8528 bytes --]
From c82f0d3dda8ab666438ec7192b0b1ee1dbba4613 Mon Sep 17 00:00:00 2001
From: Jim Porter <jporterbugs@gmail.com>
Date: Wed, 24 Jan 2024 18:32:00 -0800
Subject: [PATCH] Fix command replacement with the Eshell builtin versions of
"sudo" and "doas"
This is particularly important when the inner command to execute is an
alias. Aliases throw 'eshell-replace-command' too, so we want to do
this in two phases: first, replace the "sudo"/"doas" with a
let-binding of 'default-directory', and then later, let the alias code
do its own replacement (bug#68074).
* lisp/eshell/em-tramp.el (eshell/sudo, eshell/doas): Use
'eshell-replace-command' to wrap the inner command.
* test/lisp/eshell/em-tramp-tests.el (mock-eshell-named-command):
Remove.
(em-tramp-test/sudo-basic, em-tramp-test/sudo-user)
(em-tramp-test/doas-basic, em-tramp-test/doas-user): Catch
'eshell-replace-command'.
---
lisp/eshell/em-tramp.el | 22 ++++----
test/lisp/eshell/em-tramp-tests.el | 89 ++++++++++++++----------------
2 files changed, 50 insertions(+), 61 deletions(-)
diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el
index 90f9c6cf78d..9812c9e762a 100644
--- a/lisp/eshell/em-tramp.el
+++ b/lisp/eshell/em-tramp.el
@@ -121,12 +121,11 @@ eshell/sudo
:usage "[(-u | --user) USER] (-s | --shell) | COMMAND
Execute a COMMAND as the superuser or another USER.")
(let ((dir (eshell--method-wrap-directory default-directory "sudo" user)))
- (if shell
- (throw 'eshell-replace-command
- (eshell-parse-command "cd" (list dir)))
- (throw 'eshell-external
- (let ((default-directory dir))
- (eshell-named-command (car args) (cdr args))))))))
+ (throw 'eshell-replace-command
+ (if shell
+ (eshell-parse-command "cd" (list dir))
+ `(let ((default-directory ,dir))
+ (eshell-named-command ',(car args) ',(cdr args))))))))
(put 'eshell/sudo 'eshell-no-numeric-conversions t)
@@ -144,12 +143,11 @@ eshell/doas
:usage "[(-u | --user) USER] (-s | --shell) | COMMAND
Execute a COMMAND as the superuser or another USER.")
(let ((dir (eshell--method-wrap-directory default-directory "doas" user)))
- (if shell
- (throw 'eshell-replace-command
- (eshell-parse-command "cd" (list dir)))
- (throw 'eshell-external
- (let ((default-directory dir))
- (eshell-named-command (car args) (cdr args))))))))
+ (throw 'eshell-replace-command
+ (if shell
+ (eshell-parse-command "cd" (list dir))
+ `(let ((default-directory ,dir))
+ (eshell-named-command ,(car args) ,(cdr args))))))))
(put 'eshell/doas 'eshell-no-numeric-conversions t)
diff --git a/test/lisp/eshell/em-tramp-tests.el b/test/lisp/eshell/em-tramp-tests.el
index d33f6a2b46a..deae6579401 100644
--- a/test/lisp/eshell/em-tramp-tests.el
+++ b/test/lisp/eshell/em-tramp-tests.el
@@ -59,35 +59,31 @@ em-tramp-test/su-login
"cd"
(list ,(format "/su:root@%s:~/" tramp-default-host))))))
-(defun mock-eshell-named-command (&rest args)
- "Dummy function to test Eshell `sudo' command rewriting."
- (list default-directory args))
-
(ert-deftest em-tramp-test/sudo-basic ()
"Test Eshell `sudo' command with default user."
- (cl-letf (((symbol-function 'eshell-named-command)
- #'mock-eshell-named-command))
- (should (equal
- (catch 'eshell-external (eshell/sudo "echo" "hi"))
- `(,(format "/sudo:root@%s:%s" tramp-default-host default-directory)
- ("echo" ("hi")))))
- (should (equal
- (catch 'eshell-external (eshell/sudo "echo" "-u" "hi"))
- `(,(format "/sudo:root@%s:%s" tramp-default-host default-directory)
- ("echo" ("-u" "hi")))))))
+ (let ((sudo-directory (format "/sudo:root@%s:%s"
+ tramp-default-host default-directory)))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/sudo "echo" "hi"))
+ `(let ((default-directory ,sudo-directory))
+ (eshell-named-command "echo" ("hi")))))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/sudo "echo" "-u" "hi"))
+ `(let ((default-directory ,sudo-directory))
+ (eshell-named-command "echo" ("-u" "hi")))))))
(ert-deftest em-tramp-test/sudo-user ()
"Test Eshell `sudo' command with specified user."
- (cl-letf (((symbol-function 'eshell-named-command)
- #'mock-eshell-named-command))
- (should (equal
- (catch 'eshell-external (eshell/sudo "-u" "USER" "echo" "hi"))
- `(,(format "/sudo:USER@%s:%s" tramp-default-host default-directory)
- ("echo" ("hi")))))
- (should (equal
- (catch 'eshell-external (eshell/sudo "-u" "USER" "echo" "-u" "hi"))
- `(,(format "/sudo:USER@%s:%s" tramp-default-host default-directory)
- ("echo" ("-u" "hi")))))))
+ (let ((sudo-directory (format "/sudo:USER@%s:%s"
+ tramp-default-host default-directory)))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/sudo "-u" "USER" "echo" "hi"))
+ `(let ((default-directory ,sudo-directory))
+ (eshell-named-command "echo" ("hi")))))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/sudo "-u" "USER" "echo" "-u" "hi"))
+ `(let ((default-directory ,sudo-directory))
+ (eshell-named-command "echo" ("-u" "hi")))))))
(ert-deftest em-tramp-test/sudo-shell ()
"Test Eshell `sudo' command with -s/--shell option."
@@ -109,34 +105,29 @@ em-tramp-test/sudo-user-shell
(ert-deftest em-tramp-test/doas-basic ()
"Test Eshell `doas' command with default user."
- (cl-letf (((symbol-function 'eshell-named-command)
- #'mock-eshell-named-command))
- (should (equal
- (catch 'eshell-external (eshell/doas "echo" "hi"))
- `(,(format "/doas:root@%s:%s"
- tramp-default-host default-directory)
- ("echo" ("hi")))))
- (should (equal
- (catch 'eshell-external (eshell/doas "echo" "-u" "hi"))
- `(,(format "/doas:root@%s:%s"
- tramp-default-host default-directory)
- ("echo" ("-u" "hi")))))))
+ (let ((doas-directory (format "/doas:root@%s:%s"
+ tramp-default-host default-directory)))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/doas "echo" "hi"))
+ `(let ((default-directory ,doas-directory))
+ (eshell-named-command "echo" ("hi")))))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/doas "echo" "-u" "hi"))
+ `(let ((default-directory ,doas-directory))
+ (eshell-named-command "echo" ("-u" "hi")))))))
(ert-deftest em-tramp-test/doas-user ()
"Test Eshell `doas' command with specified user."
- (cl-letf (((symbol-function 'eshell-named-command)
- #'mock-eshell-named-command))
- (should (equal
- (catch 'eshell-external (eshell/doas "-u" "USER" "echo" "hi"))
- `(,(format "/doas:USER@%s:%s"
- tramp-default-host default-directory)
- ("echo" ("hi")))))
- (should (equal
- (catch 'eshell-external
- (eshell/doas "-u" "USER" "echo" "-u" "hi"))
- `(,(format "/doas:USER@%s:%s"
- tramp-default-host default-directory)
- ("echo" ("-u" "hi")))))))
+ (let ((doas-directory (format "/doas:USER@%s:%s"
+ tramp-default-host default-directory)))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/doas "-u" "USER" "echo" "hi"))
+ `(let ((default-directory ,doas-directory))
+ (eshell-named-command "echo" ("hi")))))
+ (should (equal (catch 'eshell-replace-command
+ (eshell/doas "-u" "USER" "echo" "-u" "hi"))
+ `(let ((default-directory ,doas-directory))
+ (eshell-named-command "echo" ("-u" "hi")))))))
(ert-deftest em-tramp-test/doas-shell ()
"Test Eshell `doas' command with -s/--shell option."
--
2.25.1
next prev parent reply other threads:[~2024-01-27 0:27 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <31356544.8861481.1703711546895.ref@mail.yahoo.com>
2023-12-27 21:12 ` bug#68074: eshell sudo/doas does not work for aliases Alfonso Sanchez-Beato via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-11 21:00 ` Stefan Kangas
2024-01-11 21:15 ` Jim Porter
2024-01-25 2:43 ` Jim Porter
2024-01-26 23:53 ` Alfonso Sanchez-Beato via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-27 0:27 ` Jim Porter [this message]
2024-01-27 1:19 ` Jim Porter
2024-01-27 8:46 ` Alfonso Sanchez-Beato via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-27 20:24 ` Jim Porter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=68241238-add1-af83-9b7c-904732e7bca6@gmail.com \
--to=jporterbugs@gmail.com \
--cc=68074@debbugs.gnu.org \
--cc=alfonsosanchezbeato@yahoo.es \
--cc=stefankangas@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).