Browse Source

mingw: unset PERL5LIB by default

Git for Windows ships with its own Perl interpreter, and insists on
using it, so it will most likely wreak havoc if PERL5LIB is set before
launching Git.

Let's just unset that environment variables when spawning processes.

To make this feature extensible (and overrideable), there is a new
config setting `core.unsetenvvars` that allows specifying a
comma-separated list of names to unset before spawning processes.

Reported by Gabriel Fuhrmann.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 6 years ago committed by Junio C Hamano
parent
commit
0e218f91c2
  1. 6
      Documentation/config.txt
  2. 35
      compat/mingw.c
  3. 30
      t/t0029-core-unsetenvvars.sh

6
Documentation/config.txt

@ -921,6 +921,12 @@ relatively high IO latencies. When enabled, Git will do the @@ -921,6 +921,12 @@ relatively high IO latencies. When enabled, Git will do the
index comparison to the filesystem data in parallel, allowing
overlapping IO's. Defaults to true.

core.unsetenvvars::
Windows-only: comma-separated list of environment variables'
names that need to be unset before spawning any other process.
Defaults to `PERL5LIB` to account for the fact that Git for
Windows insists on using its own Perl interpreter.

core.createObject::
You can set this to 'link', in which case a hardlink followed by
a delete of the source are used to make sure that object creation

35
compat/mingw.c

@ -212,6 +212,7 @@ enum hide_dotfiles_type { @@ -212,6 +212,7 @@ enum hide_dotfiles_type {
};

static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
static char *unset_environment_variables;

int mingw_core_config(const char *var, const char *value, void *cb)
{
@ -223,6 +224,12 @@ int mingw_core_config(const char *var, const char *value, void *cb) @@ -223,6 +224,12 @@ int mingw_core_config(const char *var, const char *value, void *cb)
return 0;
}

if (!strcmp(var, "core.unsetenvvars")) {
free(unset_environment_variables);
unset_environment_variables = xstrdup(value);
return 0;
}

return 0;
}

@ -1180,6 +1187,27 @@ static wchar_t *make_environment_block(char **deltaenv) @@ -1180,6 +1187,27 @@ static wchar_t *make_environment_block(char **deltaenv)
return wenvblk;
}

static void do_unset_environment_variables(void)
{
static int done;
char *p = unset_environment_variables;

if (done || !p)
return;
done = 1;

for (;;) {
char *comma = strchr(p, ',');

if (comma)
*comma = '\0';
unsetenv(p);
if (!comma)
break;
p = comma + 1;
}
}

struct pinfo_t {
struct pinfo_t *next;
pid_t pid;
@ -1198,9 +1226,12 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen @@ -1198,9 +1226,12 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL;
unsigned flags = CREATE_UNICODE_ENVIRONMENT;
BOOL ret;
HANDLE cons;

do_unset_environment_variables();

/* Determine whether or not we are associated to a console */
HANDLE cons = CreateFile("CONOUT$", GENERIC_WRITE,
cons = CreateFile("CONOUT$", GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (cons == INVALID_HANDLE_VALUE) {
@ -2437,6 +2468,8 @@ void mingw_startup(void) @@ -2437,6 +2468,8 @@ void mingw_startup(void)
/* fix Windows specific environment settings */
setup_windows_environment();

unset_environment_variables = xstrdup("PERL5LIB");

/* initialize critical section for waitpid pinfo_t list */
InitializeCriticalSection(&pinfo_cs);


30
t/t0029-core-unsetenvvars.sh

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
#!/bin/sh

test_description='test the Windows-only core.unsetenvvars setting'

. ./test-lib.sh

if ! test_have_prereq MINGW
then
skip_all='skipping Windows-specific tests'
test_done
fi

test_expect_success 'setup' '
mkdir -p "$TRASH_DIRECTORY/.git/hooks" &&
write_script "$TRASH_DIRECTORY/.git/hooks/pre-commit" <<-\EOF
echo $HOBBES >&2
EOF
'

test_expect_success 'core.unsetenvvars works' '
HOBBES=Calvin &&
export HOBBES &&
git commit --allow-empty -m with 2>err &&
grep Calvin err &&
git -c core.unsetenvvars=FINDUS,HOBBES,CALVIN \
commit --allow-empty -m without 2>err &&
! grep Calvin err
'

test_done
Loading…
Cancel
Save