##// END OF EJS Templates
lookup: add option to disambiguate prefix within revset...
lookup: add option to disambiguate prefix within revset When resolving a nodeid prefix that is not unique within the repo and the user has configured a revset that they want to disambiguate within, we now try to look up within that revset before we fail. If there is a unique match within the revset, we use that. This is of course most effective at allowing a short prefix if the revset contains few nodes. For most of our internal users at Google, "not public()" is sufficiently small that a hex digit or two is enough. The implementation is currently pretty slow, but good enough for small revsets (which is the expected use case). The scan in the revset is linear. We may want to use a prefix tree if we want to allow users to use a larger revset. Credit for the idea goes to Kyle Lippincott. Differential Revision: https://phab.mercurial-scm.org/D4037

File last commit:

r38872:fed6fe85 default
r38878:503f9364 default
Show More
narrowdirstate.py
94 lines | 3.5 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,
match as matchmod,
Gregory Szorc
narrowspec: move module into core...
r36178 narrowspec,
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 )
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 dirstate = repo.dirstate
narrowmatch = repo.narrowmatch()
for f in args:
if f is not None and not narrowmatch(f) and f not in dirstate:
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
def _narrowbackupname(backupname):
assert 'dirstate' in backupname
return backupname.replace('dirstate', narrowspec.FILENAME)
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 class narrowdirstate(dirstate.__class__):
def walk(self, match, subrepos, unknown, ignored, full=True,
narrowonly=True):
if narrowonly:
# hack to not exclude explicitly-specified paths so that they
# can be warned later on e.g. dirstate.add()
em = matchmod.exact(match._root, match._cwd, match.files())
nm = matchmod.unionmatcher([repo.narrowmatch(), em])
match = matchmod.intersectmatchers(match, nm)
return super(narrowdirstate, self).walk(match, subrepos, unknown,
ignored, full)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 # 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 def restorebackup(self, tr, backupname):
Martin von Zweigbergk
narrow: extract part of narrowspec backup to core...
r38872 narrowspec.restorebackup(self._opener,
_narrowbackupname(backupname))
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 super(narrowdirstate, self).restorebackup(tr, backupname)
def savebackup(self, tr, backupname):
super(narrowdirstate, self).savebackup(tr, backupname)
Martin von Zweigbergk
narrow: extract part of narrowspec backup to core...
r38872 narrowspec.savebackup(self._opener, _narrowbackupname(backupname))
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142 def clearbackup(self, tr, backupname):
super(narrowdirstate, self).clearbackup(tr, backupname)
Martin von Zweigbergk
narrow: extract part of narrowspec backup to core...
r38872 narrowspec.clearbackup(self._opener, _narrowbackupname(backupname))
Kyle Lippincott
narrow: only wrap dirstate functions once, instead of per-reposetup...
r38142
dirstate.__class__ = narrowdirstate
return dirstate