[PATCH 2 of 3 V2] chg: detect chg started by chg
Jun Wu
quark at fb.com
Fri Feb 26 09:20:26 EST 2016
# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1456495992 0
# Fri Feb 26 14:13:12 2016 +0000
# Node ID 39999aaee9397d8f21823dae5f5551fc5251feea
# Parent ecefdf920cc8b8b983e06da8e82b8db0f67b85de
chg: detect chg started by chg
Sometimes people may create a symbol link from hg to chg, or write a wrapper
script named hg calling chg. Without $HG and $CHGHG set, this will lead to
chg executes itself causing deadlock. The user will notice chg hangs for some
time and aborts with a timed out message, without knowing the root cause and
how to solve it.
This patch sets a dummy environment variable before executing hg to detect
this situation, and print a fatal message with some possible solutions.
diff --git a/contrib/chg/chg.c b/contrib/chg/chg.c
--- a/contrib/chg/chg.c
+++ b/contrib/chg/chg.c
@@ -227,6 +227,8 @@
memcpy(argv + baseargvsize, opts->args, sizeof(char *) * opts->argsize);
argv[argsize - 1] = NULL;
+ if (putenv("CHGINTERNALMARK=") != 0)
+ abortmsg("failed to putenv (errno = %d)", errno);
if (execvp(hgcmd, (char **)argv) < 0)
abortmsg("failed to exec cmdserver (errno = %d)", errno);
free(argv);
@@ -490,6 +492,12 @@
if (getenv("CHGDEBUG"))
enabledebugmsg();
+ if (getenv("CHGINTERNALMARK"))
+ abortmsg("chg started by chg detected.\n"
+ "Please make sure ${HG:-hg} is not a symlink or "
+ "wrapper to chg. Alternatively, set $CHGHG to the "
+ "path of real hg.");
+
if (isunsupported(argc, argv))
execoriginalhg(argv);
More information about the Mercurial-devel
mailing list