diff mbox series

[1/2] help: add shell-path to --build-options

Message ID 20200512234213.63651-2-emilyshaffer@google.com (mailing list archive)
State New, archived
Headers show
Series bugreport: collect shell settings | expand

Commit Message

Emily Shaffer May 12, 2020, 11:42 p.m. UTC
It may be useful to know which shell Git was built to try to point to,
in the event that shell-based Git commands are failing. $SHELL_PATH is
set during the build and used to launch the manpage viewer, as well as
by git-compat-util.h, and it's used during tests. 'git version
--build-options' is encouraged for use in bug reports, so it makes sense
to include this information there.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
---
 help.c | 1 +
 1 file changed, 1 insertion(+)

Comments

brian m. carlson May 12, 2020, 11:59 p.m. UTC | #1
On 2020-05-12 at 23:42:12, Emily Shaffer wrote:
> It may be useful to know which shell Git was built to try to point to,
> in the event that shell-based Git commands are failing. $SHELL_PATH is
> set during the build and used to launch the manpage viewer, as well as
> by git-compat-util.h, and it's used during tests. 'git version
> --build-options' is encouraged for use in bug reports, so it makes sense
> to include this information there.
> 
> Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> ---
>  help.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/help.c b/help.c
> index 1de9c0d589..44cee69c11 100644
> --- a/help.c
> +++ b/help.c
> @@ -641,6 +641,7 @@ void get_version_info(struct strbuf *buf, int show_build_options)
>  			strbuf_addstr(buf, "no commit associated with this build\n");
>  		strbuf_addf(buf, "sizeof-long: %d\n", (int)sizeof(long));
>  		strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
> +		strbuf_addf(buf, "shell-path: %s\n", SHELL_PATH);
>  		/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
>  	}
>  }

This seems straightforward and logical (as does the rest of the series),
but I wondered if it might be a good idea to try to interrogate the
shell for more information.  The reason I mention it is that Debian
permits any shell that meets certain standards to be /bin/sh, and all
programs that invoke /bin/sh must depend on only those features.  The
default is dash, but people could use bash, which is more featureful, or
posh, which is intentionally designed to provide the bare minimum
/bin/sh experience[0], among others.  A value of "/bin/sh" doesn't
necessarily tell us very much on Debian (or on macOS, for that matter).

Now, that of course does mean that we have to have some way to
distinguish between shells, and that is the hard part, so I'm completely
fine with us leaving it out until we have a good way to do it (or until
we decide we need it, which may be never).  I just wanted to mention it
as a potential approach for the future.  I'm happy with this series as
it stands right now.

[0] Quite literally, in that it's supposed to be a tool for testing
compatibility with the policy requirements.
Junio C Hamano May 13, 2020, 5:02 a.m. UTC | #2
"brian m. carlson" <sandals@crustytoothpaste.net> writes:

> This seems straightforward and logical (as does the rest of the series),
> but I wondered if it might be a good idea to try to interrogate the
> shell for more information.  The reason I mention it is that Debian
> permits any shell that meets certain standards to be /bin/sh, and all
> programs that invoke /bin/sh must depend on only those features.  The
> default is dash, but people could use bash, which is more featureful, or
> posh, which is intentionally designed to provide the bare minimum
> /bin/sh experience[0], among others.  A value of "/bin/sh" doesn't
> necessarily tell us very much on Debian (or on macOS, for that matter).

Good point.  Perhaps readlink(3) on it, then?

lrwxrwxrwx 1 root root 9 Mar 11  2018 /bin/sh -> /bin/bash

> Now, that of course does mean that we have to have some way to
> distinguish between shells, and that is the hard part, so I'm completely
> fine with us leaving it out until we have a good way to do it (or until
> we decide we need it, which may be never).  I just wanted to mention it
> as a potential approach for the future.  I'm happy with this series as
> it stands right now.
>
> [0] Quite literally, in that it's supposed to be a tool for testing
> compatibility with the policy requirements.
Eric Sunshine May 13, 2020, 5:10 a.m. UTC | #3
On Wed, May 13, 2020 at 1:02 AM Junio C Hamano <gitster@pobox.com> wrote:
> "brian m. carlson" <sandals@crustytoothpaste.net> writes:
> > [...] A value of "/bin/sh" doesn't
> > necessarily tell us very much on Debian (or on macOS, for that matter).
>
> Good point.  Perhaps readlink(3) on it, then?
>
> lrwxrwxrwx 1 root root 9 Mar 11  2018 /bin/sh -> /bin/bash

That wouldn't help on Mac OS:

    $ ls -l /bin/sh /bin/bash
    -r-xr-xr-x  1 root  wheel  618448 Mar 18 22:04 /bin/bash
    -r-xr-xr-x  1 root  wheel  618512 Mar 18 22:04 /bin/sh

Although /bin/sh is neither a hard link nor a symbolic link to
/bin/bash, nor is the file size the same, it is nevertheless Bash (in
some form or another).
Emily Shaffer May 13, 2020, 6:45 p.m. UTC | #4
On Wed, May 13, 2020 at 01:10:36AM -0400, Eric Sunshine wrote:
> 
> On Wed, May 13, 2020 at 1:02 AM Junio C Hamano <gitster@pobox.com> wrote:
> > "brian m. carlson" <sandals@crustytoothpaste.net> writes:
> > > [...] A value of "/bin/sh" doesn't
> > > necessarily tell us very much on Debian (or on macOS, for that matter).
> >
> > Good point.  Perhaps readlink(3) on it, then?
> >
> > lrwxrwxrwx 1 root root 9 Mar 11  2018 /bin/sh -> /bin/bash
> 
> That wouldn't help on Mac OS:
> 
>     $ ls -l /bin/sh /bin/bash
>     -r-xr-xr-x  1 root  wheel  618448 Mar 18 22:04 /bin/bash
>     -r-xr-xr-x  1 root  wheel  618512 Mar 18 22:04 /bin/sh
> 
> Although /bin/sh is neither a hard link nor a symbolic link to
> /bin/bash, nor is the file size the same, it is nevertheless Bash (in
> some form or another).

Hum. It seems some useful things exist like $BASH_VERSION and
$ZSH_VERSION, but I'm not terribly excited about the idea of making a
list and checking each one in bugreport (as it's sure to be
nonexhaustive). I found a few more heuristics in a SO post[1] but this
approach generally looks like a pain, and somewhat unreliable.

Most other alternatives I found with a cursory Google involve checking
the name of the shell, which I think will have the same issues as
checking $SHELL:

 - `ps -p $$` for info about the current process (didn't reveal bash when I `cp
   /bin/bash ~/bin/nish && ~/bin/nish`)
 - `echo $0` since it's coming from the command line, of course will be
   the same as $SHELL

I suppose if we wanted to do the heuristics it'd be a better experience
for us, the bugreport receivers, to have the bugreport library collect
the heuristics and try to make a guess, rather than just dump all the
heuristics and let the humans try to remember which shell has $PS4 and
which shell has $version and so on. But to me that sounds prone to rot
at best.

 - Emily

[1]: https://stackoverflow.com/a/3327022
diff mbox series

Patch

diff --git a/help.c b/help.c
index 1de9c0d589..44cee69c11 100644
--- a/help.c
+++ b/help.c
@@ -641,6 +641,7 @@  void get_version_info(struct strbuf *buf, int show_build_options)
 			strbuf_addstr(buf, "no commit associated with this build\n");
 		strbuf_addf(buf, "sizeof-long: %d\n", (int)sizeof(long));
 		strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
+		strbuf_addf(buf, "shell-path: %s\n", SHELL_PATH);
 		/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
 	}
 }