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