diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -568,7 +568,7 @@ # The .hg/hgrc file may load extensions or contain config options # that influence repository construction. Attempt to load it and # process any new extensions that it may have pulled in. - if loadhgrc(ui, wdirvfs, hgvfs, requirements): + if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs): afterhgrcload(ui, wdirvfs, hgvfs, requirements) extensions.loadall(ui) extensions.populateui(ui) @@ -697,7 +697,7 @@ ) -def loadhgrc(ui, wdirvfs, hgvfs, requirements): +def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None): """Load hgrc files/content into a ui instance. This is called during repository opening to load any additional @@ -708,9 +708,20 @@ Extensions should monkeypatch this function to modify how per-repo configs are loaded. For example, an extension may wish to pull in configs from alternate files or sources. + + sharedvfs is vfs object pointing to source repo if the current one is a + shared one """ if not rcutil.use_repo_hgrc(): return False + + # first load config from shared source if we has to + if SHARESAFE_REQUIREMENT in requirements and sharedvfs: + try: + ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base) + except IOError: + pass + try: ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base) return True 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 @@ -66,4 +66,75 @@ $ echo c > c $ hg ci -Aqm "added c" +Check that config of the source repository is also loaded + + $ hg showconfig ui.curses + [1] + + $ echo "[ui]" >> ../source/.hg/hgrc + $ echo "curses=true" >> ../source/.hg/hgrc + + $ hg showconfig ui.curses + true + +However, local .hg/hgrc should override the config set by share source + + $ echo "[ui]" >> .hg/hgrc + $ echo "curses=false" >> .hg/hgrc + + $ hg showconfig ui.curses + false + +Testing that hooks set in source repository also runs in shared repo + + $ cd ../source + $ cat <> .hg/hgrc + > [extensions] + > hooklib= + > [hooks] + > pretxnchangegroup.reject_merge_commits = \ + > python:hgext.hooklib.reject_merge_commits.hook + > EOF + + $ cd .. + $ hg clone source cloned + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd cloned + $ hg up 0 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo bar > bar + $ hg ci -Aqm "added bar" + $ hg merge + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m "merge commit" + + $ hg push ../source + pushing to ../source + searching for changes + adding changesets + adding manifests + adding file changes + error: pretxnchangegroup.reject_merge_commits hook failed: bcde3522682d rejected as merge on the same branch. Please consider rebase. + transaction abort! + rollback completed + abort: bcde3522682d rejected as merge on the same branch. Please consider rebase. + [255] + + $ hg push ../shared1 + pushing to ../shared1 + searching for changes + adding changesets + adding manifests + adding file changes + error: pretxnchangegroup.reject_merge_commits hook failed: bcde3522682d rejected as merge on the same branch. Please consider rebase. + transaction abort! + rollback completed + abort: bcde3522682d rejected as merge on the same branch. Please consider rebase. + [255] + +Unsharing works + + $ cd ../shared1 $ hg unshare