Thread (6 messages) flat view 6 messages, 3 authors, 2016-06-15

Re: [PATCH] allow setting GIT_WORK_TREE to "no work tree"

From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:11

Johannes Schindelin schrieb:
Hi,

On Wed, 6 Feb 2008, Johannes Sixt wrote:
quoted
Jeff King schrieb:
quoted
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.
-- 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help