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