Rev 3647: Separate out batching of revisions. in http://people.ubuntu.com/~robertc/baz2.0/log
Robert Collins
robertc at robertcollins.net
Thu Aug 21 05:12:07 BST 2008
At http://people.ubuntu.com/~robertc/baz2.0/log
------------------------------------------------------------
revno: 3647
revision-id: robertc at robertcollins.net-20080821041202-typ3c7u8e67xlgst
parent: robertc at robertcollins.net-20080821024338-palsst8qcdzzdob0
committer: Robert Collins <robertc at robertcollins.net>
branch nick: log
timestamp: Thu 2008-08-21 14:12:02 +1000
message:
Separate out batching of revisions.
modified:
bzrlib/log.py log.py-20050505065812-c40ce11702fe5fb1
bzrlib/tests/test_log.py testlog.py-20050728115707-1a514809d7d49309
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py 2008-08-21 02:43:38 +0000
+++ b/bzrlib/log.py 2008-08-21 04:12:02 +0000
@@ -220,8 +220,8 @@
# now we just print all the revisions
log_count = 0
- revision_iterator = make_log_rev_iterator(branch,
- view_revisions, generate_delta, search)
+ revision_iterator = make_log_rev_iterator(branch, view_revisions,
+ generate_delta, search)
for revs in revision_iterator:
for (rev_id, revno, merge_depth), rev, delta in revs:
lr = LogRevision(rev, revno, merge_depth, delta,
@@ -295,35 +295,43 @@
:param view_revisions: The revisions being viewed.
:param generate_delta: Whether to generate a delta for each revision.
:param search: A user text search string.
- :return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
+ :return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
delta).
"""
+ # Convert view_revisions into (view, None, None) groups to fit with
+ # the standard interface here.
+ if type(view_revisions) == list:
+ nones = [None] * len(view_revisions)
+ log_rev_iterator = iter([zip(view_revisions, nones, nones)])
+ else:
+ def _convert():
+ for view in view_revisions:
+ yield (view, None, None)
+ log_rev_iterator = iter([_convert()])
# core log logic
- log_rev_iterator = _iter_revisions(branch, view_revisions, generate_delta,
- search)
+ log_rev_iterator = make_batch_filter(branch, generate_delta, search,
+ log_rev_iterator)
# read revision objects
- log_rev_iterator = make_revision_objects(branch, view_revisions, generate_delta,
- search, log_rev_iterator)
+ log_rev_iterator = make_revision_objects(branch, generate_delta, search,
+ log_rev_iterator)
# filter on log messages
- log_rev_iterator = make_search_filter(branch, view_revisions, generate_delta,
- search, log_rev_iterator)
+ log_rev_iterator = make_search_filter(branch, generate_delta, search,
+ log_rev_iterator)
# generate deltas for things we will show
- log_rev_iterator = make_delta_filter(branch, view_revisions, generate_delta,
- search, log_rev_iterator)
+ log_rev_iterator = make_delta_filter(branch, generate_delta, search,
+ log_rev_iterator)
return log_rev_iterator
-def make_search_filter(branch, view_revisions, generate_delta, search,
- log_rev_iterator):
+def make_search_filter(branch, generate_delta, search, log_rev_iterator):
"""Create a filtered iterator of log_rev_iterator matching on a regex.
:param branch: The branch being logged.
- :param view_revisions: The revisions being viewed.
:param generate_delta: Whether to generate a delta for each revision.
:param search: A user text search string.
:param log_rev_iterator: An input iterator containing all revisions that
could be displayed, in lists.
- :return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
+ :return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
delta).
"""
if search is None:
@@ -342,17 +350,15 @@
yield new_revs
-def make_delta_filter(branch, view_revisions, generate_delta, search,
- log_rev_iterator):
+def make_delta_filter(branch, generate_delta, search, log_rev_iterator):
"""Add revision deltas to a log iterator if needed.
:param branch: The branch being logged.
- :param view_revisions: The revisions being viewed.
:param generate_delta: Whether to generate a delta for each revision.
:param search: A user text search string.
:param log_rev_iterator: An input iterator containing all revisions that
could be displayed, in lists.
- :return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
+ :return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
delta).
"""
if not generate_delta:
@@ -368,23 +374,18 @@
yield revs
-def make_revision_objects(branch, view_revisions, generate_delta, search,
- log_rev_iterator):
+def make_revision_objects(branch, generate_delta, search, log_rev_iterator):
"""Extract revision objects from the repository
:param branch: The branch being logged.
- :param view_revisions: The revisions being viewed.
:param generate_delta: Whether to generate a delta for each revision.
:param search: A user text search string.
:param log_rev_iterator: An input iterator containing all revisions that
could be displayed, in lists.
- :return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
+ :return: An iterator over iterators of ((rev_id, revno, merge_depth), rev,
delta).
"""
- return _extract_revisions(branch.repository, log_rev_iterator)
-
-
-def _extract_revisions(repository, log_rev_iterator):
+ repository = branch.repository
for revs in log_rev_iterator:
# r = revision_id, n = revno, d = merge depth
revision_ids = [view[0] for view, _, _ in revs]
@@ -394,25 +395,26 @@
yield revs
-def _iter_revisions(branch, view_revisions, generate_delta, search):
- """Create an iterator over the revisions to log.
+def make_batch_filter(branch, generate_delta, search, log_rev_iterator):
+ """Group up a single large batch into smaller ones.
:param branch: The branch being logged.
- :param view_revisions: The revisions being viewed.
:param generate_delta: Whether to generate a delta for each revision.
:param search: A user text search string.
+ :param log_rev_iterator: An input iterator containing all revisions that
+ could be displayed, in lists.
:return: An iterator over ((rev_id, revno, merge_depth), rev, delta).
"""
repository = branch.repository
num = 9
- view_revisions = iter(view_revisions)
- while True:
- cur_view_revisions = [d for x, d in zip(range(num), view_revisions)]
- if len(cur_view_revisions) == 0:
- return
- nones = [None] * num
- yield zip(cur_view_revisions, nones, nones)
- num = min(int(num * 1.5), 200)
+ for batch in log_rev_iterator:
+ batch = iter(batch)
+ while True:
+ step = [detail for _, detail in zip(range(num), batch)]
+ if len(step) == 0:
+ break
+ yield step
+ num = min(int(num * 1.5), 200)
def _get_mainline_revs(branch, start_revision, end_revision):
=== modified file 'bzrlib/tests/test_log.py'
--- a/bzrlib/tests/test_log.py 2008-07-09 20:15:29 +0000
+++ b/bzrlib/tests/test_log.py 2008-08-21 04:12:02 +0000
@@ -692,8 +692,8 @@
self.build_tree(['a'])
wt.add('a')
b.nick = 'test-line-log'
- wt.commit(message='add a',
- timestamp=1132711707,
+ wt.commit(message='add a',
+ timestamp=1132711707,
timezone=36000,
committer='Line-Log-Formatter Tester <test at line.log>')
logfile = file('out.tmp', 'w+')
More information about the bazaar-commits
mailing list