Mercurial > hg
view hgext/narrow/narrowdirstate.py @ 48134:3c7db97ce541
dirstate-item: implement `drop_merge_data` on the Rust DirstateItem
It was currently missing and we want to be able to use in it the Rust case too.
Differential Revision: https://phab.mercurial-scm.org/D11579
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sat, 02 Oct 2021 00:14:32 +0200 |
parents | cce51119bfe6 |
children | f5dea753fe4e |
line wrap: on
line source
# 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 def wrapdirstate(repo, dirstate): """Add narrow spec dirstate ignore, block changes outside narrow spec.""" def _editfunc(fn): def _wrapper(self, *args, **kwargs): narrowmatch = repo.narrowmatch() for f in args: if f is not None and not narrowmatch(f) and f not in self: raise error.Abort( _( b"cannot track '%s' - it is outside " + b"the narrow clone" ) % f ) return fn(self, *args, **kwargs) return _wrapper class narrowdirstate(dirstate.__class__): # Prevent adding/editing/copying/deleting files that are outside the # sparse checkout @_editfunc def normal(self, *args, **kwargs): return super(narrowdirstate, self).normal(*args, **kwargs) @_editfunc def set_tracked(self, *args): return super(narrowdirstate, self).set_tracked(*args) @_editfunc def set_untracked(self, *args): return super(narrowdirstate, self).set_untracked(*args) @_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) @_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) dirstate.__class__ = narrowdirstate return dirstate