# HG changeset patch # User Yuya Nishihara # Date 1509793660 -32400 # Node ID 691524f0bbf6cd44fc26ebfce046e6c4888a1b0f # Parent 5c6b96b832c25bceb6ca5ee0df34b46e2652cd84 amend: update .hgsubstate before committing a memctx (issue5677) This is a minimal copy of localrepo.commit(). As the current amend() function heavily depends on the wctx API, it wasn't easy to port it to use a separate status tuple. So for now, wctx._status is updated in-place. diff -r 5c6b96b832c2 -r 691524f0bbf6 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Sat Nov 04 19:21:39 2017 +0900 +++ b/mercurial/cmdutil.py Sat Nov 04 20:07:40 2017 +0900 @@ -3153,6 +3153,18 @@ raise error.Abort( _("failed to mark all new/missing files as added/removed")) + # Check subrepos. This depends on in-place wctx._status update in + # subrepo.precommit(). To minimize the risk of this hack, we do + # nothing if .hgsub does not exist. + if '.hgsub' in wctx or '.hgsub' in old: + from . import subrepo # avoid cycle: cmdutil -> subrepo -> cmdutil + subs, commitsubs, newsubstate = subrepo.precommit( + ui, wctx, wctx._status, matcher) + # amend should abort if commitsubrepos is enabled + assert not commitsubs + if subs: + subrepo.writestate(repo, newsubstate) + filestoamend = set(f for f in wctx.files() if matcher(f)) changes = (len(filestoamend) > 0) diff -r 5c6b96b832c2 -r 691524f0bbf6 tests/test-amend-subrepo.t --- a/tests/test-amend-subrepo.t Sat Nov 04 19:21:39 2017 +0900 +++ b/tests/test-amend-subrepo.t Sat Nov 04 20:07:40 2017 +0900 @@ -31,28 +31,18 @@ amend without .hgsub -BROKEN: should say "can't commit subrepos without .hgsub" $ hg amend s - nothing changed - [1] + abort: can't commit subrepos without .hgsub + [255] amend with subrepo -BROKEN: should update .hgsubstate $ hg amend saved backup bundle to * (glob) (obsstore-off !) $ hg status --change . A .hgsub + A .hgsubstate A a - -FIX UP .hgsubstate - - $ hg ci -mfix - $ hg rollback -q - $ hg add .hgsubstate - $ hg amend - saved backup bundle to * (glob) (obsstore-off !) - $ cat .hgsubstate 0000000000000000000000000000000000000000 s @@ -69,46 +59,27 @@ $ echo a >> s/a $ hg add -R s adding s/a -BROKEN: should say "uncommitted changes in subrepository" $ hg amend - nothing changed - [1] + abort: uncommitted changes in subrepository "s" + (use --subrepos for recursive commit) + [255] amend with modified subrepo $ hg ci -R s -m0 -BROKEN: should update .hgsubstate - $ hg amend - nothing changed - [1] - $ hg status --change . - M a - -FIX UP .hgsubstate - - $ hg ci -mfix - $ hg rollback -q $ hg amend saved backup bundle to * (glob) (obsstore-off !) - + $ hg status --change . + M .hgsubstate + M a $ cat .hgsubstate f7b1eb17ad24730a1651fccd46c43826d1bbc2ac s revert subrepo change $ hg up -R s -q null -BROKEN: should update .hgsubstate - $ hg amend - nothing changed - [1] - -FIX UP .hgsubstate - - $ hg ci -mfix - $ hg rollback -q $ hg amend saved backup bundle to * (glob) (obsstore-off !) - $ hg status --change . M a @@ -131,21 +102,13 @@ $ hg ci -R t -Am0 adding b $ echo 't = t' >> .hgsub -BROKEN: should update .hgsubstate $ hg amend saved backup bundle to * (glob) (obsstore-off !) $ hg status --change . M .hgsub + M .hgsubstate M a A b - -FIX UP .hgsubstate - - $ hg ci -mfix - $ hg rollback -q - $ hg amend - saved backup bundle to * (glob) (obsstore-off !) - $ cat .hgsubstate 0000000000000000000000000000000000000000 s bfb1a4fb358498a9533dabf4f2043d94162f1fcd t @@ -161,23 +124,12 @@ amend with one subrepo dropped $ echo 't = t' > .hgsub -BROKEN: should update .hgsubstate $ hg amend saved backup bundle to * (glob) (obsstore-off !) $ hg status --change . M .hgsub + M .hgsubstate M a - -FIX UP .hgsubstate - - $ echo 's = s' > .hgsub - $ hg amend -q - $ echo 't = t' > .hgsub - $ hg ci -mfix - $ hg rollback -q - $ hg amend - saved backup bundle to * (glob) (obsstore-off !) - $ cat .hgsubstate bfb1a4fb358498a9533dabf4f2043d94162f1fcd t @@ -192,22 +144,11 @@ amend with .hgsub removed $ hg rm .hgsub -BROKEN: should update .hgsubstate $ hg amend saved backup bundle to * (glob) (obsstore-off !) $ hg status --change . M a R .hgsub - -FIX UP .hgsubstate - - $ hg forget .hgsubstate - $ hg amend - saved backup bundle to * (glob) (obsstore-off !) - - $ hg status --change . - M a - R .hgsub R .hgsubstate $ cd ..