# HG changeset patch # User Pulkit Goyal <7895pulkit@gmail.com> # Date 2020-09-18 13:22:38 # Node ID fd1de908f2b45faf04248fb8d7c2e54f5d84334e # Parent b1664f6eb650962e81cff8cab941de432fba8ab9 dispatch: load shared source repository config in share-safe mode It seems to me now that there are two steps when config is loaded: 1) on dispatch 2) repository object creation Recent patches added functionality that there can be shares in share-safe mode where config of the source repository is shared with the the shares. However we missed adding logic to read the source config on dispatch. This leads to extensions not being loaded on dispatch and hence extensions command not being recognized. This patch fixes it by reading the shared source config on dispatch. Differential Revision: https://phab.mercurial-scm.org/D9047 diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -36,13 +36,16 @@ from . import ( help, hg, hook, + localrepo, profiling, pycompat, rcutil, registrar, + requirements as requirementsmod, scmutil, ui as uimod, util, + vfs, ) from .utils import ( @@ -939,6 +942,29 @@ def runcommand(lui, repo, cmd, fullargs, return ret +def _readsharedsourceconfig(ui, path): + """if the current repository is shared one, this tries to read + .hg/hgrc of shared source if we are in share-safe mode + + Config read is loaded into the ui object passed + + This should be called before reading .hg/hgrc or the main repo + as that overrides config set in shared source""" + try: + with open(os.path.join(path, b".hg", b"requires"), "rb") as fp: + requirements = set(fp.read().splitlines()) + if not ( + requirementsmod.SHARESAFE_REQUIREMENT in requirements + and requirementsmod.SHARED_REQUIREMENT in requirements + ): + return + hgvfs = vfs.vfs(os.path.join(path, b".hg")) + sharedvfs = localrepo._getsharedvfs(hgvfs, requirements) + ui.readconfig(sharedvfs.join(b"hgrc"), path) + except IOError: + pass + + def _getlocal(ui, rpath, wd=None): """Return (path, local ui object) for the given target path. @@ -959,12 +985,14 @@ def _getlocal(ui, rpath, wd=None): else: lui = ui.copy() if rcutil.use_repo_hgrc(): + _readsharedsourceconfig(lui, path) lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path) if rpath: path = lui.expandpath(rpath) lui = ui.copy() if rcutil.use_repo_hgrc(): + _readsharedsourceconfig(lui, path) lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path) return path, lui diff --git a/tests/test-share-safe.t b/tests/test-share-safe.t --- a/tests/test-share-safe.t +++ b/tests/test-share-safe.t @@ -102,21 +102,14 @@ Test that extensions of source repositor share $ hg extdiff -R ../source -p echo -BROKEN: the command below does not work but debugextensions says that extension +BROKEN: the command below will not work if config of shared source is not loaded +on dispatch but debugextensions says that extension is loaded $ hg debugextensions extdiff share -BROKEN: extdiff command should work here $ hg extdiff -p echo - hg: unknown command 'extdiff' - 'extdiff' is provided by the following extension: - - extdiff command to allow external programs to compare revisions - - (use 'hg help extensions' for information on enabling extensions) - [255] However, local .hg/hgrc should override the config set by share source