123
113
If not None, only show revisions <= end_revision
125
from osutils import format_date
126
from errors import BzrCheckError
127
from textui import show_status
115
from bzrlib.osutils import format_date
116
from bzrlib.errors import BzrCheckError
117
from bzrlib.textui import show_status
119
from warnings import warn
121
if not isinstance(lf, LogFormatter):
122
warn("not a LogFormatter instance: %r" % lf)
130
124
if specific_fileid:
131
125
mutter('get log for file_id %r' % specific_fileid)
137
127
which_revs = branch.enum_history(direction)
128
which_revs = [x for x in which_revs if (
129
(start_revision is None or x[0] >= start_revision)
130
and (end_revision is None or x[0] <= end_revision))]
139
132
if not (verbose or specific_fileid):
140
133
# no need to know what changed between revisions
142
135
elif direction == 'reverse':
143
136
with_deltas = deltas_for_log_reverse(branch, which_revs)
145
raise NotImplementedError("sorry, verbose forward logs not done yet")
138
with_deltas = deltas_for_log_forward(branch, which_revs)
147
140
for revno, rev, delta in with_deltas:
148
141
if specific_fileid:
149
142
if not delta.touches_file_id(specific_fileid):
152
if start_revision is not None and revno < start_revision:
155
if end_revision is not None and revno > end_revision:
159
146
# although we calculated it, throw it away without display
162
show_one_log(revno, rev, delta, show_ids, to_file, show_timezone)
149
lf.show(revno, rev, delta)
194
181
last_tree = this_tree
197
this_tree = EmptyTree()
185
this_tree = EmptyTree()
187
this_revno = last_revno - 1
188
this_revision_id = branch.revision_history()[this_revno]
189
this_tree = branch.revision_tree(this_revision_id)
198
190
yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
205
from tree import EmptyTree
206
prev_tree = EmptyTree()
193
def deltas_for_log_forward(branch, which_revs):
194
"""Compute deltas for display in forward log.
196
Given a sequence of (revno, revision_id) pairs, return
199
The delta is from the given revision to the next one in the
200
sequence, which makes sense if the log is being displayed from
203
from tree import EmptyTree
204
from diff import compare_trees
206
last_revno = last_revision_id = last_tree = None
207
207
for revno, revision_id in which_revs:
208
precursor = revision_id
210
if revision_id != rev.revision_id:
211
raise BzrCheckError("retrieved wrong revision: %r"
212
% (revision_id, rev.revision_id))
215
208
this_tree = branch.revision_tree(revision_id)
216
delta = compare_trees(prev_tree, this_tree, want_unchanged=False)
217
prev_tree = this_tree
223
def show_one_log(revno, rev, delta, show_ids, to_file, show_timezone):
224
from osutils import format_date
209
this_revision = branch.get_revision(revision_id)
213
last_tree = EmptyTree()
215
last_revno = revno - 1
216
last_revision_id = branch.revision_history()[last_revno]
217
last_tree = branch.revision_tree(last_revision_id)
219
yield revno, this_revision, compare_trees(last_tree, this_tree, False)
222
last_revision = this_revision
223
last_tree = this_tree
226
class LogFormatter(object):
227
"""Abstract class to display log messages."""
228
def __init__(self, to_file, show_ids=False, show_timezone=False):
229
self.to_file = to_file
230
self.show_ids = show_ids
231
self.show_timezone = show_timezone
238
class LongLogFormatter(LogFormatter):
239
def show(self, revno, rev, delta):
240
from osutils import format_date
242
to_file = self.to_file
244
print >>to_file, '-' * 60
245
print >>to_file, 'revno:', revno
247
print >>to_file, 'revision-id:', rev.revision_id
248
print >>to_file, 'committer:', rev.committer
249
print >>to_file, 'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
252
print >>to_file, 'message:'
254
print >>to_file, ' (no message)'
256
for l in rev.message.split('\n'):
257
print >>to_file, ' ' + l
260
delta.show(to_file, self.show_ids)
264
class ShortLogFormatter(LogFormatter):
265
def show(self, revno, rev, delta):
266
from bzrlib.osutils import format_date
268
to_file = self.to_file
270
print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
271
format_date(rev.timestamp, rev.timezone or 0,
274
print >>to_file, ' revision-id:', rev.revision_id
276
print >>to_file, ' (no message)'
278
for l in rev.message.split('\n'):
279
print >>to_file, ' ' + l
282
delta.show(to_file, self.show_ids)
287
FORMATTERS = {'long': LongLogFormatter,
288
'short': ShortLogFormatter,
292
def log_formatter(name, *args, **kwargs):
293
from bzrlib.errors import BzrCommandError
226
print >>to_file, '-' * 60
227
print >>to_file, 'revno:', revno
229
print >>to_file, 'revision-id:', rev.revision_id
230
print >>to_file, 'committer:', rev.committer
231
print >>to_file, 'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
234
print >>to_file, 'message:'
236
print >>to_file, ' (no message)'
238
for l in rev.message.split('\n'):
239
print >>to_file, ' ' + l
242
delta.show(to_file, show_ids)
296
return FORMATTERS[name](*args, **kwargs)
298
raise BzrCommandError("unknown log formatter: %r" % name)