221
221
# now we just print all the revisions
223
revision_iterator = make_log_rev_iterator(branch,
224
view_revisions, generate_delta, search)
223
revision_iterator = make_log_rev_iterator(branch, view_revisions,
224
generate_delta, search)
225
225
for revs in revision_iterator:
226
226
for (rev_id, revno, merge_depth), rev, delta in revs:
227
227
lr = LogRevision(rev, revno, merge_depth, delta,
295
295
:param view_revisions: The revisions being viewed.
296
296
:param generate_delta: Whether to generate a delta for each revision.
297
297
:param search: A user text search string.
298
:return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
298
:return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
301
# Convert view_revisions into (view, None, None) groups to fit with
302
# the standard interface here.
303
if type(view_revisions) == list:
304
nones = [None] * len(view_revisions)
305
log_rev_iterator = iter([zip(view_revisions, nones, nones)])
308
for view in view_revisions:
309
yield (view, None, None)
310
log_rev_iterator = iter([_convert()])
302
log_rev_iterator = _iter_revisions(branch, view_revisions, generate_delta,
312
log_rev_iterator = make_batch_filter(branch, generate_delta, search,
304
314
# read revision objects
305
log_rev_iterator = make_revision_objects(branch, view_revisions, generate_delta,
306
search, log_rev_iterator)
315
log_rev_iterator = make_revision_objects(branch, generate_delta, search,
307
317
# filter on log messages
308
log_rev_iterator = make_search_filter(branch, view_revisions, generate_delta,
309
search, log_rev_iterator)
318
log_rev_iterator = make_search_filter(branch, generate_delta, search,
310
320
# generate deltas for things we will show
311
log_rev_iterator = make_delta_filter(branch, view_revisions, generate_delta,
312
search, log_rev_iterator)
321
log_rev_iterator = make_delta_filter(branch, generate_delta, search,
313
323
return log_rev_iterator
316
def make_search_filter(branch, view_revisions, generate_delta, search,
326
def make_search_filter(branch, generate_delta, search, log_rev_iterator):
318
327
"""Create a filtered iterator of log_rev_iterator matching on a regex.
320
329
:param branch: The branch being logged.
321
:param view_revisions: The revisions being viewed.
322
330
:param generate_delta: Whether to generate a delta for each revision.
323
331
:param search: A user text search string.
324
332
:param log_rev_iterator: An input iterator containing all revisions that
325
333
could be displayed, in lists.
326
:return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
334
:return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
329
337
if search is None:
345
def make_delta_filter(branch, view_revisions, generate_delta, search,
353
def make_delta_filter(branch, generate_delta, search, log_rev_iterator):
347
354
"""Add revision deltas to a log iterator if needed.
349
356
:param branch: The branch being logged.
350
:param view_revisions: The revisions being viewed.
351
357
:param generate_delta: Whether to generate a delta for each revision.
352
358
:param search: A user text search string.
353
359
:param log_rev_iterator: An input iterator containing all revisions that
354
360
could be displayed, in lists.
355
:return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
361
:return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
358
364
if not generate_delta:
371
def make_revision_objects(branch, view_revisions, generate_delta, search,
377
def make_revision_objects(branch, generate_delta, search, log_rev_iterator):
373
378
"""Extract revision objects from the repository
375
380
:param branch: The branch being logged.
376
:param view_revisions: The revisions being viewed.
377
381
:param generate_delta: Whether to generate a delta for each revision.
378
382
:param search: A user text search string.
379
383
:param log_rev_iterator: An input iterator containing all revisions that
380
384
could be displayed, in lists.
381
:return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
385
:return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
384
return _extract_revisions(branch.repository, log_rev_iterator)
387
def _extract_revisions(repository, log_rev_iterator):
388
repository = branch.repository
388
389
for revs in log_rev_iterator:
389
390
# r = revision_id, n = revno, d = merge depth
390
391
revision_ids = [view[0] for view, _, _ in revs]
397
def _iter_revisions(branch, view_revisions, generate_delta, search):
398
"""Create an iterator over the revisions to log.
398
def make_batch_filter(branch, generate_delta, search, log_rev_iterator):
399
"""Group up a single large batch into smaller ones.
400
401
:param branch: The branch being logged.
401
:param view_revisions: The revisions being viewed.
402
402
:param generate_delta: Whether to generate a delta for each revision.
403
403
:param search: A user text search string.
404
:param log_rev_iterator: An input iterator containing all revisions that
405
could be displayed, in lists.
404
406
:return: An iterator over ((rev_id, revno, merge_depth), rev, delta).
406
408
repository = branch.repository
408
view_revisions = iter(view_revisions)
410
cur_view_revisions = [d for x, d in zip(range(num), view_revisions)]
411
if len(cur_view_revisions) == 0:
414
yield zip(cur_view_revisions, nones, nones)
415
num = min(int(num * 1.5), 200)
410
for batch in log_rev_iterator:
413
step = [detail for _, detail in zip(range(num), batch)]
417
num = min(int(num * 1.5), 200)
418
420
def _get_mainline_revs(branch, start_revision, end_revision):