Skip to content
Snippets Groups Projects
Commit adcd5bcb37ab authored by Benoit Boissinot's avatar Benoit Boissinot
Browse files

shrink-revlog: factor out postorder algorithm

parent 3fc95c3bc3ba
No related branches found
No related tags found
No related merge requests found
......@@ -25,6 +25,23 @@
from mercurial.i18n import _
def postorder(start, edges):
result = []
visit = list(start)
finished = set()
while visit:
cur = visit[-1]
for p in edges[cur]:
if p not in finished:
visit.append(p)
break
else:
result.append(cur)
finished.add(cur)
visit.pop()
return result
def toposort_reversepostorder(ui, rl):
# postorder of the reverse directed graph
......@@ -43,5 +60,4 @@
parents[rev] = (p1,) # normal node
else:
parents[rev] = (p2, p1) # merge node
heads.add(rev)
......@@ -47,7 +63,6 @@
heads.add(rev)
for p in parents[rev]:
heads.discard(p)
finally:
ui.progress(_('reading'), None, total=len(rl))
......@@ -49,11 +64,8 @@
for p in parents[rev]:
heads.discard(p)
finally:
ui.progress(_('reading'), None, total=len(rl))
ui.status(_('sorting revs\n'))
result = []
visit = list(heads)
visit.sort(reverse=True)
finished = set()
heads = list(heads)
heads.sort(reverse=True)
......@@ -59,16 +71,6 @@
while visit:
cur = visit[-1]
for p in parents[cur]:
if p not in finished:
visit.append(p)
break
else:
result.append(cur)
finished.add(cur)
visit.pop()
return result
ui.status(_('sorting revs\n'))
return postorder(heads, parents)
def toposort_postorderreverse(ui, rl):
# reverse-postorder of the reverse directed graph
......@@ -82,5 +84,4 @@
(p1, p2) = rl.parentrevs(rev)
if p1 == p2 == node.nullrev:
roots.add(rev)
children[rev] = []
......@@ -86,5 +87,4 @@
children[rev] = []
if p1 != node.nullrev:
children[p1].append(rev)
if p2 != node.nullrev:
......@@ -92,9 +92,6 @@
finally:
ui.progress(_('reading'), None, total=len(rl))
ui.status(_('sorting revs\n'))
result = []
visit = list(roots)
visit.sort()
finished = set()
root = list(roots)
roots.sort()
......@@ -100,15 +97,6 @@
while visit:
cur = visit[-1]
for p in children[cur]:
if p not in finished:
visit.append(p)
break
else:
result.append(cur)
finished.add(cur)
visit.pop()
ui.status(_('sorting revs\n'))
result = postorder(roots, children)
result.reverse()
return result
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment