diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -55,6 +55,7 @@ pycompat, rcutil, registrar, + requirements, revsetlang, rewriteutil, scmutil, @@ -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'shared', 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 --shared 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'shared') 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'shared'): + if not repo.shared(): + raise error.Abort( + _(b"repository is not shared one, can't use --shared") + ) + if requirements.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-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -258,7 +258,7 @@ cat: output, rev, decode, include, exclude, template clone: noupdate, updaterev, rev, branch, pull, uncompressed, stream, ssh, remotecmd, insecure commit: addremove, close-branch, amend, secret, edit, force-close-branch, interactive, include, exclude, message, logfile, date, user, subrepos - config: untrusted, edit, local, global, template + config: untrusted, edit, local, shared, global, template continue: dry-run copy: forget, after, at-rev, force, include, exclude, dry-run debugancestor: 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 --shared + abort: repository is not shared one, can't use --shared + [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 --shared + [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