diff -r 406519302520 -r 4ea21df312ec mercurial/cmdutil.py --- a/mercurial/cmdutil.py Sun Mar 17 12:43:45 2019 +0900 +++ b/mercurial/cmdutil.py Sat Mar 16 14:40:21 2019 -0400 @@ -7,6 +7,7 @@ from __future__ import absolute_import +import copy as copymod import errno import os import re @@ -270,6 +271,28 @@ 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 @@ 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)