diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -44,6 +44,7 @@ hbisect, help, hg, + localrepo, logcmdutil, merge as mergemod, mergestate as mergestatemod, @@ -66,6 +67,7 @@ ui as uimod, util, verify as verifymod, + vfs as vfsmod, wireprotoserver, ) from .utils import ( @@ -2141,6 +2143,7 @@ (b'u', b'untrusted', None, _(b'show untrusted configuration options')), (b'e', b'edit', None, _(b'edit user config')), (b'l', b'local', None, _(b'edit repository config')), + (b'', b'share', None, _(b'edit share source config (EXPERIMENTAL)')), (b'g', b'global', None, _(b'edit global config')), ] + formatteropts, @@ -2179,22 +2182,34 @@ :source: String. Filename and line number where the item is defined. :value: String. Config value. + The --share flag can be used to edit the config file of share source + repository. It only works when you have shared using the experimental safe + method. + Returns 0 on success, 1 if NAME does not exist. """ opts = pycompat.byteskwargs(opts) - editopts = (b'edit', b'local', b'global') + editopts = (b'edit', b'local', b'global', b'share') if any(opts.get(o) for o in editopts): - if opts.get(b'local') and opts.get(b'global'): - raise error.Abort(_(b"can't use --local and --global together")) - + cmdutil.check_at_most_one_arg(opts, *editopts[1:]) if opts.get(b'local'): if not repo: raise error.Abort(_(b"can't use --local outside a repository")) paths = [repo.vfs.join(b'hgrc')] elif opts.get(b'global'): paths = rcutil.systemrcpath() + elif opts.get(b'share'): + if not repo.shared(): + raise error.Abort( + _(b"repository is not shared one, can't use --share") + ) + if localrepo.SHARESAFE_REQUIREMENT not in repo.requirements: + raise error.Abort( + _(b"this does not support editing share source config") + ) + paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')] else: paths = rcutil.userrcpath() 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 @@ -33,6 +33,10 @@ $ hg ci -Aqm "added a" $ echo b > b $ hg ci -Aqm "added b" + + $ HGEDITOR=cat hg config --share + abort: repository is not shared one, can't use --share + [255] $ cd .. Create a shared repo and check the requirements are shared and read correctly @@ -85,6 +89,14 @@ $ hg showconfig ui.curses false + $ HGEDITOR=cat hg config --share + [ui] + curses=true + + $ HGEDITOR=cat hg config --local + [ui] + curses=false + Testing that hooks set in source repository also runs in shared repo $ cd ../source