206
206
cut_revs = which_revs[(start_revision-1):(end_revision)]
210
# convert the revision history to a dictionary:
211
rev_nos = dict([(k, v) for v, k in cut_revs])
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)
214
218
mainline_revs.insert(0, which_revs[start_revision-2][1])
216
merge_sorted_revisions = merge_sort(
217
branch.repository.get_revision_graph(mainline_revs[-1]),
221
if direction == '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
227
raise ValueError('invalid direction %r' % direction)
229
revision_history = branch.revision_history()
231
# convert the revision history to a dictionary:
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))
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]
239
229
while revision_ids:
240
230
revisions = branch.repository.get_revisions(revision_ids[:num])
247
237
for revision in revisions:
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()):
254
244
if not searchRE.search(rev.message):
267
257
# although we calculated it, throw it away without display
270
lf.show(rev_nos[rev_id], rev, delta)
271
elif hasattr(lf, 'show_merge'):
260
lf.show(revno, rev, delta)
272
262
lf.show_merge(rev, merge_depth)
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)
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
278
merge_sorted_revisions = merge_sort(
279
branch.repository.get_revision_graph(mainline_revs[-1]),
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)
289
revision_history = branch.revision_history()
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
275
295
class LogFormatter(object):
276
296
"""Abstract class to display log messages."""