# HG changeset patch # User Gregory Szorc # Date 2017-07-07 18:51:10 # Node ID 160efb559f67e50e40e6431ef3b32d561f9737a0 # Parent 967ac37f3d45e37e0895c5d2747eca9155993940 sparse: move post commit actions into core Instead of wrapping committablectx.markcommitted(), we inline the call into workingctx.markcommitted(). Per smf's review, workingctx is the proper location for this code, as committablectx is the shared base class for it and memctx. Since this code touches the working directory, it belongs in workingctx. diff --git a/hgext/sparse.py b/hgext/sparse.py --- a/hgext/sparse.py +++ b/hgext/sparse.py @@ -79,7 +79,6 @@ from mercurial.node import nullid from mercurial import ( cmdutil, commands, - context, dirstate, error, extensions, @@ -100,9 +99,6 @@ testedwith = 'ships-with-hg-core' cmdtable = {} command = registrar.command(cmdtable) -def uisetup(ui): - _setupcommit(ui) - def extsetup(ui): sparse.enabled = True @@ -134,27 +130,6 @@ def replacefilecache(cls, propname, repl raise AttributeError(_("type '%s' has no property '%s'") % (origcls, propname)) -def _setupcommit(ui): - def _refreshoncommit(orig, self, node): - """Refresh the checkout when commits touch .hgsparse - """ - orig(self, node) - repo = self._repo - - ctx = repo[node] - profiles = sparse.patternsforrev(repo, ctx.rev())[2] - - # profiles will only have data if sparse is enabled. - if set(profiles) & set(ctx.files()): - origstatus = repo.status() - origsparsematch = sparse.matcher(repo) - sparse.refreshwdir(repo, origstatus, origsparsematch, force=True) - - sparse.prunetemporaryincludes(repo) - - extensions.wrapfunction(context.committablectx, 'markcommitted', - _refreshoncommit) - def _setuplog(ui): entry = commands.table['^log|history'] entry[1].append(('', 'sparse', None, diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -38,6 +38,7 @@ from . import ( repoview, revlog, scmutil, + sparse, subrepo, util, ) @@ -1803,6 +1804,11 @@ class workingctx(committablectx): match.bad = bad return match + def markcommitted(self, node): + super(workingctx, self).markcommitted(node) + + sparse.aftercommit(self._repo, node) + class committablefilectx(basefilectx): """A committablefilectx provides common functionality for a file context that wants the ability to commit, e.g. workingfilectx or memfilectx.""" diff --git a/mercurial/sparse.py b/mercurial/sparse.py --- a/mercurial/sparse.py +++ b/mercurial/sparse.py @@ -478,3 +478,19 @@ def refreshwdir(repo, origstatus, origsp dirstate.normallookup(file) return added, dropped, lookup + +def aftercommit(repo, node): + """Perform actions after a working directory commit.""" + # This function is called unconditionally, even if sparse isn't + # enabled. + ctx = repo[node] + + profiles = patternsforrev(repo, ctx.rev())[2] + + # profiles will only have data if sparse is enabled. + if set(profiles) & set(ctx.files()): + origstatus = repo.status() + origsparsematch = matcher(repo) + refreshwdir(repo, origstatus, origsparsematch, force=True) + + prunetemporaryincludes(repo)