git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] subtree: fix the GIT_EXEC_PATH sanity check to work on Windows

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jun 11, 2021, 10:19 UTC
Message-ID
<nycvar.QRO.7.76.6.2106111213050.57@tvgsbejvaqbjf.bet>
In-Reply-To
<87bl8d6xoq.wl-lukeshu@lukeshu.com>
Hi Luke,
On Thu, 10 Jun 2021, Luke Shumaker wrote:
Show 46 quoted lines
> On Thu, 10 Jun 2021 03:13:30 -0600,
> Johannes Schindelin via GitGitGadget wrote:
> >
> > From: Johannes Schindelin <johannes.schindelin@gmx.de>
> >
> > In 22d550749361 (subtree: don't fuss with PATH, 2021-04-27), `git
> > subtree` was broken thoroughly on Windows.
> >
> > The reason is that it assumes Unix semantics, where `PATH` is
> > colon-separated, and it assumes that `$GIT_EXEC_PATH:` is a verbatim
> > prefix of `$PATH`. Neither are true, the latter in particular because
> > `GIT_EXEC_PATH` is a Windows-style path, while `PATH` is a Unix-style
> > path list.
> >
> > Let's keep the original spirit, and hack together something that
> > unbreaks the logic on Windows.
> >
> > A more thorough fix would look at the inode of `$GIT_EXEC_PATH` and of
> > the first component of `$PATH`, to make sure that they are identical,
> > but that is even trickier to do in a portable way.
> >
> > This fixes https://github.com/git-for-windows/git/issues/3260
> >
> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> > ---
> >  contrib/subtree/git-subtree.sh | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
> > index b06782bc7955..6bd689a6bb92 100755
> > --- a/contrib/subtree/git-subtree.sh
> > +++ b/contrib/subtree/git-subtree.sh
> > @@ -5,7 +5,13 @@
> >  # Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>
> >  #
> >
> > -if test -z "$GIT_EXEC_PATH" || test "${PATH#"${GIT_EXEC_PATH}:"}" = "$PATH" || ! test -f "$GIT_EXEC_PATH/git-sh-setup"
> > +if test -z "$GIT_EXEC_PATH" || {
> > +	test "${PATH#"${GIT_EXEC_PATH}:"}" = "$PATH" && {
> > +		# On Windows, PATH might be Unix-style, GIT_EXEC_PATH not
> > +		! type -p cygpath >/dev/null 2>&1 ||
> > +		test "${PATH#$(cygpath -au "$GIT_EXEC_PATH"):}" = "$PATH"
>
> Nit: That should have a couple more `"` in it:
>
>     test "${PATH#"$(cygpath -au "$GIT_EXEC_PATH"):"}" = "$PATH"
Are you sure about that?
	$ P='*:hello'; echo "${P#$(echo '*'):}"
	hello

As you can see, there is no problem with that `echo '*'` producing a wildcard character.

In any case, neither '*' nor '?' are valid filename characters on Windows, therefore there is little danger here.

To be honest, I was looking more for reviews focusing on potentially-better solutions, such as looking at the inodes, or even comparing the contents of `$GIT_EXEC_PATH/git-subtree` and `${PATH%%:*}/git-subtree`, and complaining if they're not identical.

Those two ideas look a bit ham-handed to me, though, the latter because it reads the file twice, for _every_ `git subtree` invocation, and the fomer because there simply is no easy portable way to look at the inode of a file (stat(1) has different semantics depending whether it is the GNU or the BSD flavor, and it might not even be present to begin with).

I was also looking forward to hear whether there are opinions about maybe dropping this check altogether because there were indications that this condition is not even common anymore.

> But no need to re-roll for just that.
>
> Do we also need to handle the reverse case, where PATH uses
> backslashes but GIT_EXEC_PATH uses forward slashes?
In Git for Windows, we ensure to use forward slashes in `GIT_EXEC_PATH`.

Ciao, Dscho

Previous: Luke ShumakerNext: Luke Shumaker
Message 6 of 27 in “Fix git subtree on Windows”
  1. 0/2 Fix git subtree on WindowsJohannes Schindelin via GitGitGadget, Jun 10, 2021
  2. 1/2 subtree: fix the GIT_EXEC_PATH sanity check to work on WindowsJohannes Schindelin via GitGitGadget, Jun 10, 2021
  3. Luke ShumakerJun 11, 2021
  4. Junio C HamanoJun 11, 2021
  5. Luke ShumakerJun 11, 2021
  6. Johannes SchindelinJun 11, 2021
  7. Luke ShumakerJun 11, 2021
  8. Johannes SchindelinJun 14, 2021
  9. Junio C HamanoJun 15, 2021
  10. Jeff KingJun 15, 2021
  11. Bagas SanjayaJun 15, 2021
  12. Jeff KingJun 15, 2021
  13. Johannes SchindelinJun 15, 2021
  14. Junio C HamanoJun 16, 2021
  15. Jeff KingJun 16, 2021
  16. 2/2 subtree: fix assumption about the directory separatorJohannes Schindelin via GitGitGadget, Jun 10, 2021
  17. Luke ShumakerJun 11, 2021
  18. Johannes SchindelinJun 11, 2021
  19. Luke ShumakerJun 11, 2021
  20. Johannes SchindelinJun 11, 2021
  21. Luke ShumakerJun 11, 2021
  22. Felipe ContrerasJun 11, 2021
  23. Luke ShumakerJun 12, 2021
  24. 0/2 Fix git subtree on WindowsJohannes Schindelin via GitGitGadget, Jun 14, 2021
  25. 2/2 subtree: fix assumption about the directory separatorJohannes Schindelin via GitGitGadget, Jun 14, 2021
  26. 1/2 subtree: fix the GIT_EXEC_PATH sanity check to work on WindowsJohannes Schindelin via GitGitGadget, Jun 14, 2021
  27. Junio C HamanoJun 15, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.