45
43
It's up to you how to actually draw the nodes and lines (straight,
46
44
curved, kinked, etc.) and to pick the actual colours for each index.
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)
49
52
graph = repository.get_graph()
52
55
graph_children = {}
53
root_progress.update(current=1)
54
progress_bar = ui.ui_factory.nested_progress_bar()
55
progress_bar.update(msg="Arranging tree fragments")
56
for i, (revid, parent_revids) in enumerate(graph.iter_ancestry(start_revs)):
60
if parent_revids is None:
63
if parent_revids == (NULL_REVISION,):
64
graph_parents[revid] = ()
66
graph_parents[revid] = parent_revids
67
for parent in parent_revids:
68
graph_children.setdefault(parent, []).append(revid)
69
graph_children[revid] = []
70
progress_bar.finished()
72
root_progress.update(current=2)
73
progress_bar = ui.ui_factory.nested_progress_bar()
74
progress_bar.update(msg="Removing ghosts", total=len(ghosts))
75
for i, ghost in enumerate(ghosts):
77
progress_bar.update(current=i)
78
for ghost_child in graph_children[ghost]:
79
graph_parents[ghost_child] = [p for p in graph_parents[ghost_child]
81
progress_bar.finished()
56
update_root_progress(1)
57
progress_bar = ui.ui_factory.nested_progress_bar()
59
progress_bar.update(msg="Arranging tree fragments")
60
for i, (revid, parent_revids) in enumerate(graph.iter_ancestry(start_revs)):
64
if parent_revids is None:
67
if parent_revids == (NULL_REVISION,):
68
graph_parents[revid] = ()
70
graph_parents[revid] = parent_revids
71
for parent in parent_revids:
72
graph_children.setdefault(parent, []).append(revid)
73
graph_children[revid] = []
75
progress_bar.finished()
77
update_root_progress(2)
78
progress_bar = ui.ui_factory.nested_progress_bar()
80
progress_bar.update(msg="Removing ghosts", total=len(ghosts))
81
for i, ghost in enumerate(ghosts):
83
progress_bar.update(current=i)
84
for ghost_child in graph_children[ghost]:
85
graph_parents[ghost_child] = [p for p in graph_parents[ghost_child]
88
progress_bar.finished()
82
89
graph_parents["top:"] = start_revs
84
91
if len(graph_parents)>0:
174
183
columns = [list(empty_column)]
177
root_progress.update(current=4)
186
update_root_progress(4)
178
187
progress_bar = ui.ui_factory.nested_progress_bar()
179
progress_bar.update(msg="Organizing edges", total=len(branch_ids))
180
for i, branch_id in enumerate(branch_ids):
182
progress_bar.update(current=i)
183
branch_line = branch_lines[branch_id]
185
# Find the col_index for the direct parent branch. This will be the
186
# starting point when looking for a free column.
189
if len(branch_id) > 1:
190
parent_revno = branch_id[0:-1]
191
if parent_revno in revno_index:
192
parent_index = revno_index[parent_revno]
193
parent_node = linegraph[parent_index][1]
195
parent_col_index = parent_node[0]
198
col_search_order = _branch_line_col_search_order(columns,
200
color = reduce(lambda x, y: x+y, branch_id, 0)
204
last_rev_index = None
205
for rev_index in branch_line:
207
if broken_line_length and \
208
rev_index - last_rev_index > broken_line_length:
209
line_range.append(last_rev_index+1)
210
line_range.append(rev_index-1)
212
line_range.extend(range(last_rev_index+1, rev_index))
214
line_range.append(rev_index)
215
last_rev_index = rev_index
218
if broken_line_length and \
219
parent_index - last_rev_index > broken_line_length:
220
line_range.append(last_rev_index+1)
222
line_range.extend(range(last_rev_index+1, parent_index))
224
col_index = _find_free_column(columns,
228
node = (col_index, color)
229
for rev_index in branch_line:
230
linegraph[rev_index][1] = node
231
columns[col_index][rev_index] = True
233
for rev_index in branch_line:
238
end_of_merge) = merge_sorted_revisions[rev_index]
240
linegraph[rev_index][4] = graph_children[revid]
241
col_index = linegraph[rev_index][1][0]
243
for parent_revid in graph_parents[revid]:
244
if parent_revid in revid_index:
246
parent_index = revid_index[parent_revid]
189
progress_bar.update(msg="Organizing edges", total=len(branch_ids))
190
for i, branch_id in enumerate(branch_ids):
192
progress_bar.update(current=i)
193
branch_line = branch_lines[branch_id]
195
# Find the col_index for the direct parent branch. This will be the
196
# starting point when looking for a free column.
199
if len(branch_id) > 1:
200
parent_revno = branch_id[0:-1]
201
if parent_revno in revno_index:
202
parent_index = revno_index[parent_revno]
247
203
parent_node = linegraph[parent_index][1]
249
205
parent_col_index = parent_node[0]
208
col_search_order = _branch_line_col_search_order(columns,
210
color = reduce(lambda x, y: x+y, branch_id, 0)
214
last_rev_index = None
215
for rev_index in branch_line:
217
if broken_line_length and \
218
rev_index - last_rev_index > broken_line_length:
219
line_range.append(last_rev_index+1)
220
line_range.append(rev_index-1)
251
parent_col_index = None
253
_line_col_search_order(columns,
257
# If this line is really long, break it.
258
if len(branch_id) > 0 and \
259
broken_line_length and \
260
parent_index - rev_index > broken_line_length:
261
child_line_col_index = \
262
_find_free_column(columns,
266
_mark_column_as_used(columns,
267
child_line_col_index,
270
# Recall _line_col_search_order to reset it back to
222
line_range.extend(range(last_rev_index+1, rev_index))
224
line_range.append(rev_index)
225
last_rev_index = rev_index
228
if broken_line_length and \
229
parent_index - last_rev_index > broken_line_length:
230
line_range.append(last_rev_index+1)
232
line_range.extend(range(last_rev_index+1, parent_index))
234
col_index = _find_free_column(columns,
238
node = (col_index, color)
239
for rev_index in branch_line:
240
linegraph[rev_index][1] = node
241
columns[col_index][rev_index] = True
243
for rev_index in branch_line:
248
end_of_merge) = merge_sorted_revisions[rev_index]
250
linegraph[rev_index][4] = graph_children[revid]
251
col_index = linegraph[rev_index][1][0]
253
for parent_revid in graph_parents[revid]:
254
if parent_revid in revid_index:
256
parent_index = revid_index[parent_revid]
257
parent_node = linegraph[parent_index][1]
259
parent_col_index = parent_node[0]
261
parent_col_index = None
272
262
col_search_order = \
273
263
_line_col_search_order(columns,
274
264
parent_col_index,
276
parent_col_line_index = \
277
_find_free_column(columns,
281
_mark_column_as_used(columns,
282
parent_col_line_index,
284
lines.append((rev_index,
286
(child_line_col_index,
287
parent_col_line_index)))
289
line_col_index = col_index
290
if parent_index - rev_index >1:
291
line_range = range(rev_index + 1, parent_index)
293
_find_free_column(columns,
297
_mark_column_as_used(columns,
300
lines.append((rev_index,
303
progress_bar.finished()
267
# If this line is really long, break it.
268
if len(branch_id) > 0 and \
269
broken_line_length and \
270
parent_index - rev_index > broken_line_length:
271
child_line_col_index = \
272
_find_free_column(columns,
276
_mark_column_as_used(columns,
277
child_line_col_index,
280
# Recall _line_col_search_order to reset it back to
283
_line_col_search_order(columns,
286
parent_col_line_index = \
287
_find_free_column(columns,
291
_mark_column_as_used(columns,
292
parent_col_line_index,
294
lines.append((rev_index,
296
(child_line_col_index,
297
parent_col_line_index)))
299
line_col_index = col_index
300
if parent_index - rev_index >1:
301
line_range = range(rev_index + 1, parent_index)
303
_find_free_column(columns,
307
_mark_column_as_used(columns,
310
lines.append((rev_index,
314
progress_bar.finished()
305
root_progress.update(current=5)
316
update_root_progress(5)
306
317
progress_bar = ui.ui_factory.nested_progress_bar()
307
progress_bar.update(msg="Pretifying graph", total=len(lines))
308
for i, (child_index, parent_index, line_col_indexes) in enumerate(lines):
310
progress_bar.update(current=i)
311
(child_col_index, child_color) = linegraph[child_index][1]
312
(parent_col_index, parent_color) = linegraph[parent_index][1]
314
if len(line_col_indexes) == 1:
315
if parent_index - child_index == 1:
316
linegraph[child_index][2].append(
319
progress_bar.update(msg="Pretifying graph", total=len(lines))
320
for i, (child_index, parent_index, line_col_indexes) in enumerate(lines):
322
progress_bar.update(current=i)
323
(child_col_index, child_color) = linegraph[child_index][1]
324
(parent_col_index, parent_color) = linegraph[parent_index][1]
326
if len(line_col_indexes) == 1:
327
if parent_index - child_index == 1:
328
linegraph[child_index][2].append(
333
# line from the child's column to the lines column
334
linegraph[child_index][2].append(
338
# lines down the line's column
339
for line_part_index in range(child_index+1, parent_index-1):
340
linegraph[line_part_index][2].append(
341
(line_col_indexes[0],
344
# line from the line's column to the parent's column
345
linegraph[parent_index-1][2].append(
346
(line_col_indexes[0],
321
351
# line from the child's column to the lines column
322
352
linegraph[child_index][2].append(
323
353
(child_col_index,
324
354
line_col_indexes[0],
326
# lines down the line's column
327
for line_part_index in range(child_index+1, parent_index-1):
328
linegraph[line_part_index][2].append(
329
(line_col_indexes[0],
357
linegraph[child_index+1][2].append(
358
(line_col_indexes[0],
363
linegraph[parent_index-2][2].append(
332
367
# line from the line's column to the parent's column
333
368
linegraph[parent_index-1][2].append(
334
(line_col_indexes[0],
369
(line_col_indexes[1],
335
370
parent_col_index,
339
# line from the child's column to the lines column
340
linegraph[child_index][2].append(
345
linegraph[child_index+1][2].append(
346
(line_col_indexes[0],
351
linegraph[parent_index-2][2].append(
355
# line from the line's column to the parent's column
356
linegraph[parent_index-1][2].append(
357
(line_col_indexes[1],
360
progress_bar.finished()
373
progress_bar.finished()
361
374
return (linegraph, revid_index, len(columns))
363
376
return (linegraph, revid_index, 0)