diff --git a/mercurial/phases.py b/mercurial/phases.py
index 52dc2b33d0bea1e249e0fa2fa70fae60d41d87ff_bWVyY3VyaWFsL3BoYXNlcy5weQ==..b345f851d05621575052a8352fc50724616f59e8_bWVyY3VyaWFsL3BoYXNlcy5weQ== 100644
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -285,8 +285,6 @@
             repo.ui.warn(_('ignoring unexpected root from remote: %i %s\n')
                          % (phase, nhex))
     # compute heads
-    revset = repo.set('heads((%ln + parents(%ln)) - (%ln::%ln))',
-                      subset, draftroots, draftroots, subset)
-    publicheads = [c.node() for c in revset]
+    publicheads = newheads(repo, subset, draftroots)
     return publicheads, draftroots
 
@@ -291,2 +289,11 @@
     return publicheads, draftroots
 
+def newheads(repo, heads, roots):
+    """compute new head of a subset minus another
+
+    * `heads`: define the first subset
+    * `rroots`: define the second we substract to the first"""
+    revset = repo.set('heads((%ln + parents(%ln)) - (%ln::%ln))',
+                      heads, roots, roots, heads)
+    return [c.node() for c in revset]
+