narrow: use diffmatcher to send only new filelogs in non-ellipses widening
Before this patch, when we widen a non-ellipses narrow clone, we downloads all
the filelogs matching the resulting new matcher. This is same as the ellipses
case but can be improved because, we don't pull new csets in non-ellipses cases,
we can only download the new added files instead of downloading all the files
which matches the new matcher.
So, we only download files which matches the new matcher but does not matches
the old matcher. There exists a match.differencematcher() which is used here.
This will lead to significant amount of speedup in extending a non-ellipses
narrow copy on large repos because we will download and process only the new
required filelogs.
The tests changes demonstrate that we are downloading now less files.
Thanks to Augie for pointing that functionality of differencematcher exists in
core.
Differential Revision: https://phab.mercurial-scm.org/D4614
#!/usr/bin/env python
#
# mercurial - scalable distributed SCM
#
# Copyright 2005-2007 Matt Mackall <mpm@selenic.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
import os
import sys
if os.environ.get('HGUNICODEPEDANTRY', False):
try:
reload(sys)
sys.setdefaultencoding("undefined")
except NameError:
pass
libdir = '@LIBDIR@'
if libdir != '@' 'LIBDIR' '@':
if not os.path.isabs(libdir):
libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
libdir)
libdir = os.path.abspath(libdir)
sys.path.insert(0, libdir)
from hgdemandimport import tracing
with tracing.log('hg script'):
# enable importing on demand to reduce startup time
try:
if sys.version_info[0] < 3 or sys.version_info >= (3, 6):
import hgdemandimport; hgdemandimport.enable()
except ImportError:
sys.stderr.write("abort: couldn't find mercurial libraries in [%s]\n" %
' '.join(sys.path))
sys.stderr.write("(check your install and PYTHONPATH)\n")
sys.exit(-1)
from mercurial import dispatch
dispatch.run()