diff --git a/contrib/shrink-revlog.py b/contrib/shrink-revlog.py
index 3fc95c3bc3ba875f21c250ca9a0b2b5586eb8d96_Y29udHJpYi9zaHJpbmstcmV2bG9nLnB5..adcd5bcb37abed7fe3081801146206e12d9d0dc2_Y29udHJpYi9zaHJpbmstcmV2bG9nLnB5 100644
--- a/contrib/shrink-revlog.py
+++ b/contrib/shrink-revlog.py
@@ -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