treemanifest: stop storing full path for each item in manifest._lazydirs
This information is obtainable, if needed, based on the lazydirs key (which is
the entry name) and the manifest's `dir()` method.
### Performance
This is actually both a memory and a performance improvement, but it's likely to
be a very small one in most situations. In the pathological repo I've been using
for testing other performance work I've done recently, this reduced the time for
a rebase operation (rebasing two commits across a public-phase change that
touches a sibling of one of my tracked directories where the common parent is
massive (>>10k entries)):
#### Before
```
Time (mean ± σ): 4.059 s ± 0.121 s [User: 0.9 ms, System: 0.6 ms]
Range (min … max): 3.941 s … 4.352 s 10 runs
```
#### After
```
Time (mean ± σ): 3.707 s ± 0.060 s [User: 0.8 ms, System: 0.8 ms]
Range (min … max): 3.648 s … 3.818 s 10 runs
```
Differential Revision: https://phab.mercurial-scm.org/D9553
# pullext.py - Simple extension to test pulling
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# 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 (
commands,
error,
extensions,
localrepo,
requirements,
)
def clonecommand(orig, ui, repo, *args, **kwargs):
if kwargs.get('include') or kwargs.get('exclude'):
kwargs['narrow'] = True
if kwargs.get('depth'):
try:
kwargs['depth'] = int(kwargs['depth'])
except ValueError:
raise error.Abort(_('--depth must be an integer'))
return orig(ui, repo, *args, **kwargs)
def featuresetup(ui, features):
features.add(requirements.NARROW_REQUIREMENT)
def extsetup(ui):
entry = extensions.wrapcommand(commands.table, b'clone', clonecommand)
hasinclude = any(x[1] == b'include' for x in entry[1])
hasdepth = any(x[1] == b'depth' for x in entry[1])
if not hasinclude:
entry[1].append(
(b'', b'include', [], _(b'pattern of file/directory to clone'))
)
entry[1].append(
(b'', b'exclude', [], _(b'pattern of file/directory to not clone'))
)
if not hasdepth:
entry[1].append(
(b'', b'depth', b'', _(b'ancestry depth of changesets to fetch'))
)
localrepo.featuresetupfuncs.add(featuresetup)