42
43
It's up to you how to actually draw the nodes and lines (straight,
43
44
curved, kinked, etc.) and to pick the actual colours for each index.
46
assert isinstance(start_revs, list)
47
def update_root_progress(step_number):
48
"""IFF our container received a root progress bar, then update it."""
49
if root_progress is not None:
50
root_progress.update(current=step_number)
48
54
graph_children = {}
49
for (revid, parent_revids) in graph.iter_ancestry(start_revs):
50
if parent_revids is None:
53
if parent_revids == (NULL_REVISION,):
54
graph_parents[revid] = ()
56
graph_parents[revid] = parent_revids
57
for parent in parent_revids:
58
graph_children.setdefault(parent, []).append(revid)
59
graph_children.setdefault(revid, [])
61
for ghost_child in graph_children[ghost]:
62
graph_parents[ghost_child] = [p for p in graph_parents[ghost_child]
55
update_root_progress(1)
56
progress_bar = ui.ui_factory.nested_progress_bar()
58
progress_bar.update(msg="Arranging tree fragments")
59
for i, (revid, parent_revids) in enumerate(graph.iter_ancestry(start_revs)):
62
if parent_revids is None:
65
if parent_revids == (NULL_REVISION,):
66
graph_parents[revid] = ()
68
graph_parents[revid] = parent_revids
69
for parent in parent_revids:
70
graph_children.setdefault(parent, []).append(revid)
71
graph_children.setdefault(revid, [])
73
progress_bar.finished()
75
update_root_progress(2)
76
progress_bar = ui.ui_factory.nested_progress_bar()
78
progress_bar.update(msg="Removing ghosts", total=len(ghosts))
79
for i, ghost in enumerate(ghosts):
81
progress_bar.update(current=i)
82
for ghost_child in graph_children[ghost]:
83
graph_parents[ghost_child] = [p for p in graph_parents[ghost_child]
86
progress_bar.finished()
64
87
graph_parents["top:"] = start_revs
66
89
if len(graph_parents)>0:
149
181
columns = [list(empty_column)]
152
for branch_id in branch_ids:
153
branch_line = branch_lines[branch_id]
155
# Find the col_index for the direct parent branch. This will be the
156
# starting point when looking for a free column.
159
if len(branch_id) > 1:
160
parent_revno = branch_id[0:-1]
161
if parent_revno in revno_index:
162
parent_index = revno_index[parent_revno]
163
parent_node = linegraph[parent_index][1]
165
parent_col_index = parent_node[0]
168
col_search_order = _branch_line_col_search_order(columns,
170
color = reduce(lambda x, y: x+y, branch_id, 0)
174
last_rev_index = None
175
for rev_index in branch_line:
177
if broken_line_length and \
178
rev_index - last_rev_index > broken_line_length:
179
line_range.append(last_rev_index+1)
180
line_range.append(rev_index-1)
182
line_range.extend(range(last_rev_index+1, rev_index))
184
line_range.append(rev_index)
185
last_rev_index = rev_index
188
if broken_line_length and \
189
parent_index - last_rev_index > broken_line_length:
190
line_range.append(last_rev_index+1)
192
line_range.extend(range(last_rev_index+1, parent_index))
194
col_index = _find_free_column(columns,
198
node = (col_index, color)
199
for rev_index in branch_line:
200
linegraph[rev_index][1] = node
201
columns[col_index][rev_index] = True
203
for rev_index in branch_line:
208
end_of_merge) = merge_sorted_revisions[rev_index]
210
linegraph[rev_index][4] = graph_children[revid]
211
col_index = linegraph[rev_index][1][0]
213
for parent_revid in graph_parents[revid]:
214
if parent_revid in revid_index:
216
parent_index = revid_index[parent_revid]
184
update_root_progress(4)
185
progress_bar = ui.ui_factory.nested_progress_bar()
187
progress_bar.update(msg="Organizing edges", total=len(branch_ids))
188
for i, branch_id in enumerate(branch_ids):
190
progress_bar.update(current=i)
191
branch_line = branch_lines[branch_id]
193
# Find the col_index for the direct parent branch. This will be the
194
# starting point when looking for a free column.
197
if len(branch_id) > 1:
198
parent_revno = branch_id[0:-1]
199
if parent_revno in revno_index:
200
parent_index = revno_index[parent_revno]
217
201
parent_node = linegraph[parent_index][1]
219
203
parent_col_index = parent_node[0]
206
col_search_order = _branch_line_col_search_order(columns,
208
color = reduce(lambda x, y: x+y, branch_id, 0)
212
last_rev_index = None
213
for rev_index in branch_line:
215
if broken_line_length and \
216
rev_index - last_rev_index > broken_line_length:
217
line_range.append(last_rev_index+1)
218
line_range.append(rev_index-1)
221
parent_col_index = None
223
_line_col_search_order(columns,
227
# If this line is really long, break it.
228
if len(branch_id) > 0 and \
229
broken_line_length and \
230
parent_index - rev_index > broken_line_length:
231
child_line_col_index = \
232
_find_free_column(columns,
236
_mark_column_as_used(columns,
237
child_line_col_index,
240
# Recall _line_col_search_order to reset it back to
220
line_range.extend(range(last_rev_index+1, rev_index))
222
line_range.append(rev_index)
223
last_rev_index = rev_index
226
if broken_line_length and \
227
parent_index - last_rev_index > broken_line_length:
228
line_range.append(last_rev_index+1)
230
line_range.extend(range(last_rev_index+1, parent_index))
232
col_index = _find_free_column(columns,
236
node = (col_index, color)
237
for rev_index in branch_line:
238
linegraph[rev_index][1] = node
239
columns[col_index][rev_index] = True
241
for rev_index in branch_line:
246
end_of_merge) = merge_sorted_revisions[rev_index]
248
linegraph[rev_index][4] = graph_children[revid]
249
col_index = linegraph[rev_index][1][0]
251
for parent_revid in graph_parents[revid]:
252
if parent_revid in revid_index:
254
parent_index = revid_index[parent_revid]
255
parent_node = linegraph[parent_index][1]
257
parent_col_index = parent_node[0]
259
parent_col_index = None
242
260
col_search_order = \
243
261
_line_col_search_order(columns,
244
262
parent_col_index,
246
parent_col_line_index = \
247
_find_free_column(columns,
251
_mark_column_as_used(columns,
252
parent_col_line_index,
254
lines.append((rev_index,
256
(child_line_col_index,
257
parent_col_line_index)))
259
line_col_index = col_index
260
if parent_index - rev_index >1:
261
line_range = range(rev_index + 1, parent_index)
263
_find_free_column(columns,
267
_mark_column_as_used(columns,
270
lines.append((rev_index,
265
# If this line is really long, break it.
266
if len(branch_id) > 0 and \
267
broken_line_length and \
268
parent_index - rev_index > broken_line_length:
269
child_line_col_index = \
270
_find_free_column(columns,
274
_mark_column_as_used(columns,
275
child_line_col_index,
278
# Recall _line_col_search_order to reset it back to
281
_line_col_search_order(columns,
284
parent_col_line_index = \
285
_find_free_column(columns,
289
_mark_column_as_used(columns,
290
parent_col_line_index,
292
lines.append((rev_index,
294
(child_line_col_index,
295
parent_col_line_index)))
297
line_col_index = col_index
298
if parent_index - rev_index >1:
299
line_range = range(rev_index + 1, parent_index)
301
_find_free_column(columns,
305
_mark_column_as_used(columns,
308
lines.append((rev_index,
312
progress_bar.finished()
274
for (child_index, parent_index, line_col_indexes) in lines:
275
(child_col_index, child_color) = linegraph[child_index][1]
276
(parent_col_index, parent_color) = linegraph[parent_index][1]
278
if len(line_col_indexes) == 1:
279
if parent_index - child_index == 1:
280
linegraph[child_index][2].append(
314
update_root_progress(5)
315
progress_bar = ui.ui_factory.nested_progress_bar()
317
progress_bar.update(msg="Pretifying graph", total=len(lines))
318
for i, (child_index, parent_index, line_col_indexes) in enumerate(lines):
320
progress_bar.update(current=i)
321
(child_col_index, child_color) = linegraph[child_index][1]
322
(parent_col_index, parent_color) = linegraph[parent_index][1]
324
if len(line_col_indexes) == 1:
325
if parent_index - child_index == 1:
326
linegraph[child_index][2].append(
331
# line from the child's column to the lines column
332
linegraph[child_index][2].append(
336
# lines down the line's column
337
for line_part_index in range(child_index+1, parent_index-1):
338
linegraph[line_part_index][2].append(
339
(line_col_indexes[0],
342
# line from the line's column to the parent's column
343
linegraph[parent_index-1][2].append(
344
(line_col_indexes[0],
285
349
# line from the child's column to the lines column
286
350
linegraph[child_index][2].append(
287
351
(child_col_index,
288
352
line_col_indexes[0],
290
# lines down the line's column
291
for line_part_index in range(child_index+1, parent_index-1):
292
linegraph[line_part_index][2].append(
293
(line_col_indexes[0],
355
linegraph[child_index+1][2].append(
356
(line_col_indexes[0],
361
linegraph[parent_index-2][2].append(
296
365
# line from the line's column to the parent's column
297
366
linegraph[parent_index-1][2].append(
298
(line_col_indexes[0],
367
(line_col_indexes[1],
299
368
parent_col_index,
303
# line from the child's column to the lines column
304
linegraph[child_index][2].append(
309
linegraph[child_index+1][2].append(
310
(line_col_indexes[0],
315
linegraph[parent_index-2][2].append(
319
# line from the line's column to the parent's column
320
linegraph[parent_index-1][2].append(
321
(line_col_indexes[1],
371
progress_bar.finished()
324
372
return (linegraph, revid_index, len(columns))
326
374
return (linegraph, revid_index, 0)