diff mercurial/match.py @ 41528:b7a0efb3c370

match: teach diffmatcher.visitdir() to return 'all' if possible This patch teaches differencematcher.visitdir() to return 'all' when m1.visitdir() returns 'all' and m2 does not matches. Before this patch, from a differencematcher.visitdir(), we always returned either True or False. We never returned 'all' even when we can. This causes problem when m1 and m2 of a differencematcher are themselves differencematcher. In that case, we try to check: `if self._m2_.visitdir(dir) == 'all'` which will never be 'all' even though it can be. This leads to iterating over a lot of sub-directory manifest, even though we don't want to while extending a narrow clone. I am yet to measure the impact of this but calculating manifest was taking ~50-60 seconds, so this should definitely save some of time there. Differential Revision: https://phab.mercurial-scm.org/D5814
author Pulkit Goyal <pulkit@yandex-team.ru>
date Mon, 04 Feb 2019 18:14:03 +0300
parents 4fab8a7d2d72
children 635a12c53ea6
line wrap: on
line diff
--- a/mercurial/match.py	Sun Feb 03 10:01:43 2019 +0100
+++ b/mercurial/match.py	Mon Feb 04 18:14:03 2019 +0300
@@ -677,6 +677,9 @@
     def visitdir(self, dir):
         if self._m2.visitdir(dir) == 'all':
             return False
+        elif not self._m2.visitdir(dir):
+            # m2 does not match dir, we can return 'all' here if possible
+            return self._m1.visitdir(dir)
         return bool(self._m1.visitdir(dir))
 
     def visitchildrenset(self, dir):