unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Spencer Baugh <sbaugh@janestreet.com>
To: Michael Albinus <michael.albinus@gmx.de>
Cc: 63539@debbugs.gnu.org
Subject: bug#63539: 29.0.90; TRAMP fails to detect shell prompts containing ]
Date: Mon, 22 May 2023 15:45:44 -0400	[thread overview]
Message-ID: <ierlehg6tg7.fsf@janestreet.com> (raw)
In-Reply-To: <87mt1wdvlk.fsf@gmx.de> (Michael Albinus's message of "Mon, 22 May 2023 21:17:27 +0200")

Michael Albinus <michael.albinus@gmx.de> writes:

> Spencer Baugh <sbaugh@janestreet.com> writes:
>
> Hi Spencer,
>
>> Hmm, this change doesn't seem to fix my issue.  In fact, this change
>> introduces a regression for me: I'm no longer able to use TRAMP ssh on
>> my other machines which have color codes at the end of their prompt,
>> which did work out of the box on Emacs 29!
>>
>> I'm guessing the reason is because this version of the regexp doesn't
>> support multiple escape codes, or blanks in between/at the end of the
>> escape codes?
>
> Blanks as parts of escape codes are unlikely.

In the middle, perhaps, but after the escape codes seems quite likely to
me.  At the very least, my prompt (which worked on Emacs 29 and no
longer works with your change) has blanks after the escape codes.

For reference, my now-broken prompt is:
PS1='\[\033[01;32m\]\u@\[\e[${hostnamecolor}m\]\h\[\033[01;34m\] \w \$\[\033[00m\] '

> Multiple escape codes are not regarded indeed, my patch did expect that
> there is not more as one escape code at the end of the shell prompt.
>
> Your example is an indication of escape codes, mixed inside the shell
> prompt. My first attempt (removing all escape codes from the buffer
> region) did handle that. But as said, there were other regressions with
> that attemot.

What's wrong with my diff, though?  It produces behavior which is much
closer to how TRAMP behaved before your change, while still fixing my
issue.

> Hmm. Could you please send me a tramp-verbose 10 trace of your failing test?

I'm not sure how useful this is, but:

  backtrace()
  tramp-error(nil quit "")
  tramp-signal-hook-function(quit nil)
  signal(quit nil)
  tramp-maybe-open-connection((tramp-file-name "ssh" "sbaugh" nil "test-host" nil "/home/sbaugh" nil))
  tramp-send-command((tramp-file-name "ssh" "sbaugh" nil "test-host" nil "/home/sbaugh" nil) "test -d /home/sbaugh 2>/dev/null; echo tramp_exit_...")
  tramp-send-command-and-check((tramp-file-name "ssh" "sbaugh" nil "test-host" nil "/home/sbaugh" nil) "test -d /home/sbaugh")
  tramp-run-test((tramp-file-name "ssh" "sbaugh" nil "test-host" nil "/home/sbaugh" nil) "-d" "/home/sbaugh")
  tramp-sh-handle-file-directory-p("/ssh:sbaugh@test-host:/home/sbaugh")
  apply(tramp-sh-handle-file-directory-p "/ssh:sbaugh@test-host:/home/sbaugh")
  tramp-sh-file-name-handler(file-directory-p "/ssh:sbaugh@test-host:/home/sbaugh")
  apply(tramp-sh-file-name-handler file-directory-p "/ssh:sbaugh@test-host:/home/sbaugh")
  tramp-file-name-handler(file-directory-p "/ssh:sbaugh@test-host:/home/sbaugh")
  file-directory-p("/ssh:sbaugh@test-host:/home/sbaugh/")
  tramp-handle-file-accessible-directory-p("/ssh:sbaugh@test-host:/home/sbaugh/")
  apply(tramp-handle-file-accessible-directory-p "/ssh:sbaugh@test-host:/home/sbaugh/")
  tramp-sh-file-name-handler(file-accessible-directory-p "/ssh:sbaugh@test-host:/home/sbaugh/")
  apply(tramp-sh-file-name-handler file-accessible-directory-p "/ssh:sbaugh@test-host:/home/sbaugh/")
  tramp-file-name-handler(file-accessible-directory-p "/ssh:sbaugh@test-host:/home/sbaugh/")
  file-accessible-directory-p("/ssh:sbaugh@test-host:/home/sbaugh/")
  cd("/ssh:sbaugh@test-host:")
  eshell/cd("/ssh:sbaugh@test-host:")
  apply(eshell/cd "/ssh:sbaugh@test-host:")
  eshell-exec-lisp(eshell-print eshell-error eshell/cd ("/ssh:sbaugh@test-host:") nil)
  eshell-lisp-command(eshell/cd ("/ssh:sbaugh@test-host:"))
  eshell-plain-command("cd" ("/ssh:sbaugh@test-host:"))
  eshell-named-command("cd" ("/ssh:sbaugh@test-host:"))
  eval((eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")))
  eshell-do-eval((eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")) nil)
  eshell-do-eval((prog1 (eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")) (mapc #'funcall eshell-this-command-hook)) nil)
  (condition-case err (eshell-do-eval '(prog1 (eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")) (mapc #'funcall eshell-this-command-hook)) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))
  eval((condition-case err (eshell-do-eval '(prog1 (eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")) (mapc #'funcall eshell-this-command-hook)) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))
  eshell-do-eval((condition-case err (eshell-do-eval '(prog1 (eshell-named-command '"cd" '("/ssh:sbaugh@test-host:")) (mapc #'funcall eshell-this-command-hook)) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))) nil)
  #f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)()
  funcall(#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))
  (let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)))
  eval((let ((eshell-this-command-hook '(ignore))) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))))
  eshell-do-eval((let ((eshell-this-command-hook '(ignore))) (condition-case err (eshell-do-eval '(prog1 (eshell-named-command '"cd" '...) (mapc #'funcall eshell-this-command-hook)) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))) nil)
  #f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)()
  funcall(#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))
  (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)])) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)))
  eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))))
  eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)])) (let ((eshell-this-command-hook '(ignore))) (condition-case err (eshell-do-eval '(prog1 (eshell-named-command ... ...) (mapc ... eshell-this-command-hook)) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1))))) nil)
  eshell-do-eval((progn (let ((eshell-current-handles '[nil (... t) (... t)])) (let ((eshell-this-command-hook '(ignore))) (condition-case err (eshell-do-eval '(prog1 ... ...) nil) ((debug error) (mapc #'funcall eshell-this-command-hook) (eshell-errorn (error-message-string err)) (eshell-close-handles 1)))))) nil)
  (catch 'top-level (eshell-do-eval '(progn (let ((eshell-current-handles '...)) (let ((eshell-this-command-hook ...)) (condition-case err (eshell-do-eval ... nil) (... ... ... ...))))) nil))
  eval((catch 'top-level (eshell-do-eval '(progn (let ((eshell-current-handles ...)) (let (...) (condition-case err ... ...)))) nil)))
  eshell-do-eval((catch 'top-level (eshell-do-eval '(progn (let ((eshell-current-handles ...)) (let (...) (condition-case err ... ...)))) nil)) nil)
  eshell-do-eval((progn 'nil (catch 'top-level (eshell-do-eval '(progn (let (...) (let ... ...))) nil)) (run-hooks 'eshell-post-command-hook)) nil)
  #f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)()
  funcall(#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))
  (let ((eshell-current-handles '[nil (((t) . 2) t) (((t) . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>)))
  eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) (eshell-current-subjob-p 'nil)) (funcall '#f(compiled-function () #<bytecode 0x1c62bf30a40bebd1>))))
  eshell-do-eval((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (catch 'top-level (eshell-do-eval '(progn (let ... ...)) nil)) (run-hooks 'eshell-post-command-hook))))
  eshell-resume-eval()
  eshell-eval-command((let ((eshell-current-handles '[nil ((... . 2) t) ((... . 2) t)]) eshell-current-subjob-p) (progn 'nil (catch 'top-level (eshell-do-eval '(progn (let ... ...)) nil)) (run-hooks 'eshell-post-command-hook))) "cd /ssh:sbaugh@test-host:")
  eshell-send-input(nil)
  funcall-interactively(eshell-send-input nil)
  call-interactively(eshell-send-input nil nil)
  command-execute(eshell-send-input)






  reply	other threads:[~2023-05-22 19:45 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-16 16:40 bug#63539: 29.0.90; TRAMP fails to detect shell prompts containing ] Spencer Baugh
2023-05-16 17:53 ` Michael Albinus
2023-05-16 19:28   ` Spencer Baugh
2023-05-16 20:06     ` Spencer Baugh
2023-05-17 14:07       ` Michael Albinus
2023-05-17 14:59         ` Spencer Baugh
2023-05-17 15:39           ` Michael Albinus
2023-05-17 16:56             ` Michael Albinus
2023-05-17 17:28               ` Michael Albinus
2023-05-17 18:08                 ` Spencer Baugh
2023-05-17 18:41                   ` Michael Albinus
2023-05-18 15:49                     ` Michael Albinus
2023-05-20 10:18                       ` Michael Albinus
2023-05-22 17:30                         ` Spencer Baugh
2023-05-22 19:17                           ` Michael Albinus
2023-05-22 19:45                             ` Spencer Baugh [this message]
2023-05-23 13:49                               ` Michael Albinus
2023-05-23 14:34                                 ` Spencer Baugh
2023-05-23 16:31                                   ` Michael Albinus
2023-05-25  7:36                                     ` Michael Albinus
2023-05-17 13:53     ` Michael Albinus
2023-05-17 14:04       ` Spencer Baugh
2023-05-17 14:12         ` Michael Albinus

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=ierlehg6tg7.fsf@janestreet.com \
    --to=sbaugh@janestreet.com \
    --cc=63539@debbugs.gnu.org \
    --cc=michael.albinus@gmx.de \
    /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).