104
revno_index[revno_sequence] = rev_index
106
branch_id = revno_sequence[0:-1]
109
if branch_id not in branch_lines:
111
branch_lines[branch_id] = branch_line
113
branch_line = branch_lines[branch_id]
115
branch_line.append(rev_index)
108
branch_ids = branch_lines.keys()
110
def branch_id_cmp(x, y):
111
"""Compaire branch_id's first by the number of digits, then reversed
117
return cmp(len_x, len_y)
119
branch_ids.sort(branch_id_cmp)
120
# This will hold a tuple of (child_index, parent_index, col_index) for each
121
# line that needs to be drawn. If col_index is not none, then the line is
122
# drawn along that column, else the the line can be drawn directly between
123
# the child and parent because either the child and parent are in the same
124
# branch line, or the child and parent are 1 row apart.
126
empty_column = [False for i in range(len(graph_parents))]
127
# This will hold a bit map for each cell. If the cell is true, then the
128
# cell allready contains a node or line. This use when deciding what column
129
# to place a branch line or line in, without it overlaping something else.
130
columns = [list(empty_column)]
133
for branch_id in branch_ids:
134
branch_line = branch_lines[branch_id]
136
# Find the col_index for the direct parent branch. This will be the
137
# starting point when looking for a free column.
140
if len(branch_id) > 1:
141
parent_revno = branch_id[0:-1]
142
if parent_revno in revno_index:
143
parent_index = revno_index[parent_revno]
144
parent_node = linegraph[parent_index][1]
146
parent_col_index = parent_node[0]
149
col_search_order = _branch_line_col_search_order(columns,
151
color = reduce(lambda x, y: x+y, branch_id, 0)
155
last_rev_index = None
156
for rev_index in branch_line:
158
if BROKEN_LINE_LENGTH and \
159
rev_index - last_rev_index > BROKEN_LINE_LENGTH:
160
line_range.append(last_rev_index+1)
161
line_range.append(rev_index-1)
163
line_range.extend(range(last_rev_index+1, rev_index))
165
line_range.append(rev_index)
166
last_rev_index = rev_index
169
if BROKEN_LINE_LENGTH and \
170
parent_index - last_rev_index > BROKEN_LINE_LENGTH:
171
line_range.append(last_rev_index+1)
173
line_range.extend(range(last_rev_index+1, parent_index))
175
col_index = _find_free_column(columns,
179
node = (col_index, color)
180
for rev_index in branch_line:
181
linegraph[rev_index][1] = node
182
columns[col_index][rev_index] = True
184
for rev_index in branch_line:
189
end_of_merge) = merge_sorted_revisions[rev_index]
191
linegraph[rev_index][4] = graph_children[revid]
192
col_index = linegraph[rev_index][1][0]
194
for parent_revid in graph_parents[revid]:
195
if parent_revid in revid_index:
197
parent_index = revid_index[parent_revid]
118
branch_ids = branch_lines.keys()
120
def branch_id_cmp(x, y):
121
"""Compaire branch_id's first by the number of digits, then reversed
127
return cmp(len_x, len_y)
129
branch_ids.sort(branch_id_cmp)
130
# This will hold a tuple of (child_index, parent_index, col_index) for each
131
# line that needs to be drawn. If col_index is not none, then the line is
132
# drawn along that column, else the the line can be drawn directly between
133
# the child and parent because either the child and parent are in the same
134
# branch line, or the child and parent are 1 row apart.
136
empty_column = [False for i in range(len(graph_parents))]
137
# This will hold a bit map for each cell. If the cell is true, then the
138
# cell allready contains a node or line. This use when deciding what column
139
# to place a branch line or line in, without it overlaping something else.
140
columns = [list(empty_column)]
143
for branch_id in branch_ids:
144
branch_line = branch_lines[branch_id]
146
# Find the col_index for the direct parent branch. This will be the
147
# starting point when looking for a free column.
150
if len(branch_id) > 1:
151
parent_revno = branch_id[0:-1]
152
if parent_revno in revno_index:
153
parent_index = revno_index[parent_revno]
198
154
parent_node = linegraph[parent_index][1]
200
156
parent_col_index = parent_node[0]
159
col_search_order = _branch_line_col_search_order(columns,
161
color = reduce(lambda x, y: x+y, branch_id, 0)
165
last_rev_index = None
166
for rev_index in branch_line:
168
if broken_line_length and \
169
rev_index - last_rev_index > broken_line_length:
170
line_range.append(last_rev_index+1)
171
line_range.append(rev_index-1)
202
parent_col_index = None
204
_line_col_search_order(columns,
208
# If this line is really long, break it.
209
if len(branch_id) > 0 and \
210
BROKEN_LINE_LENGTH and \
211
parent_index - rev_index > BROKEN_LINE_LENGTH:
212
child_line_col_index = \
213
_find_free_column(columns,
217
_mark_column_as_used(columns,
218
child_line_col_index,
221
# Recall _line_col_search_order to reset it back to
173
line_range.extend(range(last_rev_index+1, rev_index))
175
line_range.append(rev_index)
176
last_rev_index = rev_index
179
if broken_line_length and \
180
parent_index - last_rev_index > broken_line_length:
181
line_range.append(last_rev_index+1)
183
line_range.extend(range(last_rev_index+1, parent_index))
185
col_index = _find_free_column(columns,
189
node = (col_index, color)
190
for rev_index in branch_line:
191
linegraph[rev_index][1] = node
192
columns[col_index][rev_index] = True
194
for rev_index in branch_line:
199
end_of_merge) = merge_sorted_revisions[rev_index]
201
linegraph[rev_index][4] = graph_children[revid]
202
col_index = linegraph[rev_index][1][0]
204
for parent_revid in graph_parents[revid]:
205
if parent_revid in revid_index:
207
parent_index = revid_index[parent_revid]
208
parent_node = linegraph[parent_index][1]
210
parent_col_index = parent_node[0]
212
parent_col_index = None
223
213
col_search_order = \
224
214
_line_col_search_order(columns,
225
215
parent_col_index,
227
parent_col_line_index = \
228
_find_free_column(columns,
232
_mark_column_as_used(columns,
233
parent_col_line_index,
235
lines.append((rev_index,
237
(child_line_col_index,
238
parent_col_line_index)))
240
line_col_index = col_index
241
if parent_index - rev_index >1:
242
line_range = range(rev_index + 1, parent_index)
244
_find_free_column(columns,
248
_mark_column_as_used(columns,
251
lines.append((rev_index,
255
for (child_index, parent_index, line_col_indexes) in lines:
256
(child_col_index, child_color) = linegraph[child_index][1]
257
(parent_col_index, parent_color) = linegraph[parent_index][1]
218
# If this line is really long, break it.
219
if len(branch_id) > 0 and \
220
broken_line_length and \
221
parent_index - rev_index > broken_line_length:
222
child_line_col_index = \
223
_find_free_column(columns,
227
_mark_column_as_used(columns,
228
child_line_col_index,
231
# Recall _line_col_search_order to reset it back to
234
_line_col_search_order(columns,
237
parent_col_line_index = \
238
_find_free_column(columns,
242
_mark_column_as_used(columns,
243
parent_col_line_index,
245
lines.append((rev_index,
247
(child_line_col_index,
248
parent_col_line_index)))
250
line_col_index = col_index
251
if parent_index - rev_index >1:
252
line_range = range(rev_index + 1, parent_index)
254
_find_free_column(columns,
258
_mark_column_as_used(columns,
261
lines.append((rev_index,
259
if len(line_col_indexes) == 1:
260
if parent_index - child_index == 1:
261
linegraph[child_index][2].append(
265
for (child_index, parent_index, line_col_indexes) in lines:
266
(child_col_index, child_color) = linegraph[child_index][1]
267
(parent_col_index, parent_color) = linegraph[parent_index][1]
269
if len(line_col_indexes) == 1:
270
if parent_index - child_index == 1:
271
linegraph[child_index][2].append(
276
# line from the child's column to the lines column
277
linegraph[child_index][2].append(
281
# lines down the line's column
282
for line_part_index in range(child_index+1, parent_index-1):
283
linegraph[line_part_index][2].append(
284
(line_col_indexes[0],
287
# line from the line's column to the parent's column
288
linegraph[parent_index-1][2].append(
289
(line_col_indexes[0],
266
294
# line from the child's column to the lines column
267
295
linegraph[child_index][2].append(
268
296
(child_col_index,
269
297
line_col_indexes[0],
271
# lines down the line's column
272
for line_part_index in range(child_index+1, parent_index-1):
273
linegraph[line_part_index][2].append(
274
(line_col_indexes[0],
300
linegraph[child_index+1][2].append(
301
(line_col_indexes[0],
306
linegraph[parent_index-2][2].append(
277
310
# line from the line's column to the parent's column
278
311
linegraph[parent_index-1][2].append(
279
(line_col_indexes[0],
312
(line_col_indexes[1],
280
313
parent_col_index,
284
# line from the child's column to the lines column
285
linegraph[child_index][2].append(
290
linegraph[child_index+1][2].append(
291
(line_col_indexes[0],
296
linegraph[parent_index-2][2].append(
300
# line from the line's column to the parent's column
301
linegraph[parent_index-1][2].append(
302
(line_col_indexes[1],
315
return (linegraph, revid_index, len(columns))
317
return (linegraph, revid_index, 0)
307
return (linegraph, revid_index, len(columns))
309
320
def _branch_line_col_search_order(columns, parent_col_index):
310
321
for col_index in range(parent_col_index, len(columns)):