[PATCH 2 of 2] phase: default to C implementation for phase computation

Laurent Charignon lcharignon at fb.com
Fri Mar 20 16:08:20 CDT 2015


# HG changeset patch
# User Laurent Charignon <lcharignon at fb.com>
# Date 1426875267 25200
#      Fri Mar 20 11:14:27 2015 -0700
# Node ID 101984a739d0f3dc9b614f209e36088a6da21b86
# Parent  1c9600e6ceab57b48827292c7b01ed9a625da1fd
phase: default to C implementation for phase computation

diff --git a/mercurial/phases.py b/mercurial/phases.py
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -172,19 +172,29 @@
         for a in 'phaseroots dirty opener _phaserevs'.split():
             setattr(self, a, getattr(phcache, a))
 
+    def getphaserevsnative(self, repo):
+        repo = repo.unfiltered()
+        nativeroots = []
+        for phase in trackedphases:
+            nativeroots.append(map(repo.changelog.rev, self.phaseroots[phase]))
+        return repo.changelog.computephases(nativeroots)
+
     def getphaserevs(self, repo):
         if self._phaserevs is None:
-            repo = repo.unfiltered()
-            revs = [public] * len(repo.changelog)
-            self._phaserevs = revs
-            self._populatephaseroots(repo)
-            for phase in trackedphases:
-                roots = map(repo.changelog.rev, self.phaseroots[phase])
-                if roots:
-                    for rev in roots:
-                        revs[rev] = phase
-                    for rev in repo.changelog.descendants(roots):
-                        revs[rev] = phase
+            try:
+                self._phaserevs = self.getphaserevsnative(repo)
+            except AttributeError:
+                repo = repo.unfiltered()
+                revs = [public] * len(repo.changelog)
+                self._phaserevs = revs
+                self._populatephaseroots(repo)
+                for phase in trackedphases:
+                    roots = map(repo.changelog.rev, self.phaseroots[phase])
+                    if roots:
+                        for rev in roots:
+                            revs[rev] = phase
+                        for rev in repo.changelog.descendants(roots):
+                            revs[rev] = phase
         return self._phaserevs
 
     def invalidate(self):
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -724,6 +724,9 @@
         except AttributeError:
             return self._headrevs()
 
+    def computephases(self, roots):
+        return self.index.computephases(roots)
+
     def _headrevs(self):
         count = len(self)
         if not count:


More information about the Mercurial-devel mailing list