100
81
        if maxnum and rev_index >= maxnum:
 
102
83
        revid_index[revid] = rev_index
 
 
84
        revno_index[revno_sequence] = rev_index
 
 
86
        branch_id = revno_sequence[0:-1]
 
 
89
        if branch_id not in branch_lines:
 
 
91
            branch_lines[branch_id] = branch_line
 
 
93
            branch_line = branch_lines[branch_id]
 
 
95
        branch_line.append(rev_index)
 
104
97
        parents = graph_parents[revid]
 
 
98
        for parent_revid in parents:
 
 
99
            graph_children[parent_revid].append(revid)
 
105
101
        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
 
 
108
    branch_ids = branch_lines.keys()
 
 
110
    def branch_id_cmp(x, y):
 
 
111
        """Compaire branch_id's first by the number of digits, then reversed
 
 
117
        return cmp(len_x, len_y)
 
 
119
    branch_ids.sort(branch_id_cmp)
 
 
120
    # This will hold a tuple of (child_index, parent_index, col_index) for each
 
 
121
    # line that needs to be drawn. If col_index is not none, then the line is
 
 
122
    # drawn along that column, else the the line can be drawn directly between
 
 
123
    # the child and parent because either the child and parent are in the same
 
 
124
    # branch line, or the child and parent are 1 row apart.
 
 
126
    empty_column = [False for i in range(len(graph_parents))]
 
 
127
    # This will hold a bit map for each cell. If the cell is true, then the
 
 
128
    # cell allready contains a node or line. This use when deciding what column
 
 
129
    # to place a branch line or line in, without it overlaping something else.
 
 
130
    columns = [list(empty_column)]
 
 
133
    for branch_id in branch_ids:
 
 
134
        branch_line = branch_lines[branch_id]
 
 
136
        # Find the col_index for the direct parent branch. This will be the
 
 
137
        # starting point when looking for a free column.
 
 
140
        if len(branch_id) > 1:
 
 
141
            parent_revno = branch_id[0:-1]
 
 
142
            if parent_revno in revno_index:
 
 
143
                parent_index = revno_index[parent_revno]
 
 
144
                parent_node = linegraph[parent_index][1]
 
 
146
                    parent_col_index = parent_node[0]
 
 
149
        col_search_order = _branch_line_col_search_order(columns,
 
 
151
        color = reduce(lambda x, y: x+y, branch_id, 0)
 
 
155
        last_rev_index = None
 
 
156
        for rev_index in branch_line:
 
 
158
                if BROKEN_LINE_LENGTH and \
 
 
159
                   rev_index - last_rev_index > BROKEN_LINE_LENGTH:
 
 
160
                    line_range.append(last_rev_index+1)
 
 
161
                    line_range.append(rev_index-1)
 
 
163
                    line_range.extend(range(last_rev_index+1, rev_index))
 
 
165
            line_range.append(rev_index)
 
 
166
            last_rev_index = rev_index
 
 
169
            if BROKEN_LINE_LENGTH and \
 
 
170
               parent_index - last_rev_index > BROKEN_LINE_LENGTH:
 
 
171
                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]
 
 
173
                line_range.extend(range(last_rev_index+1, parent_index))
 
 
175
        col_index = _find_free_column(columns,
 
 
179
        node = (col_index, color)
 
 
180
        for rev_index in branch_line:
 
 
181
            linegraph[rev_index][1] = node
 
 
182
            columns[col_index][rev_index] = True
 
 
184
        for rev_index in branch_line:
 
 
189
                 end_of_merge) = merge_sorted_revisions[rev_index]
 
 
191
            linegraph[rev_index][4] = graph_children[revid]
 
 
192
            col_index = linegraph[rev_index][1][0]
 
 
194
            for parent_revid in graph_parents[revid]:
 
 
195
                if parent_revid in revid_index:
 
 
197
                    parent_index = revid_index[parent_revid]                            
 
163
198
                    parent_node = linegraph[parent_index][1]
 
165
200
                        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
 
 
202
                        parent_col_index = None
 
 
204
                            _line_col_search_order(columns,
 
 
208
                    # If this line is really long, break it.
 
 
209
                    if len(branch_id) > 0 and \
 
 
210
                       BROKEN_LINE_LENGTH and \
 
 
211
                       parent_index - rev_index > BROKEN_LINE_LENGTH:
 
 
212
                        child_line_col_index = \
 
 
213
                            _find_free_column(columns,
 
 
217
                        _mark_column_as_used(columns,
 
 
218
                                             child_line_col_index,
 
 
221
                        # Recall _line_col_search_order to reset it back to
 
222
223
                        col_search_order = \
 
223
224
                                _line_col_search_order(columns,
 
224
225
                                                       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,
 
 
227
                        parent_col_line_index = \
 
 
228
                            _find_free_column(columns,
 
 
232
                        _mark_column_as_used(columns,
 
 
233
                                             parent_col_line_index,
 
 
235
                        lines.append((rev_index,
 
 
237
                                      (child_line_col_index,
 
 
238
                                       parent_col_line_index)))
 
 
240
                        line_col_index = col_index
 
 
241
                        if parent_index - rev_index >1:
 
 
242
                            line_range = range(rev_index + 1, parent_index)
 
 
244
                                _find_free_column(columns,
 
 
248
                            _mark_column_as_used(columns,
 
 
251
                        lines.append((rev_index,
 
 
255
    for (child_index, parent_index, line_col_indexes) in lines:
 
 
256
        (child_col_index, child_color) = linegraph[child_index][1]
 
 
257
        (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],
 
 
259
        if len(line_col_indexes) == 1:
 
 
260
            if parent_index - child_index == 1:
 
 
261
                linegraph[child_index][2].append(
 
303
266
                # line from the child's column to the lines column
 
304
267
                linegraph[child_index][2].append(
 
305
268
                    (child_col_index,
 
306
269
                     line_col_indexes[0],
 
309
 
                linegraph[child_index+1][2].append(
 
310
 
                    (line_col_indexes[0],
 
315
 
                linegraph[parent_index-2][2].append(
 
 
271
                # lines down the line's column
 
 
272
                for line_part_index in range(child_index+1, parent_index-1):
 
 
273
                    linegraph[line_part_index][2].append(
 
 
274
                        (line_col_indexes[0],   
 
319
277
                # line from the line's column to the parent's column
 
320
278
                linegraph[parent_index-1][2].append(
 
321
 
                    (line_col_indexes[1],
 
 
279
                    (line_col_indexes[0],
 
322
280
                     parent_col_index,
 
324
 
        return (linegraph, revid_index, len(columns))
 
326
 
        return (linegraph, revid_index, 0)
 
 
284
            # line from the child's column to the lines column
 
 
285
            linegraph[child_index][2].append(
 
 
290
            linegraph[child_index+1][2].append(
 
 
291
                (line_col_indexes[0],
 
 
296
            linegraph[parent_index-2][2].append(
 
 
300
            # line from the line's column to the parent's column
 
 
301
            linegraph[parent_index-1][2].append(
 
 
302
                (line_col_indexes[1],
 
 
307
    return (linegraph, revid_index, len(columns))
 
329
309
def _branch_line_col_search_order(columns, parent_col_index):
 
330
310
    for col_index in range(parent_col_index, len(columns)):