~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-06-23 15:50:16 UTC
  • mfrom: (1756.2.23 log.perf)
  • Revision ID: pqm@pqm.ubuntu.com-20060623155016-476962c2dd4938a2
Optimize performance of log --short and log --line

Show diffs side-by-side

added added

removed removed

Lines of Context:
206
206
    cut_revs = which_revs[(start_revision-1):(end_revision)]
207
207
    if not cut_revs:
208
208
        return
 
209
 
 
210
    # convert the revision history to a dictionary:
 
211
    rev_nos = dict([(k, v) for v, k in cut_revs])
 
212
 
209
213
    # override the mainline to look like the revision history.
210
214
    mainline_revs = [revision_id for index, revision_id in cut_revs]
211
215
    if cut_revs[0][0] == 1:
212
216
        mainline_revs.insert(0, None)
213
217
    else:
214
218
        mainline_revs.insert(0, which_revs[start_revision-2][1])
215
 
 
216
 
    merge_sorted_revisions = merge_sort(
217
 
        branch.repository.get_revision_graph(mainline_revs[-1]),
218
 
        mainline_revs[-1],
219
 
        mainline_revs)
220
 
 
221
 
    if direction == 'reverse':
222
 
        cut_revs.reverse()
223
 
    elif direction == 'forward':
224
 
        # forward means oldest first.
225
 
        merge_sorted_revisions.reverse()
 
219
    if getattr(lf, 'show_merge', None) is not None:
 
220
        include_merges = True 
226
221
    else:
227
 
        raise ValueError('invalid direction %r' % direction)
228
 
 
229
 
    revision_history = branch.revision_history()
230
 
 
231
 
    # convert the revision history to a dictionary:
232
 
    rev_nos = {}
233
 
    for index, rev_id in cut_revs:
234
 
        rev_nos[rev_id] = index
 
222
        include_merges = False 
 
223
    view_revisions = list(get_view_revisions(mainline_revs, rev_nos, branch,
 
224
                          direction, include_merges=include_merges))
235
225
 
236
226
    def iter_revisions():
237
 
        revision_ids = [r for s, r, m, e in merge_sorted_revisions]
 
227
        revision_ids = [r for r, n, d in view_revisions]
238
228
        num = 9
239
229
        while revision_ids:
240
230
            revisions = branch.repository.get_revisions(revision_ids[:num])
247
237
        for revision in revisions:
248
238
            yield revision
249
239
    # now we just print all the revisions
250
 
    for ((sequence, rev_id, merge_depth, end_of_merge), rev) in \
251
 
        izip(merge_sorted_revisions, iter_revisions()):
 
240
    for ((rev_id, revno, merge_depth), rev) in \
 
241
         izip(view_revisions, iter_revisions()):
252
242
 
253
243
        if searchRE:
254
244
            if not searchRE.search(rev.message):
267
257
                # although we calculated it, throw it away without display
268
258
                delta = None
269
259
 
270
 
            lf.show(rev_nos[rev_id], rev, delta)
271
 
        elif hasattr(lf, 'show_merge'):
 
260
            lf.show(revno, rev, delta)
 
261
        else:
272
262
            lf.show_merge(rev, merge_depth)
273
263
 
274
264
 
 
265
def get_view_revisions(mainline_revs, rev_nos, branch, direction,
 
266
                       include_merges=True):
 
267
    """Produce an iterator of revisions to show
 
268
    :return: an iterator of (revision_id, revno, merge_depth)
 
269
    (if there is no revno for a revision, None is supplied)
 
270
    """
 
271
    if include_merges is False:
 
272
        revision_ids = mainline_revs[1:]
 
273
        if direction == 'reverse':
 
274
            revision_ids.reverse()
 
275
        for revision_id in revision_ids:
 
276
            yield revision_id, rev_nos[revision_id], 0
 
277
        return
 
278
    merge_sorted_revisions = merge_sort(
 
279
        branch.repository.get_revision_graph(mainline_revs[-1]),
 
280
        mainline_revs[-1],
 
281
        mainline_revs)
 
282
 
 
283
    if direction == 'forward':
 
284
        # forward means oldest first.
 
285
        merge_sorted_revisions.reverse()
 
286
    elif direction != 'reverse':
 
287
        raise ValueError('invalid direction %r' % direction)
 
288
 
 
289
    revision_history = branch.revision_history()
 
290
 
 
291
    for sequence, rev_id, merge_depth, end_of_merge in merge_sorted_revisions:
 
292
        yield rev_id, rev_nos.get(rev_id), merge_depth
 
293
 
 
294
 
275
295
class LogFormatter(object):
276
296
    """Abstract class to display log messages."""
277
297