Skip to content

chg: populate CHGHG if not set

Normally, chg determines which hg executable to use by first consulting the $CHGHG and $HG environment variables, and if neither are present defaults to the hg found in the user's $PATH. If built with the HGPATHREL compiler flag, chg will instead assume that there exists an hg executable in the same directory as the chg binary and attempt to use that.

This can cause problems in situations where there are multiple actively-used Mercurial installations on the same system. When a chg client connects to a running command server, the server process performs some basic validation to determine whether a new command server needs to be spawned. These checks include things like checking certain "sensitive" environment variables and config sections, as well as checking whether the mtime of the extensions, hg's __version__.py module, and the Python interpreter have changed.

Crucially, the command server doesn't explicitly check whether the executable it is running from matches the executable that the chg client would have otherwise invoked had there been no existing command server process. Without HGPATHREL, this still gets implicitly checked during the validation step, because the only way to specify an alternate hg executable (apart from $PATH) is via the $CHGHG and $HG environment variables, both of which are checked.

With HGPATHREL, however, the command server has no way of knowing which hg executable the client would have run. This means that a client located at /version_B/bin/chg will happily connect to a command server running /version_A/bin/hg instead of /version_B/bin/hg as expected. A simple solution is to have the client set $CHGHG itself, which then allows the command server's environment validation to work as intended.

I have tested this manually using two locally built hg installations and it seems to work with no ill effects. That said, I'm not sure how to write an automated test for this since the chg available to the tests isn't even built with the HGPATHREL compiler flag to begin with.

Merge request reports