##// END OF EJS Templates
narrow: when widening, don't include manifests the client already has...
narrow: when widening, don't include manifests the client already has When widening, we already don't include the changelog (since f1844a10ee19) and files that the client already has (since c73c7653dfb9). However, we still include all manifests needed for the new narrowspec. When using flat manifests, that means we resend all the manifests even though the client necessarily has all of them. For tree manifests, we unnecessarily resend the root manifests and any subdirectory manifests that the client already has. This patch makes it so we no longer resend manifests that the client already has. It does so by passing an extra matcher to the changegroup packer and it uses that for filtering out directories matching the old matcher's visitdir(). For consistency between directories and files, it also makes the filtering of files look at both old and new matcher rather than passing in a diff matcher as we did before. Differential Revision: https://phab.mercurial-scm.org/D4895

File last commit:

r40123:1d09ba0d default
r40380:2c5835b4 default
Show More
narrowdirstate.py
63 lines | 2.1 KiB | text/x-python | PythonLexer
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 # narrowdirstate.py - extensions to mercurial dirstate to support narrow clones
#
# Copyright 2017 Google, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
from mercurial.i18n import _
from mercurial import (
error,
)
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 def wrapdirstate(repo, dirstate):
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 """Add narrow spec dirstate ignore, block changes outside narrow spec."""
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 def _editfunc(fn):
def _wrapper(self, *args):
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 narrowmatch = repo.narrowmatch()
for f in args:
Martin von Zweigbergk
narrow: avoid looking up dirstate again when editing dirstate...
r39996 if f is not None and not narrowmatch(f) and f not in self:
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 raise error.Abort(_("cannot track '%s' - it is outside " +
"the narrow clone") % f)
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 return fn(self, *args)
return _wrapper
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 class narrowdirstate(dirstate.__class__):
# Prevent adding/editing/copying/deleting files that are outside the
# sparse checkout
@_editfunc
def normal(self, *args):
return super(narrowdirstate, self).normal(*args)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 @_editfunc
def add(self, *args):
return super(narrowdirstate, self).add(*args)
@_editfunc
def normallookup(self, *args):
return super(narrowdirstate, self).normallookup(*args)
@_editfunc
def copy(self, *args):
return super(narrowdirstate, self).copy(*args)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 @_editfunc
def remove(self, *args):
return super(narrowdirstate, self).remove(*args)
@_editfunc
def merge(self, *args):
return super(narrowdirstate, self).merge(*args)
def rebuild(self, parent, allfiles, changedfiles=None):
if changedfiles is None:
# Rebuilding entire dirstate, let's filter allfiles to match the
# narrowspec.
allfiles = [f for f in allfiles if repo.narrowmatch()(f)]
super(narrowdirstate, self).rebuild(parent, allfiles, changedfiles)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 dirstate.__class__ = narrowdirstate
return dirstate