diff --git a/hgext3rd/clindex.pyx b/hgext3rd/clindex.pyx --- a/hgext3rd/clindex.pyx +++ b/hgext3rd/clindex.pyx @@ -12,6 +12,7 @@ [clindex] # Use Rust childmap. + # It's currently used to speed up phases calculation. childmap = True # Use Rust nodemap @@ -105,7 +106,42 @@ return self._origindex[rev] def computephasesmapsets(self, roots): - return self._origindex.computephasesmapsets(roots) + if not self._config.childmap: + return self._origindex.computephasesmapsets(roots) + # using childmap + drafts = self._descendants(roots[0]) + secrets = self._descendants(roots[1]) + drafts -= secrets + sets = [None, drafts, secrets] + if self._config.verify: + origlen, origsets = self._origindex.computephasesmapsets(roots) + for phase in (1, 2): + origset = origsets[phase] + thisset = sets[phase] + added = thisset - origset + removed = origset - thisset + if added or removed: + _logandraise( + self._vfs, + 'phases: inconsistent result(%s):\n added %r' + '\n removed %r' % (phase, added, removed)) + return len(self), sets + + cpdef _descendants(self, rootrevs): + assert self._config.childmap + queue = rootrevs[:] + revs = set() + while queue: + rev = queue.pop() + if rev in revs: + continue + revs.add(rev) + queue.extend(self._children(rev)) + return revs + + cpdef _children(self, int rev): + assert self._config.childmap + return self._childmap[rev] def reachableroots2(self, int minroot, heads, roots, includepath): return self._origindex.reachableroots2(minroot, heads, roots,