diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -7,6 +7,7 @@ from __future__ import absolute_import +import copy as copymod import errno import os import re @@ -270,6 +271,28 @@ def dorecord(ui, repo, commitfunc, cmdsu raise error.Abort(_('cannot partially commit a merge ' '(use "hg commit" instead)')) + status = repo.status(match=match) + + overrides = {(b'ui', b'commitsubrepos'): True} + + with repo.ui.configoverride(overrides, b'record'): + # subrepoutil.precommit() modifies the status + tmpstatus = scmutil.status(copymod.copy(status[0]), + copymod.copy(status[1]), + copymod.copy(status[2]), + copymod.copy(status[3]), + copymod.copy(status[4]), + copymod.copy(status[5]), + copymod.copy(status[6])) + + # Force allows -X subrepo to skip the subrepo. + subs, commitsubs, newstate = subrepoutil.precommit( + repo.ui, wctx, tmpstatus, match, force=True) + for s in subs: + if s in commitsubs: + dirtyreason = wctx.sub(s).dirtyreason(True) + raise error.Abort(dirtyreason) + def fail(f, msg): raise error.Abort('%s: %s' % (f, msg)) @@ -279,7 +302,6 @@ def dorecord(ui, repo, commitfunc, cmdsu match.explicitdir = vdirs.append match.bad = fail - status = repo.status(match=match) if not force: repo.checkcommitpatterns(wctx, vdirs, match, status, fail) diffopts = patch.difffeatureopts(ui, opts=opts, whitespace=True) diff --git a/tests/test-amend-subrepo.t b/tests/test-amend-subrepo.t --- a/tests/test-amend-subrepo.t +++ b/tests/test-amend-subrepo.t @@ -121,9 +121,22 @@ add new commit to be amended $ echo a >> a $ hg ci -m3 + $ echo 't = t' > .hgsub + +--interactive won't silently ignore dirty subrepos + + $ echo modified > t/b + $ hg amend --interactive --config ui.interactive=True + abort: uncommitted changes in subrepository "t" + [255] + $ hg amend --interactive --config ui.interactive=True --config ui.commitsubrepos=True + abort: uncommitted changes in subrepository "t" + [255] + + $ hg -R t revert -q --all --no-backup + amend with one subrepo dropped - $ echo 't = t' > .hgsub $ hg amend saved backup bundle to * (glob) (obsstore-off !) $ hg status --change . diff --git a/tests/test-mq-subrepo.t b/tests/test-mq-subrepo.t --- a/tests/test-mq-subrepo.t +++ b/tests/test-mq-subrepo.t @@ -295,16 +295,6 @@ handle subrepos safely on qrecord A .hgsub A sub/a % qrecord --config ui.interactive=1 -m0 0.diff - diff --git a/.hgsub b/.hgsub - new file mode 100644 - examine changes to '.hgsub'? [Ynesfdaq?] y - - @@ -0,0 +1,1 @@ - +sub = sub - record this change to '.hgsub'? [Ynesfdaq?] y - - warning: subrepo spec file '.hgsub' not found - warning: subrepo spec file '.hgsub' not found abort: uncommitted changes in subrepository "sub" [255] % update substate when adding .hgsub w/clean updated subrepo @@ -333,15 +323,6 @@ handle subrepos safely on qrecord M .hgsub A sub2/a % qrecord --config ui.interactive=1 -m1 1.diff - diff --git a/.hgsub b/.hgsub - 1 hunks, 1 lines changed - examine changes to '.hgsub'? [Ynesfdaq?] y - - @@ -1,1 +1,2 @@ - sub = sub - +sub2 = sub2 - record this change to '.hgsub'? [Ynesfdaq?] y - abort: uncommitted changes in subrepository "sub2" [255] % update substate when modifying .hgsub w/clean updated subrepo