203
203
# Build the request and execute it
204
rqst = LogRequest(direction=direction, specific_fileids=file_ids,
204
rqst = make_log_request_dict(direction=direction, specific_fileids=file_ids,
205
205
start_revision=start_revision, end_revision=end_revision,
206
206
limit=limit, message_search=search,
207
207
delta_type=delta_type, diff_type=diff_type)
208
208
Logger(branch, rqst).show(lf)
211
class LogRequest(object):
212
"""Query parameters for logging a branch."""
216
specific_fileids=None,
225
_match_using_deltas=True,
227
"""Create a logging request.
229
Each of these parameter become a public attribute of the object.
231
:param direction: 'reverse' (default) is latest to earliest;
232
'forward' is earliest to latest.
234
:param specific_fileids: If not None, only include revisions
235
affecting the specified files, rather than all revisions.
237
:param start_revision: If not None, only generate
238
revisions >= start_revision
240
:param end_revision: If not None, only generate
241
revisions <= end_revision
243
:param limit: If set, generate only 'limit' revisions, all revisions
244
are shown if None or 0.
246
:param message_search: If not None, only include revisions with
247
matching commit messages
249
:param levels: the number of levels of revisions to
250
generate; 1 for just the mainline; 0 for all levels.
252
:param generate_tags: If True, include tags for matched revisions.
254
:param delta_type: Either 'full', 'partial' or None.
255
'full' means generate the complete delta - adds/deletes/modifies/etc;
256
'partial' means filter the delta using specific_fileids;
257
None means do not generate any delta.
259
:param diff_type: Either 'full', 'partial' or None.
260
'full' means generate the complete diff - adds/deletes/modifies/etc;
261
'partial' means filter the diff using specific_fileids;
262
None means do not generate any diff.
264
:param _match_using_deltas: a private parameter controlling the
265
algorithm used for matching specific_fileids. This parameter
266
may be removed in the future so bzrlib client code should NOT
269
self.direction = direction
270
self.specific_fileids = specific_fileids
271
self.start_revision = start_revision
272
self.end_revision = end_revision
274
self.message_search = message_search
276
self.generate_tags = generate_tags
277
self.delta_type = delta_type
278
self.diff_type = diff_type
211
# Note: This needs to be kept this in sync with the defaults in
212
# make_log_request_dict() below
213
_DEFAULT_REQUEST_PARAMS = {
214
'direction': 'reverse',
216
'generate_tags': True,
217
'_match_using_deltas': True,
221
def make_log_request_dict(direction='reverse', specific_fileids=None,
222
start_revision=None, end_revision=None, limit=None,
223
message_search=None, levels=1, generate_tags=True, delta_type=None,
224
diff_type=None, _match_using_deltas=True):
225
"""Convenience function for making a logging request dictionary.
227
Using this function may make code slightly safer by ensuring
228
parameters have the correct names. It also provides a reference
229
point for documenting the supported parameters.
231
:param direction: 'reverse' (default) is latest to earliest;
232
'forward' is earliest to latest.
234
:param specific_fileids: If not None, only include revisions
235
affecting the specified files, rather than all revisions.
237
:param start_revision: If not None, only generate
238
revisions >= start_revision
240
:param end_revision: If not None, only generate
241
revisions <= end_revision
243
:param limit: If set, generate only 'limit' revisions, all revisions
244
are shown if None or 0.
246
:param message_search: If not None, only include revisions with
247
matching commit messages
249
:param levels: the number of levels of revisions to
250
generate; 1 for just the mainline; 0 for all levels.
252
:param generate_tags: If True, include tags for matched revisions.
254
:param delta_type: Either 'full', 'partial' or None.
255
'full' means generate the complete delta - adds/deletes/modifies/etc;
256
'partial' means filter the delta using specific_fileids;
257
None means do not generate any delta.
259
:param diff_type: Either 'full', 'partial' or None.
260
'full' means generate the complete diff - adds/deletes/modifies/etc;
261
'partial' means filter the diff using specific_fileids;
262
None means do not generate any diff.
264
:param _match_using_deltas: a private parameter controlling the
265
algorithm used for matching specific_fileids. This parameter
266
may be removed in the future so bzrlib client code should NOT
270
'direction': direction,
271
'specific_fileids': specific_fileids,
272
'start_revision': start_revision,
273
'end_revision': end_revision,
275
'message_search': message_search,
277
'generate_tags': generate_tags,
278
'delta_type': delta_type,
279
'diff_type': diff_type,
279
280
# Add 'private' attributes for features that may be deprecated
280
self._match_using_deltas = _match_using_deltas
281
self._allow_single_merge_revision = True
281
'_match_using_deltas': _match_using_deltas,
282
'_allow_single_merge_revision': True,
286
def _apply_log_request_defaults(rqst):
287
"""Apply default values to a request dictionary."""
288
result = _DEFAULT_REQUEST_PARAMS
284
294
class LogGenerator(object):
434
448
def _log_revision_iterator_using_delta_matching(self):
435
449
# Get the base revisions, filtering by the revision range
437
generate_merge_revisions = rqst.levels != 1
438
delayed_graph_generation = not rqst.specific_fileids and (
439
rqst.limit or self.start_rev_id or self.end_rev_id)
451
generate_merge_revisions = rqst.get('levels') != 1
452
delayed_graph_generation = not rqst.get('specific_fileids') and (
453
rqst.get('limit') or self.start_rev_id or self.end_rev_id)
440
454
view_revisions = _calc_view_revisions(self.branch, self.start_rev_id,
441
self.end_rev_id, rqst.direction, generate_merge_revisions,
442
rqst._allow_single_merge_revision,
455
self.end_rev_id, rqst.get('direction'), generate_merge_revisions,
456
rqst.get('_allow_single_merge_revision'),
443
457
delayed_graph_generation=delayed_graph_generation)
445
459
# Apply the other filters
446
460
return make_log_rev_iterator(self.branch, view_revisions,
447
rqst.delta_type, rqst.message_search,
448
file_ids=rqst.specific_fileids, direction=rqst.direction)
461
rqst.get('delta_type'), rqst.get('message_search'),
462
file_ids=rqst.get('specific_fileids'),
463
direction=rqst.get('direction'))
450
465
def _log_revision_iterator_using_per_file_graph(self):
451
466
# Get the base revisions, filtering by the revision range.
453
468
# filter_revisions_touching_file_id() requires them ...
455
470
view_revisions = _calc_view_revisions(self.branch, self.start_rev_id,
456
self.end_rev_id, rqst.direction, True,
457
rqst._allow_single_merge_revision)
471
self.end_rev_id, rqst.get('direction'), True,
472
rqst.get('_allow_single_merge_revision'))
458
473
if not isinstance(view_revisions, list):
459
474
view_revisions = list(view_revisions)
460
475
view_revisions = _filter_revisions_touching_file_id(self.branch,
461
rqst.specific_fileids[0], view_revisions,
462
include_merges=rqst.levels != 1)
476
rqst.get('specific_fileids')[0], view_revisions,
477
include_merges=rqst.get('levels') != 1)
463
478
return make_log_rev_iterator(self.branch, view_revisions,
464
rqst.delta_type, rqst.message_search)
479
rqst.get('delta_type'), rqst.get('message_search'))
467
482
def _calc_view_revisions(branch, start_rev_id, end_rev_id, direction,