narrow: rework logic to check whether we need to widen and narrow
This patch reworks logic which calculates whether we need to extend or narrow
our working copy or not.
We filter the addincludes, removeincludes, addexcludes and removeexcludes passed
from user to the actual added and removed includes and excludes. What that means
is a user can pass an already included path as addincludes, a path which is not
included as removeincludes etc. In such situations the old logic use to think we
need to do some work, whereas we don't need to do that work.
In old logic, even if we don't have anything new to include but it believes we
need to call widen, this adds some good amount of work on large repository. A
widen calls involves computing incomming csets, calling the narrow_widen() which
in non-ellipses cases goes through all the set of csets which are available
which can take ~2-3 mins on large repos. Those 2-3 minutes are spend on doing
nothing which a client can prevent by checking is there really anything which
needs to be included.
The tests changes shows that we don't go to the server anymore in such cases
which is nice.
Differential Revision: https://phab.mercurial-scm.org/D5183
--- a/hgext/narrow/narrowcommands.py Tue Oct 23 14:26:17 2018 +0300
+++ b/hgext/narrow/narrowcommands.py Tue Oct 23 16:24:04 2018 +0300
@@ -392,9 +392,21 @@
removedincludes = narrowspec.parsepatterns(opts['removeinclude'])
addedexcludes = narrowspec.parsepatterns(opts['addexclude'])
removedexcludes = narrowspec.parsepatterns(opts['removeexclude'])
+
+ only_show = not (addedincludes or removedincludes or addedexcludes or
+ removedexcludes or newrules)
+
+ oldincludes, oldexcludes = repo.narrowpats
+
+ # filter the user passed additions and deletions into actual additions and
+ # deletions of excludes and includes
+ addedincludes = set([i for i in addedincludes if i not in oldincludes])
+ removedincludes = set([i for i in removedincludes if i in oldincludes])
+ addedexcludes = set([i for i in addedexcludes if i not in oldexcludes])
+ removedexcludes = set([i for i in removedexcludes if i in oldexcludes])
+
widening = addedincludes or removedexcludes
narrowing = removedincludes or addedexcludes
- only_show = not widening and not narrowing
# Only print the current narrowspec.
if only_show:
@@ -413,6 +425,10 @@
fm.end()
return 0
+ if not widening and not narrowing:
+ ui.status(_("nothing to widen or narrow\n"))
+ return 0
+
with repo.wlock(), repo.lock():
cmdutil.bailifchanged(repo)
@@ -432,7 +448,6 @@
commoninc = discovery.findcommonincoming(repo, remote)
- oldincludes, oldexcludes = repo.narrowpats
if narrowing:
newincludes = oldincludes - removedincludes
newexcludes = oldexcludes | addedexcludes
--- a/tests/test-narrow-clone-non-narrow-server.t Tue Oct 23 14:26:17 2018 +0300
+++ b/tests/test-narrow-clone-non-narrow-server.t Tue Oct 23 16:24:04 2018 +0300
@@ -58,7 +58,11 @@
comparing with http://localhost:$HGPORT1/
searching for changes
looking for local changes to affected paths
+
$ hg tracked --addinclude f1 http://localhost:$HGPORT1/
+ nothing to widen or narrow
+
+ $ hg tracked --addinclude f9 http://localhost:$HGPORT1/
comparing with http://localhost:$HGPORT1/
abort: server does not support narrow clones
[255]
--- a/tests/test-narrow-widen-no-ellipsis.t Tue Oct 23 14:26:17 2018 +0300
+++ b/tests/test-narrow-widen-no-ellipsis.t Tue Oct 23 16:24:04 2018 +0300
@@ -144,12 +144,7 @@
wireprotocol command
$ hg tracked --addinclude widest/f
- comparing with ssh://user@dummy/master
- searching for changes
- adding changesets
- adding manifests
- adding file changes
- added 0 changesets with 0 changes to 0 files
+ nothing to widen or narrow
Pull down the newly added upstream revision.