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.
This commit is contained in:
Gregory Szorc 2017-07-07 11:51:10 -07:00
parent f2b2c89b93
commit 2689134340
3 changed files with 22 additions and 25 deletions

View File

@ -79,7 +79,6 @@ from mercurial.node import nullid
from mercurial import ( from mercurial import (
cmdutil, cmdutil,
commands, commands,
context,
dirstate, dirstate,
error, error,
extensions, extensions,
@ -100,9 +99,6 @@ testedwith = 'ships-with-hg-core'
cmdtable = {} cmdtable = {}
command = registrar.command(cmdtable) command = registrar.command(cmdtable)
def uisetup(ui):
_setupcommit(ui)
def extsetup(ui): def extsetup(ui):
sparse.enabled = True sparse.enabled = True
@ -134,27 +130,6 @@ def replacefilecache(cls, propname, replacement):
raise AttributeError(_("type '%s' has no property '%s'") % (origcls, raise AttributeError(_("type '%s' has no property '%s'") % (origcls,
propname)) 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): def _setuplog(ui):
entry = commands.table['^log|history'] entry = commands.table['^log|history']
entry[1].append(('', 'sparse', None, entry[1].append(('', 'sparse', None,

View File

@ -38,6 +38,7 @@ from . import (
repoview, repoview,
revlog, revlog,
scmutil, scmutil,
sparse,
subrepo, subrepo,
util, util,
) )
@ -1803,6 +1804,11 @@ class workingctx(committablectx):
match.bad = bad match.bad = bad
return match return match
def markcommitted(self, node):
super(workingctx, self).markcommitted(node)
sparse.aftercommit(self._repo, node)
class committablefilectx(basefilectx): class committablefilectx(basefilectx):
"""A committablefilectx provides common functionality for a file context """A committablefilectx provides common functionality for a file context
that wants the ability to commit, e.g. workingfilectx or memfilectx.""" that wants the ability to commit, e.g. workingfilectx or memfilectx."""

View File

@ -478,3 +478,19 @@ def refreshwdir(repo, origstatus, origsparsematch, force=False):
dirstate.normallookup(file) dirstate.normallookup(file)
return added, dropped, lookup 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)