Rev 4631: Move the end-of-merge computation into _pop_node in http://bazaar.launchpad.net/~jameinel/bzr/1.19-known-graph-sorted
John Arbash Meinel
john at arbash-meinel.com
Mon Aug 17 16:59:30 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.19-known-graph-sorted
------------------------------------------------------------
revno: 4631
revision-id: john at arbash-meinel.com-20090817155919-4ntck1fqti5r29g1
parent: john at arbash-meinel.com-20090817153948-9p2d460l6loui7tw
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.19-known-graph-sorted
timestamp: Mon 2009-08-17 10:59:19 -0500
message:
Move the end-of-merge computation into _pop_node
This makes the final loop to pass the nodes out in reverse topological order
a fairly trivial step.
-------------- next part --------------
=== modified file 'bzrlib/_known_graph_pyx.pyx'
--- a/bzrlib/_known_graph_pyx.pyx 2009-08-16 17:22:08 +0000
+++ b/bzrlib/_known_graph_pyx.pyx 2009-08-17 15:59:19 +0000
@@ -422,6 +422,7 @@
cdef int is_first_child # Is this the first child?
cdef int seen_by_child # A child node has seen this parent
cdef int completed # Fully Processed
+ cdef object end_of_merge # True/False Is this the end of the current merge
def __init__(self):
self.merge_depth = -1
@@ -533,8 +534,8 @@
cdef _pop_node(self):
cdef PyObject *temp
- cdef _MergeSortNode ms_node, ms_parent_node
- cdef _KnownGraphNode node, parent_node
+ cdef _MergeSortNode ms_node, ms_parent_node, ms_prev_node
+ cdef _KnownGraphNode node, parent_node, prev_node
assert self._last_stack_item >= 0
node = _get_list_node(self._depth_first_stack, self._last_stack_item)
@@ -585,6 +586,23 @@
ms_node.revno_last = 1
self._revno_to_branch_count[0] = root_count
ms_node.completed = 1
+ if PyList_GET_SIZE(self._scheduled_nodes) == 0:
+ # The final node is always the end of merge
+ ms_node.end_of_merge = True
+ else:
+ prev_node = _get_list_node(self._scheduled_nodes,
+ PyList_GET_SIZE(self._scheduled_nodes) - 1)
+ ms_prev_node = <_MergeSortNode>prev_node.extra
+ if ms_prev_node.merge_depth < ms_node.merge_depth:
+ # The previously pushed node is to our left, so this is the end
+ # of this right-hand chain
+ ms_node.end_of_merge = True
+ elif (ms_prev_node.merge_depth == ms_node.merge_depth
+ and prev_node not in node.parents):
+ # The next node is not a direct parent of this node
+ ms_node.end_of_merge = True
+ else:
+ ms_node.end_of_merge = False
PyList_Append(self._scheduled_nodes, node)
cdef _schedule_stack(self):
@@ -648,8 +666,8 @@
break
cdef topo_order(self):
- cdef _MergeSortNode ms_node, ms_prev_node
- cdef _KnownGraphNode node, prev_node
+ cdef _MergeSortNode ms_node
+ cdef _KnownGraphNode node
cdef Py_ssize_t pos
# print
@@ -663,33 +681,11 @@
# representation into a Tuple representation...
sequence_number = 0
ordered = []
- pos = PyList_GET_SIZE(self._scheduled_nodes) - 1
- if pos >= 0:
- prev_node = _get_list_node(self._scheduled_nodes, pos)
- ms_prev_node = <_MergeSortNode>prev_node.extra
- while pos >= 0:
- if node is not None:
- # Clear out the extra info we don't need
- node.extra = None
- node = prev_node
- ms_node = ms_prev_node
- pos = pos - 1
- if pos == -1:
- # Final node is always the end-of-chain
- end_of_merge = True
- else:
- prev_node = _get_list_node(self._scheduled_nodes, pos)
- ms_prev_node = <_MergeSortNode>prev_node.extra
- if ms_prev_node.merge_depth < ms_node.merge_depth:
- # Next node is to our left, so this is the end of the right
- # chain
- end_of_merge = True
- elif (ms_prev_node.merge_depth == ms_node.merge_depth
- and prev_node not in node.parents):
- # The next node is not a direct parent of this node
- end_of_merge = True
- else:
- end_of_merge = False
+ # output the result in reverse order, and convert from objects into
+ # tuples...
+ for pos from PyList_GET_SIZE(self._scheduled_nodes) > pos >= 0:
+ node = _get_list_node(self._scheduled_nodes, pos)
+ ms_node = <_MergeSortNode>node.extra
if ms_node.revno_first == -1:
if ms_node.revno_second != -1:
raise ValueError('Something wrong with: %s' % (ms_node,))
@@ -698,10 +694,11 @@
revno = (ms_node.revno_first, ms_node.revno_second,
ms_node.revno_last)
PyList_Append(ordered, (sequence_number, node.key,
- ms_node.merge_depth, revno, end_of_merge))
+ ms_node.merge_depth, revno,
+ ms_node.end_of_merge))
+ # Get rid of the extra stored info
+ node.extra = None
sequence_number = sequence_number + 1
- if node is not None:
- node.extra = None
# Clear out the scheduled nodes
self._scheduled_nodes = []
return ordered
More information about the bazaar-commits
mailing list