Package: emacs;
Reported by: кппкяып япвквкп <wurfkreuz <at> mail.ru>
Date: Tue, 16 Apr 2024 15:49:06 UTC
Severity: normal
Tags: patch
Done: Michael Albinus <michael.albinus <at> gmx.de>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 70421 in the body.
You can then email your comments to 70421 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org
:bug#70421
; Package emacs
.
(Tue, 16 Apr 2024 15:49:07 GMT) Full text and rfc822 format available.кппкяып япвквкп <wurfkreuz <at> mail.ru>
:bug-gnu-emacs <at> gnu.org
.
(Tue, 16 Apr 2024 15:49:07 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: кппкяып япвквкп <wurfkreuz <at> mail.ru> To: bug-gnu-emacs <at> gnu.org Subject: eshell/sudo with delete-by-moving-to-trash Date: Tue, 16 Apr 2024 13:56:31 +0300
[Message part 1 (text/plain, inline)]
In GNU Emacs 30.0.50 on Arch Linux, I encountered a permission issue when trying to delete a file with elevated privileges using `eshell/rm` in combination with `delete-by-moving-to-trash` enabled. This suggests that the deletion process is not fully "TRAMP aware." Steps to reproduce: 1. emacs -Q 2. ~ $ (setq delete-by-moving-to-trash t) t 3. ~ $ (require 'em-tramp) em-tramp 4. ~ $ eshell/sudo touch /etc/bugtestfile 5. ~ $ eshell/sudo rm /etc/bugtestfile Cannot move /etc/bugtestfile to trash: Permission denied Expected behavior: I expect emacs to handle this situation by using /root/.local/share/Trash instead of /home/username/.local/share/Trash. This is the backtrace: Debugger entered--Lisp error: (error "Cannot move /etc/bugtestfile to trash: Permission denied") error("Cannot move %s to trash: Permission denied" "/etc/bugtestfile") move-file-to-trash("/etc/bugtestfile") delete-file("/etc/bugtestfile" t) apply(delete-file ("/etc/bugtestfile" t)) eshell-exec-lisp(eshell-printn eshell-errorn delete-file ("/etc/bugtestfile" t) nil) eshell-remove-entries(("/etc/bugtestfile") t) eshell/rm("/etc/bugtestfile") apply(eshell/rm "/etc/bugtestfile") eshell-exec-lisp(eshell-print eshell-error eshell/rm ("/etc/bugtestfile") nil) eshell-lisp-command(eshell/rm ("/etc/bugtestfile")) eshell-plain-command("rm" ("/etc/bugtestfile")) eshell-named-command("rm" ("/etc/bugtestfile")) eval((eshell-named-command '"rm" '("/etc/bugtestfile"))) eshell-do-eval((eshell-named-command '"rm" '("/etc/bugtestfile")) nil) #f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)() funcall(#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)) (let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>))) eval((let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)))) eshell-do-eval((let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (eshell-named-command '"rm" '("/etc/bugtestfile"))) nil) eshell-do-eval((let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (eshell-named-command '"rm" '("/etc/bugtestfile"))) nil) eshell-do-eval((unwind-protect (let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (eshell-named-command '"rm" '("/etc/bugtestfile"))) (mapc #'funcall eshell-this-command-hook)) nil) #f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)() funcall(#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)) (let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>))) eval((let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)))) eshell-do-eval((let ((eshell-this-command-hook '(ignore))) (unwind-protect (let ((default-directory '"/sudo:root <at> archlinux:/home/wurfkreuz/")) (eshell-named-command '"rm" '("/etc/bugtestfile"))) (mapc #'funcall eshell-this-command-hook))) nil) (condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '(ignore))) (unwind-protect (let ((default-directory ...)) (eshell-named-command '"rm" '...)) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (let (...) (eshell-named-command ... ...)) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))) eshell-do-eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (let (...) (eshell-named-command ... ...)) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) nil) eshell-do-eval((condition-case err (eshell-do-eval '(let ((eshell-this-command-hook '...)) (unwind-protect (let (...) (eshell-named-command ... ...)) (mapc #'funcall eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) nil) #f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)() funcall(#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)) (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)])) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>))) eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)))) eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (condition-case err (eshell-do-eval '(let ((eshell-this-command-hook ...)) (unwind-protect (let ... ...) (mapc ... eshell-this-command-hook))) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))) nil) eshell-do-eval((progn (let ((eshell-current-handles '[nil (... t) (... t)])) (condition-case err (eshell-do-eval '(let (...) (unwind-protect ... ...)) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))) nil) eshell-do-eval((unwind-protect (progn (let ((eshell-current-handles '[nil ... ...])) (condition-case err (eshell-do-eval '(let ... ...) nil) ((debug error) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))) (run-hooks 'eshell-post-command-hook)) nil) eshell-do-eval((progn 'nil (unwind-protect (progn (let ((eshell-current-handles '...)) (condition-case err (eshell-do-eval '... nil) ((debug error) (eshell-errorn ...) (eshell-close-handles 1))))) (run-hooks 'eshell-post-command-hook))) nil) #f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)() funcall(#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)) (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>))) eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode -0x165b8ffb2c8bf0d6>)))) eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let ((eshell-current-handles ...)) (condition-case err (eshell-do-eval ... nil) (... ... ...)))) (run-hooks 'eshell-post-command-hook))))) eshell-resume-eval((nil (let ((eshell-current-handles '[nil (... t) (... t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let (...) (condition-case err ... ...))) (run-hooks 'eshell-post-command-hook)))) nil)) eshell-eval-command((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (unwind-protect (progn (let ((eshell-current-handles ...)) (condition-case err (eshell-do-eval ... nil) (... ... ...)))) (run-hooks 'eshell-post-command-hook)))) "eshell/sudo rm /etc/bugtestfile") eshell-send-input(nil) funcall-interactively(eshell-send-input nil) command-execute(eshell-send-input) recursive-edit() debug(error (void-variable delete-by-moving-to) :backtrace-base eval-expression--debug) eval-expression--debug((void-variable delete-by-moving-to)) eval(delete-by-moving-to nil) elisp--eval-last-sexp(nil) #f(compiled-function () #<bytecode 0xa85ef2ba986a>)() eval-last-sexp(nil) funcall-interactively(eval-last-sexp nil) command-execute(eval-last-sexp) In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.41, cairo version 1.18.0) of 2024-04-14 built on archlinux Repository revision: 7add47337b62064998a5b80f357acc39b1253e98 Repository branch: master Windowing system distributor 'The X.Org Foundation', version 11.0.12302006 System Description: Arch Linux Configured using: 'configure --with-native-compilation=aot --with-tree-sitter --with-gif --with-png --with-jpeg --with-rsvg --with-tiff --with-imagemagick --with-x-toolkit=gtk3 --with-xwidgets CPPFLAGS=-I/opt/homebrew/opt/jpeg/include LDFLAGS=-L/opt/homebrew/opt/jpeg/lib' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ IMAGEMAGICK JPEG LCMS2 LIBOTF LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2 XPM XWIDGETS GTK3 ZLIB Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Outline Minor modes in effect: goto-address-mode: t bug-reference-mode: t eshell-syntax-highlighting-global-mode: t global-flycheck-mode: t flycheck-mode: t popper-echo-mode: t popper-mode: t all-the-icons-ivy-rich-mode: t ivy-rich-mode: t ivy-posframe-mode: t counsel-mode: t ivy-mode: t override-global-mode: t projectile-mode: t windmove-mode: t global-treesit-auto-mode: t corfu-history-mode: t corfu-echo-mode: t global-corfu-mode: t corfu-mode: t yas-global-mode: t yas-minor-mode: t tracking-mode: t dired-async-mode: t general-override-mode: t global-evil-collection-unimpaired-mode: t evil-collection-unimpaired-mode: t evil-commentary-mode: t global-evil-surround-mode: t evil-surround-mode: t evil-mode: t evil-local-mode: t global-undo-tree-mode: t undo-tree-mode: t global-auto-revert-mode: t pixel-scroll-precision-mode: t save-place-mode: t savehist-mode: t electric-pair-mode: t global-display-line-numbers-mode: t display-line-numbers-mode: t straight-use-package-mode: t straight-package-neutering-mode: t tooltip-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tab-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t minibuffer-regexp-mode: t buffer-read-only: t line-number-mode: t auto-fill-function: #[128 \304\300\301%3#\207 [yas--auto-fill do-auto-fill :around nil apply] 5 advice] transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t view-mode: t Features: (shadow mail-extr emacsbug goto-addr bug-reference lsp-zig lsp-yang lsp-yaml lsp-xml lsp-wgsl lsp-volar lsp-vimscript lsp-vhdl lsp-vetur lsp-html lsp-verilog lsp-vala lsp-v lsp-typeprof lsp-ttcn3 lsp-trunk lsp-toml lsp-tilt lsp-tex lsp-terraform lsp-svelte lsp-steep lsp-sqls lsp-sorbet lsp-solidity lsp-solargraph lsp-semgrep lsp-rust lsp-ruff-lsp lsp-ruby-syntax-tree lsp-ruby-lsp lsp-rubocop lsp-rf lsp-remark lsp-racket lsp-r lsp-qml lsp-pylsp lsp-pyls lsp-pwsh lsp-purescript lsp-pls lsp-php lsp-perlnavigator lsp-perl lsp-openscad lsp-ocaml lsp-nushell lsp-nix lsp-nim lsp-nginx lsp-move lsp-mojo lsp-mint lsp-mdx lsp-marksman lsp-markdown lsp-magik lsp-lua lsp-lisp lsp-kotlin lsp-json lsp-jq lsp-javascript lsp-idris lsp-haxe lsp-hack lsp-groovy lsp-graphql lsp-golangci-lint lsp-glsl lsp-gleam lsp-gdscript lsp-fsharp lsp-fortran lsp-eslint lsp-erlang lsp-emmet lsp-elm lsp-elixir lsp-dockerfile lsp-dhall lsp-d lsp-cypher lsp-cucumber lsp-css lsp-csharp lsp-crystal lsp-credo lsp-cobol lsp-cmake lsp-clojure lsp-clangd lsp-bufls lsp-go lsp-completion lsp-beancount lsp-bash lsp-awk lsp-autotools lsp-astro lsp-asm lsp-ansible lsp-angular lsp-ada lsp-semantic-tokens lsp-actionscript lsp-mode lsp-protocol tree-widget network-stream markdown-mode ht rfc2104 tramp-cmds tramp-cache time-stamp mule-util pcmpl-unix cursor-sensor cc-awk cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine sql vc-git image-file image-converter org-indent toc-org oc-basic ol-eww ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect ol-docview doc-view jka-compr image-mode exif ol-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi em-unix em-term em-script em-pred em-ls em-hist em-glob em-extpipe em-cmpl em-dirs em-basic em-banner evil-collection-eshell eshell eshell-syntax-highlighting em-prompt em-alias esh-mode esh-var cus-start toc-org-autoloads org-bullets org-bullets-autoloads org-tempo tempo org-drill persist org-agenda org-drill-autoloads persist-autoloads org-download org-attach org-download-autoloads lsp-mode-autoloads eldoc-autoloads markdown-mode-autoloads ht-autoloads flycheck flycheck-autoloads ansible ansible-autoloads haskell-mode haskell-cabal haskell-utils haskell-font-lock haskell-indentation haskell-string haskell-sort-imports haskell-lexeme haskell-align-imports haskell-complete-module haskell-ghc-support flymake-proc flymake dabbrev haskell-customize haskell-mode-autoloads dockerfile-mode dockerfile-mode-autoloads terraform-mode hcl-mode terraform-mode-autoloads hcl-mode-autoloads lua-mode lua-mode-autoloads go-mode find-file ffap go-mode-autoloads raku-mode raku-repl raku-imenu raku-indent raku-font-lock raku-detect raku-mode-autoloads popper-echo popper popper-autoloads vertico-posframe vertico-multiform vertico vertico-posframe-autoloads vertico-autoloads transpose-frame transpose-frame-autoloads evil-terminal-cursor-changer evil-terminal-cursor-changer-autoloads em-tramp esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util eshell-syntax-highlighting-autoloads hydra lv hydra-autoloads lv-autoloads helpful cc-langs cc-vars cc-defs trace cl-print edebug info-look f help-fns radix-tree elisp-refs s dash helpful-autoloads elisp-refs-autoloads f-autoloads s-autoloads dash-autoloads fzf fzf-autoloads all-the-icons-ivy-rich ivy-rich ivy-posframe posframe counsel swiper ivy delsel ivy-faces ivy-overlay colir all-the-icons-ivy-rich-autoloads ivy-rich-autoloads ivy-posframe-autoloads posframe-autoloads counsel-autoloads swiper-autoloads ivy-autoloads embark-autoloads use-package-bind-key bind-key mentor url-scgi mentor-rpc mentor-files mentor-data xml-rpc url-http url-auth url-gw nsm evil-collection-term term disp-table ehelp mentor-autoloads url-scgi-autoloads xml-rpc-autoloads projectile projectile-autoloads cider-autoloads cider cider-debug cider-browse-ns cider-mode cider-xref-backend cider-find cider-inspector cider-completion cider-profile cider-eval cider-jar arc-mode archive-mode cider-repl-history cider-repl cider-resolve cider-test cider-overlays cider-stacktrace cider-doc cider-browse-spec cider-clojuredocs cider-eldoc cider-docstring cider-client cider-common cider-completion-context cider-connection cider-popup sesman-browser nrepl-client cider-util sesman nrepl-dict spinner clojure-mode align parseedn parseclj-parser parseclj-lex parseclj-alist sesman-autoloads spinner-autoloads parseedn-autoloads map-autoloads parseclj-autoloads clojure-mode-autoloads zoxide-autoloads hyperbole hinit hui hui-mouse hmouse-key imenu hsys-flymake hui-menu hyrolo-menu hui-jmenu hibtypes hib-doc-id hyrolo sort klink hmouse-tag hsys-xref hib-kbd hui-mini hib-debbugs hsys-www eww url-queue mm-url hib-social hypb-ert ert ewoc debug backtrace hactypes hsys-org man hargs etags fileloop xref project hpath bookmark hmouse-sh hsettings hui-em-but hbut hmouse-drv hui-window pulse color hycontrol windmove view hui-select hbdata hgnus gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime smime dig gnus-sum shr pixel-fill kinsoku url-file svg dom gnus-group gnus-undo gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win gnus nnheader range hsmail message sendmail yank-media rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils mailheader hmail htz cal-julian hbmap hmoccur hvar hypb package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf mailcap url-handlers locate hversion hload-path kotl-autoloads hyperbole-autoloads hact set hhist paredit paredit-autoloads sudo-edit sudo-edit-autoloads clojure-ts-mode lisp-mnt clojure-ts-mode-autoloads treesit-auto treesit-auto-autoloads exec-path-from-shell exec-path-from-shell-autoloads cape cape-autoloads corfu-history corfu-echo corfu corfu-autoloads orderless orderless-autoloads yasnippet yasnippet-autoloads circe diff-mode track-changes lui-irc-colors irc gnutls puny lcs lui-logging url-util url-parse url-vars lui-format lui tracking shorten flyspell ispell circe-compat circe-autoloads xterm-color xterm-color-autoloads rg vc vc-dispatcher rg-info-hack rg-menu rg-ibuffer rg-result wgrep-rg wgrep rg-history rg-header ibuf-ext evil-collection-ibuffer ibuffer ibuffer-loaddefs grep compile text-property-search cus-edit pp cus-load wid-edit rg-autoloads wgrep-autoloads transient compat transient-autoloads compat-autoloads seq-autoloads dired-async easy-mmode dired-aux async async-autoloads avy avy-autoloads general general-autoloads all-the-icons-dired evil-collection-dired dired dired-loaddefs all-the-icons-dired-autoloads all-the-icons all-the-icons-faces data-material data-weathericons data-octicons data-fileicons data-faicons data-alltheicons all-the-icons-autoloads use-package-ensure rose-pine-theme evil-collection-unimpaired evil-collection-minibuffer evil-collection-org evil-collection annalist evil-collection-autoloads annalist-autoloads evil-org-agenda evil-org org-element org-persist org-id org-refile org-element-ast inline avl-tree generator evil-org-autoloads evil-commentary evil-commentary-integration evil-commentary-autoloads evil-surround evil-surround-autoloads pcase evil evil-integration evil-maps evil-commands reveal evil-jumps evil-command-window evil-types evil-search evil-ex evil-macros evil-repeat evil-states evil-core advice evil-common thingatpt rect evil-vars edmacro kmacro evil-autoloads goto-chg-autoloads undo-tree diff queue undo-tree-autoloads queue-autoloads finder-inf use-package-core diary-lib diary-loaddefs midnight autorevert filenotify pixel-scroll cua-base saveplace tramp-sh tramp trampver tramp-integration files-x tramp-message tramp-compat xdg shell parse-time iso8601 auth-source eieio eieio-core password-cache json map byte-opt tramp-loaddefs desktop frameset savehist comp comp-cstr warnings comp-run comp-common elec-pair display-line-numbers org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src sh-script smie treesit executable ob-comint org-pcomplete pcomplete comint ansi-osc ansi-color ring org-list org-footnote org-faces org-entities time-date noutline outline icons ob-emacs-lisp ob-core ob-eval org-cycle org-table ol rx org-fold org-fold-core org-keys oc org-loaddefs find-func cal-menu calendar cal-loaddefs org-version org-compat org-macs format-spec use-package-autoloads info bind-key-autoloads straight-autoloads cl-seq cl-extra help-mode straight subr-x cl-macs gv cl-loaddefs cl-lib bytecomp byte-compile rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads xwidget-internal dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar make-network-process native-compile emacs) Memory information: ((conses 16 1164379 714909) (symbols 48 71175 188) (strings 32 271480 36908) (string-bytes 1 9978327) (vectors 16 129996) (vector-slots 8 2968386 200544) (floats 8 1627 7929) (intervals 56 31825 4335) (buffers 992 54))
[Message part 2 (text/html, inline)]
bug-gnu-emacs <at> gnu.org
:bug#70421
; Package emacs
.
(Wed, 17 Apr 2024 08:30:05 GMT) Full text and rfc822 format available.Message #8 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Michael Albinus <michael.albinus <at> gmx.de> To: кппкяып япвквкп via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org> Cc: кппкяып япвквкп <wurfkreuz <at> mail.ru>, 70421 <at> debbugs.gnu.org Subject: Re: bug#70421: eshell/sudo with delete-by-moving-to-trash Date: Wed, 17 Apr 2024 10:28:56 +0200
[Message part 1 (text/plain, inline)]
кппкяып япвквкп via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org> writes: Hi, > In GNU Emacs 30.0.50 on Arch Linux, I encountered a permission issue > when trying to delete a file with elevated privileges using `eshell/rm` > in combination with `delete-by-moving-to-trash` enabled. This suggests > that the deletion process is not fully "TRAMP aware." > > Steps to reproduce: > > 1. emacs -Q > 2. ~ $ (setq delete-by-moving-to-trash t) > t > 3. ~ $ (require 'em-tramp) > em-tramp > 4. ~ $ eshell/sudo touch /etc/bugtestfile > 5. ~ $ eshell/sudo rm /etc/bugtestfile > Cannot move /etc/bugtestfile to trash: Permission denied > > > Expected behavior: > > I expect emacs to handle this situation by using > /root/.local/share/Trash > instead of /home/username/.local/share/Trash. No. Without special preparation, remote files are moved to the local trash directory, /home/username/.local/share/Trash this case. See the Tramp manual (info "(tramp) Frequently Asked Questions") --8<---------------cut here---------------start------------->8--- • Where are remote files trashed to? Emacs can trash file instead of deleting them, *note Trashing: (emacs)Misc File Ops. Remote files are always trashed to the local trash, except the user option ‘remote-file-name-inhibit-delete-by-moving-to-trash’ is non-‘nil’, or it is a remote encrypted file (*note Keeping files encrypted::), which are deleted anyway. --8<---------------cut here---------------end--------------->8--- However, we could try to configure it. There is the variable trash-directory, which is nil by default. We cannot give it another (remote) directory name, because it would be used always. Instead, we use connection-local variables. In your case, I recommend to set --8<---------------cut here---------------start------------->8--- (connection-local-set-profile-variables 'remote-trash-directory '((trash-directory . "/sudo::~/.local/share/Trash"))) (connection-local-set-profiles `(:application tramp :protocol "sudo" :machine ,system-name) 'remote-trash-directory) --8<---------------cut here---------------end--------------->8--- Now we must teach Emacs, that trash-directory should respect connection-local values. The following patch of files.el does this for us:
[Message part 2 (text/x-patch, inline)]
diff --git a/lisp/files.el b/lisp/files.el index 1e11dd44bad..447661dba5b 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -8812,9 +8812,10 @@ move-file-to-trash ;; If `system-move-file-to-trash' is defined, use it. (cond ((fboundp 'system-move-file-to-trash) (system-move-file-to-trash filename)) - (trash-directory + ((connection-local-value trash-directory) ;; If `trash-directory' is non-nil, move the file there. - (let* ((trash-dir (expand-file-name trash-directory)) + (let* ((trash-dir (expand-file-name + (connection-local-value trash-directory))) (fn (directory-file-name (expand-file-name filename))) (new-fn (concat (file-name-as-directory trash-dir) (file-name-nondirectory fn))))
[Message part 3 (text/plain, inline)]
Could you, please, check whether it works for you? Best regards, Michael.
bug-gnu-emacs <at> gnu.org
:bug#70421
; Package emacs
.
(Wed, 17 Apr 2024 08:30:07 GMT) Full text and rfc822 format available.Michael Albinus <michael.albinus <at> gmx.de>
to control <at> debbugs.gnu.org
.
(Wed, 17 Apr 2024 08:30:07 GMT) Full text and rfc822 format available.Michael Albinus <michael.albinus <at> gmx.de>
:кппкяып япвквкп <wurfkreuz <at> mail.ru>
:Message #18 received at 70421-done <at> debbugs.gnu.org (full text, mbox):
From: Michael Albinus <michael.albinus <at> gmx.de> To: кппкяып япвквкп <wurfkreuz <at> mail.ru> Cc: 70421-done <at> debbugs.gnu.org Subject: Re: bug#70421: eshell/sudo with delete-by-moving-to-trash Date: Tue, 23 Apr 2024 14:01:33 +0200
Version 30.1 кппкяып япвквкп <wurfkreuz <at> mail.ru> writes: > Yes, i recompiled correctly and now it works: > ‘Renaming /sudo:root <at> archlinux:/testnew to > /sudo:root <at> archlinux:/root/.local/share/Trash/testnew...done’ Thanks for the feedback. I've pushed the fix to the repositories, closing the bug. > Alex H Best regards, Michael.
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Wed, 22 May 2024 11:24:09 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.