Re: [PATCH] allow setting GIT_WORK_TREE to "no work tree"
- From
Johannes Sixt <j.sixt@viscovery.net>
- Date
- Feb 8, 2008, 07:21 UTC
- Message-ID
- <47AC02F5.9080705@viscovery.net>
- In-Reply-To
- <alpine.LSU.1.00.0802071855550.8543@racer.site>
Johannes Schindelin schrieb:
Show 29 quoted lines
> Hi, > > On Wed, 6 Feb 2008, Johannes Sixt wrote: > >> Jeff King schrieb: >>> In setup_git_directory_gently, we have a special rule that says "if >>> GIT_DIR is set but GIT_WORK_TREE is not, then use the current working >>> directory as the work tree." This is the intended behavior for the >>> user perspective. >>> >>> However, setup_git_directory_gently sets GIT_DIR itself, meaning that >>> further setups (either because we are executing a command via alias, >>> or in a subprocess) will see the non-existent GIT_WORK_TREE and assume >>> we fall into the "current working directory is the working tree" >>> codepath. >>> >>> Instead, we now use a special value of GIT_WORK_TREE to indicate that >>> we have already checked for a worktree and that there isn't one, >>> setting it when we set GIT_DIR and checking for it in the special case >>> path. >>> >>> The special value is a blank GIT_WORK_TREE; it could be any value, but >>> this should not conflict with any user values (and as a bonus, you can >>> now tell git "I don't have a work tree" with "GIT_WORK_TREE= git", >>> though I suspect the use case for that is limited). >> Hrm. Unfortunately, on Windows there is no such thing as an empty >> environment string. setenv(x, "") *removes* the environment variable. > > That might be a shortcoming of our implementation of setenv():
No, it is not. It's Windows's putenv(), and it's even documented.
Show 43 quoted lines
> -- snip --
> cd /git
>
> cat > a1.c << EOF
> #include <stdio.h>
> #include "compat/setenv.c"
> #include "compat/unsetenv.c"
>
> static void p()
> {
> const char *abc = getenv("ABC");
> printf("env ABC: %s\n", abc ? abc : "(null)");
> }
>
> int main()
> {
> p();
> gitsetenv("ABC", "Hello", 1);
> p();
> gitsetenv("ABC", "", 1);
> p();
> gitunsetenv("ABC");
> p();
> return 0;
> }
> EOF
>
> gcc -DNO_MMAP=1 -I. -Icompat -o a1.exe a1.c
>
> ABC="" ./a1.exe
> -- snap --
>
> This will show
>
> env ABC:
> env ABC: Hello
> env ABC: (null)
> env ABC: (null)
>
> So it seems that environment variables _can_ be empty. Just our
> relatively stupid implementation of setenv() does not do it.
>
> Maybe something like compat/unsetenv.c is needed in setenv(), too.This only shows that, yes, variables _can_ be empty - if the setenv/putenv implementation is "sane", like MSYS/bash's.
That said, we probably should modify environ directly in gitsetenv().
-- Hannes