Re: [PATCH 1/2] subtree: fix the GIT_EXEC_PATH sanity check to work on Windows
From: Johannes Schindelin <hidden>
Date: 2021-06-14 11:56:25
Hi Luke, On Fri, 11 Jun 2021, Luke Shumaker wrote:
On Fri, 11 Jun 2021 04:19:17 -0600, Johannes Schindelin wrote:quoted
On Thu, 10 Jun 2021, Luke Shumaker wrote:quoted
On Thu, 10 Jun 2021 03:13:30 -0600, Johannes Schindelin via GitGitGadget wrote:quoted
-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.In the other email (the reply to Junio), I specified that it's only a problem if the glob isn't self-matching. So * and ? are fine, but [charset] probably isn't. $ P='f[o]o:bar'; echo "${P#$(echo 'f[o]o'):}" f[o]o:bar $ P='f[o]o:bar'; echo "${P#"$(echo 'f[o]o'):"}" bar
Thank you for clarifying. This is actually a valid concern also on Windows because according to https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file the brackets _are_ valid file name characters.
quoted
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.So the check right now is gross, but I don't know what would be better. The point of the check is more to check "is the environment set up the way that `git` sets it up for us", not so much to actually check the filesystem. Plus, it shouldn't actually care if it's installed in `$GIT_EXEC_PATH` or not, it should be totally happy for $GIT_EXEC_PATH/git-subtree to not exist and for git-subtree to be elsewhere in the PATH. So an inode or content check would be wrong. Perhaps checking git-sh-setup instead of git-subtree though...quoted
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).`test FILE1 -ef FILE2` checks wether the inode is the same. And it's POSIX, so I'm assuming that it's sufficiently portable, though I haven't actually tested whether things other than Bash implement it.
It's not POSIX. From https://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html: Some additional primaries newly invented or from the KornShell appeared in an early proposal as part of the conditional command ([[]]): s1 > s2, s1 < s2, str = pattern, str != pattern, f1 -nt f2, f1 -ot f2, and f1 -ef f2. Having said that, it appears that Bash implements it (what non-standard behavior _doesn't_ it implement ;-)) And since Git for Windows ships with Bash, we can actually use it!
quoted
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.I think it would be good for it to eventually go away. But having removed the hacks that allowed it to work in broken setups, I have no way of knowing how many people had setups like that unless they tell me now that it's telling them, and if those users are now broken, I don't want them to be *silently* broken. So I think we do need to have the check for a longish period of time.quoted
quoted
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`.Did you mean to write `PATH` here instead of `GIT_EXEC_PATH`? Because if not, then I'm confused.
Ah, I thought it was clear that the `PATH` variable is already _not_ the standard Windows version (which contains backslashes and _semicolons_), but it is adjusted automatically by the MSYS2 runtime to look more Unix-like (with forward slashes and _colons_). Ciao, Dscho