mercurial/phases.py
changeset 51580 b70628a9aa7e
parent 51579 87655e6dc108
child 51581 e0194b3ea312
--- a/mercurial/phases.py	Mon Apr 08 15:11:49 2024 +0200
+++ b/mercurial/phases.py	Fri Apr 05 11:33:47 2024 +0200
@@ -109,6 +109,7 @@
 from typing import (
     Any,
     Callable,
+    Collection,
     Dict,
     Iterable,
     List,
@@ -127,7 +128,6 @@
 )
 from . import (
     error,
-    pycompat,
     requirements,
     smartset,
     txnutil,
@@ -1125,9 +1125,11 @@
             msg = _(b'ignoring unexpected root from remote: %i %s\n')
             repo.ui.warn(msg % (phase, nhex))
     # compute heads
+    subset_revs = [to_rev(n) for n in subset]
+    public_heads = new_heads(repo, subset_revs, draft_roots)
     draft_nodes = [to_node(r) for r in draft_roots]
-    publicheads = newheads(repo, subset, draft_nodes)
-    return publicheads, draft_nodes
+    public_nodes = [to_node(r) for r in public_heads]
+    return public_nodes, draft_nodes
 
 
 class remotephasessummary:
@@ -1152,7 +1154,11 @@
         self.draftheads = [c.node() for c in dheads]
 
 
-def newheads(repo, heads, roots):
+def new_heads(
+    repo,
+    heads: Collection[int],
+    roots: Collection[int],
+) -> Collection[int]:
     """compute new head of a subset minus another
 
     * `heads`: define the first subset
@@ -1161,16 +1167,15 @@
     # phases > dagop > patch > copies > scmutil > obsolete > obsutil > phases
     from . import dagop
 
-    repo = repo.unfiltered()
-    cl = repo.changelog
-    rev = cl.index.get_rev
     if not roots:
         return heads
-    if not heads or heads == [repo.nullid]:
+    if not heads or heads == [nullrev]:
         return []
     # The logic operated on revisions, convert arguments early for convenience
-    new_heads = {rev(n) for n in heads if n != repo.nullid}
-    roots = [rev(n) for n in roots]
+    # PERF-XXX: maybe heads could directly comes as a set without impacting
+    # other user of that value
+    new_heads = set(heads)
+    new_heads.discard(nullrev)
     # compute the area we need to remove
     affected_zone = repo.revs(b"(%ld::%ld)", roots, new_heads)
     # heads in the area are no longer heads
@@ -1188,7 +1193,9 @@
         pruned = dagop.reachableroots(repo, candidates, prunestart)
         new_heads.difference_update(pruned)
 
-    return pycompat.maplist(cl.node, sorted(new_heads))
+    # PERF-XXX: do we actually need a sorted list here? Could we simply return
+    # a set?
+    return sorted(new_heads)
 
 
 def newcommitphase(ui: "uimod.ui") -> int: