Subject: Re: bug#70012: shell-resync-dirs broken on windows

From: Eli Zaretskii <[email-masked]>
Date: Fri, 29 Mar 2024 16:14:43 +0300

> From: Sam Steingold <[email-masked]>
> Date: Fri, 29 Mar 2024 08:17:26 -0400
> Cc: [email-masked]
> 
> On Thu, Mar 28, 2024, 02:59 Eli Zaretskii <[email-masked]> wrote:
> > > From: Sam Steingold <[email-masked]>
> > > which bash builds are supported on windows?
> >
> > Any native build of Bash would be supported.  Except that I'm not
> > aware of any such port of Bash, unfortunately.
> 
> I admire your sense of humor.

<Bows>

Btw, I do have a (very old) native build of Bash on my system, but I
don't use it as it is quite buggy, and cannot reliably run complicated
shell scripts.  IOW, it isn't like no one tried to produce a native
port, they just didn't do well enough...

> > Maybe the MSYS or Cygwin Bash can be told to output Windows-format
> > file names with drive letters?  I know that "pwd -W", for example,
> > shows the current directory in Windows format, so maybe there are
> > other similar tricks?
> 
> Please upvote https://github.com/msys2/MSYS2-packages/issues/4472

Done.

> finally, the following patch fixes the bug for me:
> 
> --- shell.el~ 2024-03-06 12:13:15.134281800 -0500
> +++ shell.el 2024-03-28 11:50:32.920026000 -0400
> @@ -711,6 +711,7 @@
>     ((string-equal shell "ksh") "echo $PWD ~-")
>     ;; Bypass any aliases.  TODO all shells could use this.
>     ((string-equal shell "bash") "command dirs")
> +   ((string-equal shell "bash.exe") "command pwd -W")
>     ((string-equal shell "zsh") "dirs -l")
>     (t "dirs")))
>        ;; Bypass a bug in certain versions of bash.
> 
> may I push it?

That's not really TRT, because it assumes every bash.exe is an MSYS
program (which might not be true: there's a Cygwin Bash, for example).
And we don't need to make such assumptions:

  (w32-application-type (executable-find "bash.exe"))
   => msys

I'm okay with installing the fix after you change it to use
w32-application-type (and verifying that it works in your case, of
course: I don't have MSYS2 Bash installed).

> Incidentally, why do you use `dirs` instead of `pwd` there?
> you use only the last dir anyway.

I don't know, I'm not familiar with shell.el well enough.  Just by
looking at the code, shell-resync-dirs does need to know all the
stack, so it could refresh the value of shell-dirstack, no?