narrow: build the known set of nodes only when ellipses is enabled
We don't need to build the known set in non-ellipses case because we don't have
a shallow repo. In this patch, this checks whether the server has ellipses
enabled or not using the server capability and then build the known set of
nodes.
Building the known set of nodes can take ~3-4 minutes on repositories with
millions of csets so this patch speeds up extending a non-shallow narrow clone
on large repositories.
In future, we should first check whether local repository is an ellipses repo
using a new ellipses repo requirement and then control all the combinations
between local repo requirement and server capability.
Differential Revision: https://phab.mercurial-scm.org/D4520
--- a/hgext/narrow/narrowcommands.py Mon Sep 10 15:55:14 2018 +0300
+++ b/hgext/narrow/narrowcommands.py Mon Sep 10 16:29:22 2018 +0300
@@ -180,14 +180,17 @@
kwargs['oldexcludepats'] = exclude
kwargs['includepats'] = include
kwargs['excludepats'] = exclude
- kwargs['known'] = [node.hex(ctx.node()) for ctx in
- repo.set('::%ln', pullop.common)
- if ctx.node() != node.nullid]
- if not kwargs['known']:
- # Mercurial serialized an empty list as '' and deserializes it as
- # [''], so delete it instead to avoid handling the empty string on the
- # server.
- del kwargs['known']
+ # calculate known nodes only in ellipses cases because in non-ellipses cases
+ # we have all the nodes
+ if narrowbundle2.ELLIPSESCAP in pullop.remote.capabilities():
+ kwargs['known'] = [node.hex(ctx.node()) for ctx in
+ repo.set('::%ln', pullop.common)
+ if ctx.node() != node.nullid]
+ if not kwargs['known']:
+ # Mercurial serializes an empty list as '' and deserializes it as
+ # [''], so delete it instead to avoid handling the empty string on
+ # the server.
+ del kwargs['known']
extensions.wrapfunction(exchange,'_pullbundle2extraprepare',
pullbundle2extraprepare)