diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -36,13 +36,16 @@ help, hg, hook, + localrepo, profiling, pycompat, rcutil, registrar, + requirements as requirementsmod, scmutil, ui as uimod, util, + vfs, ) from .utils import ( @@ -939,6 +942,29 @@ 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 @@ 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 @@ 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