101
73
if maxnum and rev_index >= maxnum:
103
75
revid_index[revid] = rev_index
76
revno_index[revno_sequence] = rev_index
78
branch_id = revno_sequence[0:-1]
81
if branch_id not in branch_lines:
83
branch_lines[branch_id] = branch_line
85
branch_line = branch_lines[branch_id]
87
branch_line.append(rev_index)
105
89
parents = graph_parents[revid]
90
for parent_revid in parents:
91
graph_children[parent_revid].append(revid)
106
93
linegraph.append([revid,
114
revno_index[revno_sequence] = rev_index
116
branch_id = revno_sequence[0:-1]
119
if branch_id not in branch_lines:
121
branch_lines[branch_id] = branch_line
100
branch_ids = branch_lines.keys()
102
def branch_id_cmp(x, y):
103
"""Compaire branch_id's first by the number of digits, then reversed
109
return cmp(len_x, len_y)
111
branch_ids.sort(branch_id_cmp)
112
# This will hold a tuple of (child_index, parent_index, col_index) for each
113
# line that needs to be drawn. If col_index is not none, then the line is
114
# drawn along that column, else the the line can be drawn directly between
115
# the child and parent because either the child and parent are in the same
116
# branch line, or the child and parent are 1 row apart.
118
empty_column = [False for i in range(len(graph_parents))]
119
# This will hold a bit map for each cell. If the cell is true, then the
120
# cell allready contains a node or line. This use when deciding what column
121
# to place a branch line or line in, without it overlaping something else.
122
columns = [list(empty_column)]
125
for branch_id in branch_ids:
126
branch_line = branch_lines[branch_id]
128
# Find the col_index for the direct parent branch. This will be the
129
# starting point when looking for a free column.
132
if len(branch_id) > 1:
133
parent_revno = branch_id[0:-1]
134
if parent_revno in revno_index:
135
parent_index = revno_index[parent_revno]
136
parent_node = linegraph[parent_index][1]
138
parent_col_index = parent_node[0]
141
col_search_order = _branch_line_col_search_order(columns,
143
color = reduce(lambda x, y: x+y, branch_id, 0)
147
last_rev_index = None
148
for rev_index in branch_line:
150
if broken_line_length and \
151
rev_index - last_rev_index > broken_line_length:
152
line_range.append(last_rev_index+1)
153
line_range.append(rev_index-1)
155
line_range.extend(range(last_rev_index+1, rev_index))
157
line_range.append(rev_index)
158
last_rev_index = rev_index
161
if broken_line_length and \
162
parent_index - last_rev_index > broken_line_length:
163
line_range.append(last_rev_index+1)
123
branch_line = branch_lines[branch_id]
125
branch_line.append(rev_index)
128
branch_ids = branch_lines.keys()
130
def branch_id_cmp(x, y):
131
"""Compaire branch_id's first by the number of digits, then reversed
137
return cmp(len_x, len_y)
139
branch_ids.sort(branch_id_cmp)
140
# This will hold a tuple of (child_index, parent_index, col_index) for each
141
# line that needs to be drawn. If col_index is not none, then the line is
142
# drawn along that column, else the the line can be drawn directly between
143
# the child and parent because either the child and parent are in the same
144
# branch line, or the child and parent are 1 row apart.
146
empty_column = [False for i in range(len(graph_parents))]
147
# This will hold a bit map for each cell. If the cell is true, then the
148
# cell allready contains a node or line. This use when deciding what column
149
# to place a branch line or line in, without it overlaping something else.
150
columns = [list(empty_column)]
153
for branch_id in branch_ids:
154
branch_line = branch_lines[branch_id]
156
# Find the col_index for the direct parent branch. This will be the
157
# starting point when looking for a free column.
160
if len(branch_id) > 1:
161
parent_revno = branch_id[0:-1]
162
if parent_revno in revno_index:
163
parent_index = revno_index[parent_revno]
165
line_range.extend(range(last_rev_index+1, parent_index))
167
col_index = _find_free_column(columns,
171
node = (col_index, color)
172
for rev_index in branch_line:
173
linegraph[rev_index][1] = node
174
columns[col_index][rev_index] = True
176
for rev_index in branch_line:
181
end_of_merge) = merge_sorted_revisions[rev_index]
183
linegraph[rev_index][4] = graph_children[revid]
184
col_index = linegraph[rev_index][1][0]
186
for parent_revid in graph_parents[revid]:
187
if parent_revid in revid_index:
189
parent_index = revid_index[parent_revid]
164
190
parent_node = linegraph[parent_index][1]
166
192
parent_col_index = parent_node[0]
169
col_search_order = _branch_line_col_search_order(columns,
171
color = reduce(lambda x, y: x+y, branch_id, 0)
175
last_rev_index = None
176
for rev_index in branch_line:
178
if broken_line_length and \
179
rev_index - last_rev_index > broken_line_length:
180
line_range.append(last_rev_index+1)
181
line_range.append(rev_index-1)
183
line_range.extend(range(last_rev_index+1, rev_index))
185
line_range.append(rev_index)
186
last_rev_index = rev_index
189
if broken_line_length and \
190
parent_index - last_rev_index > broken_line_length:
191
line_range.append(last_rev_index+1)
193
line_range.extend(range(last_rev_index+1, parent_index))
195
col_index = _find_free_column(columns,
199
node = (col_index, color)
200
for rev_index in branch_line:
201
linegraph[rev_index][1] = node
202
columns[col_index][rev_index] = True
204
for rev_index in branch_line:
209
end_of_merge) = merge_sorted_revisions[rev_index]
211
linegraph[rev_index][4] = graph_children[revid]
212
col_index = linegraph[rev_index][1][0]
214
for parent_revid in graph_parents[revid]:
215
if parent_revid in revid_index:
217
parent_index = revid_index[parent_revid]
218
parent_node = linegraph[parent_index][1]
220
parent_col_index = parent_node[0]
222
parent_col_index = None
194
parent_col_index = None
196
_line_col_search_order(columns,
200
# If this line is really long, break it.
201
if len(branch_id) > 0 and \
202
broken_line_length and \
203
parent_index - rev_index > broken_line_length:
204
child_line_col_index = \
205
_find_free_column(columns,
209
_mark_column_as_used(columns,
210
child_line_col_index,
213
# Recall _line_col_search_order to reset it back to
223
215
col_search_order = \
224
216
_line_col_search_order(columns,
225
217
parent_col_index,
228
# If this line is really long, break it.
229
if len(branch_id) > 0 and \
230
broken_line_length and \
231
parent_index - rev_index > broken_line_length:
232
child_line_col_index = \
233
_find_free_column(columns,
237
_mark_column_as_used(columns,
238
child_line_col_index,
241
# Recall _line_col_search_order to reset it back to
244
_line_col_search_order(columns,
247
parent_col_line_index = \
248
_find_free_column(columns,
252
_mark_column_as_used(columns,
253
parent_col_line_index,
255
lines.append((rev_index,
257
(child_line_col_index,
258
parent_col_line_index)))
260
line_col_index = col_index
261
if parent_index - rev_index >1:
262
line_range = range(rev_index + 1, parent_index)
264
_find_free_column(columns,
268
_mark_column_as_used(columns,
271
lines.append((rev_index,
219
parent_col_line_index = \
220
_find_free_column(columns,
224
_mark_column_as_used(columns,
225
parent_col_line_index,
227
lines.append((rev_index,
229
(child_line_col_index,
230
parent_col_line_index)))
232
line_col_index = col_index
233
if parent_index - rev_index >1:
234
line_range = range(rev_index + 1, parent_index)
236
_find_free_column(columns,
240
_mark_column_as_used(columns,
243
lines.append((rev_index,
247
for (child_index, parent_index, line_col_indexes) in lines:
248
(child_col_index, child_color) = linegraph[child_index][1]
249
(parent_col_index, parent_color) = linegraph[parent_index][1]
275
for (child_index, parent_index, line_col_indexes) in lines:
276
(child_col_index, child_color) = linegraph[child_index][1]
277
(parent_col_index, parent_color) = linegraph[parent_index][1]
279
if len(line_col_indexes) == 1:
280
if parent_index - child_index == 1:
281
linegraph[child_index][2].append(
286
# line from the child's column to the lines column
287
linegraph[child_index][2].append(
291
# lines down the line's column
292
for line_part_index in range(child_index+1, parent_index-1):
293
linegraph[line_part_index][2].append(
294
(line_col_indexes[0],
297
# line from the line's column to the parent's column
298
linegraph[parent_index-1][2].append(
299
(line_col_indexes[0],
251
if len(line_col_indexes) == 1:
252
if parent_index - child_index == 1:
253
linegraph[child_index][2].append(
304
258
# line from the child's column to the lines column
305
259
linegraph[child_index][2].append(
306
260
(child_col_index,
307
261
line_col_indexes[0],
310
linegraph[child_index+1][2].append(
311
(line_col_indexes[0],
316
linegraph[parent_index-2][2].append(
263
# lines down the line's column
264
for line_part_index in range(child_index+1, parent_index-1):
265
linegraph[line_part_index][2].append(
266
(line_col_indexes[0],
320
269
# line from the line's column to the parent's column
321
270
linegraph[parent_index-1][2].append(
322
(line_col_indexes[1],
271
(line_col_indexes[0],
323
272
parent_col_index,
325
return (linegraph, revid_index, len(columns))
327
return (linegraph, revid_index, 0)
276
# line from the child's column to the lines column
277
linegraph[child_index][2].append(
282
linegraph[child_index+1][2].append(
283
(line_col_indexes[0],
288
linegraph[parent_index-2][2].append(
292
# line from the line's column to the parent's column
293
linegraph[parent_index-1][2].append(
294
(line_col_indexes[1],
299
return (linegraph, revid_index, len(columns))
330
301
def _branch_line_col_search_order(columns, parent_col_index):
331
302
for col_index in range(parent_col_index, len(columns)):