narrowdirstate.py
76 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
Augie Fackler
|
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 _ | ||||
Augie Fackler
|
r43346 | from mercurial import error | ||
Augie Fackler
|
r36096 | |||
Kyle Lippincott
|
r38142 | def wrapdirstate(repo, dirstate): | ||
Augie Fackler
|
r36096 | """Add narrow spec dirstate ignore, block changes outside narrow spec.""" | ||
Kyle Lippincott
|
r38142 | def _editfunc(fn): | ||
Valentin Gatien-Baron
|
r42656 | def _wrapper(self, *args, **kwargs): | ||
Augie Fackler
|
r36096 | narrowmatch = repo.narrowmatch() | ||
for f in args: | ||||
Martin von Zweigbergk
|
r39996 | if f is not None and not narrowmatch(f) and f not in self: | ||
Augie Fackler
|
r43346 | raise error.Abort( | ||
_( | ||||
Augie Fackler
|
r43347 | b"cannot track '%s' - it is outside " | ||
+ b"the narrow clone" | ||||
Augie Fackler
|
r43346 | ) | ||
% f | ||||
) | ||||
Valentin Gatien-Baron
|
r42656 | return fn(self, *args, **kwargs) | ||
Augie Fackler
|
r43346 | |||
Kyle Lippincott
|
r38142 | return _wrapper | ||
Augie Fackler
|
r36096 | |||
Kyle Lippincott
|
r38142 | class narrowdirstate(dirstate.__class__): | ||
# Prevent adding/editing/copying/deleting files that are outside the | ||||
# sparse checkout | ||||
@_editfunc | ||||
Valentin Gatien-Baron
|
r42656 | def normal(self, *args, **kwargs): | ||
return super(narrowdirstate, self).normal(*args, **kwargs) | ||||
Augie Fackler
|
r36096 | |||
Kyle Lippincott
|
r38142 | @_editfunc | ||
r48393 | def set_tracked(self, *args): | |||
return super(narrowdirstate, self).set_tracked(*args) | ||||
@_editfunc | ||||
r48399 | def set_untracked(self, *args): | |||
return super(narrowdirstate, self).set_untracked(*args) | ||||
@_editfunc | ||||
Kyle Lippincott
|
r38142 | 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
|
r36096 | |||
Kyle Lippincott
|
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
|
r36096 | |||
Kyle Lippincott
|
r38142 | dirstate.__class__ = narrowdirstate | ||
return dirstate | ||||