##// END OF EJS Templates
py: error out if a "skip" character was given with non-dict to util.dirs()...
py: error out if a "skip" character was given with non-dict to util.dirs() util.dirs() keeps track of the directories in its input collection. If a "skip" character is given to it, it will assume the input is a dirstate map and it will skip entries that are in the given "skip" state. I think this is used only for skipping removed entries ("r") in the dirtate. The C implementation of util.dirs() errors out if it was given a skip character and a non-dict was passed. The pure implementation simply ignored the request skip state. Let's make it easier to discover bugs here by erroring out in the pure implementation too. Let's also switch to checking for the dict-ness, to make the C implementation (since that's clearly been sufficient for many years). This last change makes test-issue660.t pass on py3 in pure mode, since the old check was for existence of iteritems(), which doesn't exist on py3. Differential Revision: https://phab.mercurial-scm.org/D6669

File last commit:

r42649:773b0222 default
r42864:b5092c23 stable
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):
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 def _wrapper(self, *args, **kwargs):
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)
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 return fn(self, *args, **kwargs)
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 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
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 def normal(self, *args, **kwargs):
return super(narrowdirstate, self).normal(*args, **kwargs)
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