Mercurial > hg
view hgext/narrow/narrowtemplates.py @ 38717:aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
The meaning of the new 'sparse-revlog' requirement is that the revlogs are
allowed to contain wider delta chains with larger holes between the interesting
chunks. These sparse delta chains should be read in several chunks to avoid a
potential explosion of memory usage.
Former version won't know how to read a delta chain in several chunks. They
would keep reading them in a single read, and therefore would be subject to the
potential memory explosion. Hence this new requirement: only versions having
support of sparse-revlog reading should be allowed to read such a revlog.
Implementation of this new algorithm and tools to enable or disable the
requirement will follow in the next changesets.
author | Paul Morelle <paul.morelle@octobus.net> |
---|---|
date | Mon, 04 Jun 2018 22:23:18 +0200 |
parents | 7b74afec6772 |
children | 05ded838c997 |
line wrap: on
line source
# narrowtemplates.py - added template keywords for 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 import ( registrar, revlog, ) keywords = {} templatekeyword = registrar.templatekeyword(keywords) revsetpredicate = registrar.revsetpredicate() def _isellipsis(repo, rev): if repo.changelog.flags(rev) & revlog.REVIDX_ELLIPSIS: return True return False @templatekeyword('ellipsis', requires={'repo', 'ctx'}) def ellipsis(context, mapping): """String. 'ellipsis' if the change is an ellipsis node, else ''.""" repo = context.resource(mapping, 'repo') ctx = context.resource(mapping, 'ctx') if _isellipsis(repo, ctx.rev()): return 'ellipsis' return '' @templatekeyword('outsidenarrow', requires={'repo', 'ctx'}) def outsidenarrow(context, mapping): """String. 'outsidenarrow' if the change affects no tracked files, else ''.""" repo = context.resource(mapping, 'repo') ctx = context.resource(mapping, 'ctx') m = repo.narrowmatch() if not m.always(): if not any(m(f) for f in ctx.files()): return 'outsidenarrow' return '' @revsetpredicate('ellipsis') def ellipsisrevset(repo, subset, x): """Changesets that are ellipsis nodes.""" return subset.filter(lambda r: _isellipsis(repo, r))