subrepo: extend config option to disable subrepos by type (SEC)
This allows us to minimize the behavior change introduced by the next patch.
I have no idea which config style is preferred in UX POV, but I decided to
get things done.
a) list: 'allowed = hg, git, svn'
b) sub option: 'allowed.hg = True' or 'allowed:hg = True'
c) per-type action: 'hg = allow', 'git = abort'
--- a/mercurial/help/config.txt Sun Nov 05 21:22:07 2017 +0900
+++ b/mercurial/help/config.txt Sun Nov 05 21:48:58 2017 +0900
@@ -1900,11 +1900,12 @@
subrepositories feature. See also :hg:`help subrepos`.
``allowed``
- Whether subrepository operation in the working directory is allowed.
-
- When disabled, any commands including :hg:`update` will fail if
+ List of subrepository types (hg, git, svn) allowed in the working
+ directory.
+
+ When disallowed, any commands including :hg:`update` will fail if
subrepositories are involved.
- (default: True)
+ (default: `hg, git, svn`)
``templatealias``
-----------------
--- a/mercurial/subrepo.py Sun Nov 05 21:22:07 2017 +0900
+++ b/mercurial/subrepo.py Sun Nov 05 21:48:58 2017 +0900
@@ -366,8 +366,8 @@
raise error.Abort(_("subrepo '%s' traverses symbolic link") % path)
def _checktype(ui, kind):
- if not ui.configbool('subrepos', 'allowed', True):
- raise error.Abort(_("subrepo not allowed"),
+ if kind not in ui.configlist('subrepos', 'allowed', ['hg', 'git', 'svn']):
+ raise error.Abort(_("subrepo type %s not allowed") % kind,
hint=_("see 'hg help config.subrepos' for details"))
if kind not in types:
raise error.Abort(_('unknown subrepo type %s') % kind)
--- a/tests/test-subrepo-git.t Sun Nov 05 21:22:07 2017 +0900
+++ b/tests/test-subrepo-git.t Sun Nov 05 21:48:58 2017 +0900
@@ -90,22 +90,30 @@
clone with subrepo disabled (update should fail)
- $ hg clone t -U tc2 --config subrepos.allowed=false
- $ hg update -R tc2 --config subrepos.allowed=false
- abort: subrepo not allowed
+ $ hg clone t -U tc2 --config subrepos.allowed=
+ $ hg update -R tc2 --config subrepos.allowed=
+ abort: subrepo type git not allowed
(see 'hg help config.subrepos' for details)
[255]
$ ls tc2
a
- $ hg clone t tc3 --config subrepos.allowed=false
+ $ hg clone t tc3 --config subrepos.allowed=
updating to branch default
- abort: subrepo not allowed
+ abort: subrepo type git not allowed
(see 'hg help config.subrepos' for details)
[255]
$ ls tc3
a
+ $ hg clone t tc4 --config subrepos.allowed=hg
+ updating to branch default
+ abort: subrepo type git not allowed
+ (see 'hg help config.subrepos' for details)
+ [255]
+ $ ls tc4
+ a
+
update to previous substate
$ cd tc
--- a/tests/test-subrepo.t Sun Nov 05 21:22:07 2017 +0900
+++ b/tests/test-subrepo.t Sun Nov 05 21:48:58 2017 +0900
@@ -488,22 +488,30 @@
clone with subrepo disabled (update should fail)
- $ hg clone t -U tc2 --config subrepos.allowed=false
- $ hg update -R tc2 --config subrepos.allowed=false
- abort: subrepo not allowed
+ $ hg clone t -U tc2 --config subrepos.allowed=
+ $ hg update -R tc2 --config subrepos.allowed=
+ abort: subrepo type hg not allowed
(see 'hg help config.subrepos' for details)
[255]
$ ls tc2
a
- $ hg clone t tc3 --config subrepos.allowed=false
+ $ hg clone t tc3 --config subrepos.allowed=
updating to branch default
- abort: subrepo not allowed
+ abort: subrepo type hg not allowed
(see 'hg help config.subrepos' for details)
[255]
$ ls tc3
a
+ $ hg clone t tc4 --config subrepos.allowed=git
+ updating to branch default
+ abort: subrepo type hg not allowed
+ (see 'hg help config.subrepos' for details)
+ [255]
+ $ ls tc4
+ a
+
push
$ cd tc