86
69
def show_log(branch,
71
show_timezone='original',
93
75
"""Write out human-readable log of commits to this branch.
96
LogFormatter object to show the output.
99
78
If true, list only the commits affecting the specified
100
79
file, rather than all commits.
82
'original' (committer's timezone),
83
'utc' (universal time), or
84
'local' (local user's timezone)
103
87
If true show added/changed/deleted/renamed files.
106
'reverse' (default) is latest to earliest;
107
'forward' is earliest to latest.
110
If not None, only show revisions >= start_revision
113
If not None, only show revisions <= end_revision
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)
125
mutter('get log for file_id %r' % specific_fileid)
127
which_revs = branch.enum_history(direction)
129
if not (verbose or specific_fileid):
130
# no need to know what changed between revisions
131
with_deltas = deltas_for_log_dummy(branch, which_revs)
132
elif direction == 'reverse':
133
with_deltas = deltas_for_log_reverse(branch, which_revs)
135
raise NotImplementedError("sorry, verbose forward logs not done yet")
137
for revno, rev, delta in with_deltas:
139
if not delta.touches_file_id(specific_fileid):
142
if start_revision is not None and revno < start_revision:
145
if end_revision is not None and revno > end_revision:
149
# although we calculated it, throw it away without display
152
lf.show(revno, rev, delta)
156
def deltas_for_log_dummy(branch, which_revs):
157
for revno, revision_id in which_revs:
158
yield revno, branch.get_revision(revision_id), None
161
def deltas_for_log_reverse(branch, which_revs):
162
"""Compute deltas for display in reverse log.
164
Given a sequence of (revno, revision_id) pairs, return
167
The delta is from the given revision to the next one in the
168
sequence, which makes sense if the log is being displayed from
171
from tree import EmptyTree
90
If true, show revision and file ids.
93
File to send log to; by default stdout.
95
from osutils import format_date
96
from errors import BzrCheckError
172
97
from diff import compare_trees
174
last_revno = last_revision_id = last_tree = None
175
for revno, revision_id in which_revs:
176
this_tree = branch.revision_tree(revision_id)
177
this_revision = branch.get_revision(revision_id)
180
yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
183
last_revision = this_revision
184
last_tree = this_tree
187
this_tree = EmptyTree()
188
yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
193
class LogFormatter(object):
194
"""Abstract class to display log messages."""
195
def __init__(self, to_file, show_ids=False, show_timezone=False):
196
self.to_file = to_file
197
self.show_ids = show_ids
198
self.show_timezone = show_timezone
205
class LongLogFormatter(LogFormatter):
206
def show(self, revno, rev, delta):
207
from osutils import format_date
209
to_file = self.to_file
98
from textui import show_status
105
file_id = branch.read_working_inventory().path2id(filename)
107
for revno, revid, why in find_touching_revisions(branch, file_id):
111
for i, revid in enumerate(branch.revision_history()):
114
branch._need_readlock()
117
from tree import EmptyTree
118
prev_tree = EmptyTree()
119
for revno, revision_id in which_revs():
211
120
print >>to_file, '-' * 60
212
121
print >>to_file, 'revno:', revno
214
print >>to_file, 'revision-id:', rev.revision_id
122
rev = branch.get_revision(revision_id)
124
print >>to_file, 'revision-id:', revision_id
215
125
print >>to_file, 'committer:', rev.committer
216
126
print >>to_file, 'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
129
if revision_id != rev.revision_id:
130
raise BzrCheckError("retrieved wrong revision: %r"
131
% (revision_id, rev.revision_id))
219
133
print >>to_file, 'message:'
220
134
if not rev.message:
223
137
for l in rev.message.split('\n'):
224
138
print >>to_file, ' ' + l
227
delta.show(to_file, self.show_ids)
231
class ShortLogFormatter(LogFormatter):
232
def show(self, revno, rev, delta):
233
from bzrlib.osutils import format_date
235
to_file = self.to_file
237
print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
238
format_date(rev.timestamp, rev.timezone or 0,
241
print >>to_file, ' revision-id:', rev.revision_id
243
print >>to_file, ' (no message)'
245
for l in rev.message.split('\n'):
246
print >>to_file, ' ' + l
249
delta.show(to_file, self.show_ids)
254
FORMATTERS = {'long': LongLogFormatter,
255
'short': ShortLogFormatter,
259
def log_formatter(name, *args, **kwargs):
260
from bzrlib.errors import BzrCommandError
263
return FORMATTERS[name](*args, **kwargs)
265
raise BzrCommandError("unknown log formatter: %r" % name)
140
# Don't show a list of changed files if we were asked about
144
this_tree = branch.revision_tree(revision_id)
145
delta = compare_trees(prev_tree, this_tree, want_unchanged=False)
146
delta.show(to_file, show_ids)
147
prev_tree = this_tree
149
precursor = revision_id