100
80
if maxnum and rev_index >= maxnum:
102
82
revid_index[revid] = rev_index
83
revno_index[revno_sequence] = rev_index
85
branch_id = revno_sequence[0:-1]
88
if branch_id not in branch_lines:
90
branch_lines[branch_id] = branch_line
92
branch_line = branch_lines[branch_id]
94
branch_line.append(rev_index)
104
96
parents = graph_parents[revid]
97
for parent_revid in parents:
98
graph_children[parent_revid].append(revid)
105
100
linegraph.append([revid,
113
revno_index[revno_sequence] = rev_index
115
branch_id = revno_sequence[0:-1]
118
if branch_id not in branch_lines:
120
branch_lines[branch_id] = branch_line
107
branch_ids = branch_lines.keys()
109
def branch_id_cmp(x, y):
110
"""Compaire branch_id's first by the number of digits, then reversed
116
return cmp(len_x, len_y)
118
branch_ids.sort(branch_id_cmp)
119
# This will hold a tuple of (child_index, parent_index, col_index) for each
120
# line that needs to be drawn. If col_index is not none, then the line is
121
# drawn along that column, else the the line can be drawn directly between
122
# the child and parent because either the child and parent are in the same
123
# branch line, or the child and parent are 1 row apart.
125
empty_column = [False for i in range(len(graph_parents))]
126
# This will hold a bit map for each cell. If the cell is true, then the
127
# cell allready contains a node or line. This use when deciding what column
128
# to place a branch line or line in, without it overlaping something else.
129
columns = [list(empty_column)]
132
for branch_id in branch_ids:
133
branch_line = branch_lines[branch_id]
135
# Find the col_index for the direct parent branch. This will be the
136
# starting point when looking for a free column.
139
if len(branch_id) > 1:
140
parent_revno = branch_id[0:-1]
141
if parent_revno in revno_index:
142
parent_index = revno_index[parent_revno]
143
parent_node = linegraph[parent_index][1]
145
parent_col_index = parent_node[0]
148
col_search_order = _branch_line_col_search_order(columns,
150
color = reduce(lambda x, y: x+y, branch_id, 0)
154
last_rev_index = None
155
for rev_index in branch_line:
157
if BROKEN_LINE_LENGTH and \
158
rev_index - last_rev_index > BROKEN_LINE_LENGTH:
159
line_range.append(last_rev_index+1)
160
line_range.append(rev_index-1)
162
line_range.extend(range(last_rev_index+1, rev_index))
164
line_range.append(rev_index)
165
last_rev_index = rev_index
168
if BROKEN_LINE_LENGTH and \
169
parent_index - last_rev_index > BROKEN_LINE_LENGTH:
170
line_range.append(last_rev_index+1)
122
branch_line = branch_lines[branch_id]
124
branch_line.append(rev_index)
127
branch_ids = branch_lines.keys()
129
def branch_id_cmp(x, y):
130
"""Compaire branch_id's first by the number of digits, then reversed
136
return cmp(len_x, len_y)
138
branch_ids.sort(branch_id_cmp)
139
# This will hold a tuple of (child_index, parent_index, col_index) for each
140
# line that needs to be drawn. If col_index is not none, then the line is
141
# drawn along that column, else the the line can be drawn directly between
142
# the child and parent because either the child and parent are in the same
143
# branch line, or the child and parent are 1 row apart.
145
empty_column = [False for i in range(len(graph_parents))]
146
# This will hold a bit map for each cell. If the cell is true, then the
147
# cell allready contains a node or line. This use when deciding what column
148
# to place a branch line or line in, without it overlaping something else.
149
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]
172
line_range.extend(range(last_rev_index+1, parent_index))
174
col_index = _find_free_column(columns,
178
node = (col_index, color)
179
for rev_index in branch_line:
180
linegraph[rev_index][1] = node
181
columns[col_index][rev_index] = True
183
for rev_index in branch_line:
188
end_of_merge) = merge_sorted_revisions[rev_index]
190
linegraph[rev_index][4] = graph_children[revid]
191
col_index = linegraph[rev_index][1][0]
193
for parent_revid in graph_parents[revid]:
194
if parent_revid in revid_index:
196
parent_index = revid_index[parent_revid]
163
197
parent_node = linegraph[parent_index][1]
165
199
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]
217
parent_node = linegraph[parent_index][1]
219
parent_col_index = parent_node[0]
221
parent_col_index = None
201
parent_col_index = None
203
_line_col_search_order(columns,
207
# If this line is really long, break it.
208
if len(branch_id) > 0 and \
209
BROKEN_LINE_LENGTH and \
210
parent_index - rev_index > BROKEN_LINE_LENGTH:
211
child_line_col_index = \
212
_find_free_column(columns,
216
_mark_column_as_used(columns,
217
child_line_col_index,
220
# Recall _line_col_search_order to reset it back to
222
222
col_search_order = \
223
223
_line_col_search_order(columns,
224
224
parent_col_index,
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
243
_line_col_search_order(columns,
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,
226
parent_col_line_index = \
227
_find_free_column(columns,
231
_mark_column_as_used(columns,
232
parent_col_line_index,
234
lines.append((rev_index,
236
(child_line_col_index,
237
parent_col_line_index)))
239
line_col_index = col_index
240
if parent_index - rev_index >1:
241
line_range = range(rev_index + 1, parent_index)
243
_find_free_column(columns,
247
_mark_column_as_used(columns,
250
lines.append((rev_index,
254
for (child_index, parent_index, line_col_indexes) in lines:
255
(child_col_index, child_color) = linegraph[child_index][1]
256
(parent_col_index, parent_color) = linegraph[parent_index][1]
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(
285
# line from the child's column to the lines column
286
linegraph[child_index][2].append(
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],
296
# line from the line's column to the parent's column
297
linegraph[parent_index-1][2].append(
298
(line_col_indexes[0],
258
if len(line_col_indexes) == 1:
259
if parent_index - child_index == 1:
260
linegraph[child_index][2].append(
303
265
# line from the child's column to the lines column
304
266
linegraph[child_index][2].append(
305
267
(child_col_index,
306
268
line_col_indexes[0],
309
linegraph[child_index+1][2].append(
310
(line_col_indexes[0],
315
linegraph[parent_index-2][2].append(
270
# lines down the line's column
271
for line_part_index in range(child_index+1, parent_index-1):
272
linegraph[line_part_index][2].append(
273
(line_col_indexes[0],
319
276
# line from the line's column to the parent's column
320
277
linegraph[parent_index-1][2].append(
321
(line_col_indexes[1],
278
(line_col_indexes[0],
322
279
parent_col_index,
324
return (linegraph, revid_index, len(columns))
326
return (linegraph, revid_index, 0)
283
# line from the child's column to the lines column
284
linegraph[child_index][2].append(
289
linegraph[child_index+1][2].append(
290
(line_col_indexes[0],
295
linegraph[parent_index-2][2].append(
299
# line from the line's column to the parent's column
300
linegraph[parent_index-1][2].append(
301
(line_col_indexes[1],
306
return (linegraph, revid_index, len(columns))
329
308
def _branch_line_col_search_order(columns, parent_col_index):
330
309
for col_index in range(parent_col_index, len(columns)):