~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Martin Pool
  • Date: 2005-06-17 07:34:04 UTC
  • Revision ID: mbp@sourcefrog.net-20050617073404-7c914dc1bd15f38a
- don't display progress bars on really dumb terminals

Show diffs side-by-side

added added

removed removed

Lines of Context:
84
84
 
85
85
 
86
86
def show_log(branch,
87
 
             lf,
88
87
             specific_fileid=None,
 
88
             show_timezone='original',
89
89
             verbose=False,
 
90
             show_ids=False,
 
91
             to_file=None,
90
92
             direction='reverse',
91
93
             start_revision=None,
92
 
             end_revision=None,
93
 
             search=None):
 
94
             end_revision=None):
94
95
    """Write out human-readable log of commits to this branch.
95
96
 
96
 
    lf
97
 
        LogFormatter object to show the output.
98
 
 
99
97
    specific_fileid
100
98
        If true, list only the commits affecting the specified
101
99
        file, rather than all commits.
102
100
 
 
101
    show_timezone
 
102
        'original' (committer's timezone),
 
103
        'utc' (universal time), or
 
104
        'local' (local user's timezone)
 
105
 
103
106
    verbose
104
107
        If true show added/changed/deleted/renamed files.
105
108
 
 
109
    show_ids
 
110
        If true, show revision and file ids.
 
111
 
 
112
    to_file
 
113
        File to send log to; by default stdout.
 
114
 
106
115
    direction
107
116
        'reverse' (default) is latest to earliest;
108
117
        'forward' is earliest to latest.
113
122
    end_revision
114
123
        If not None, only show revisions <= end_revision
115
124
    """
116
 
    from bzrlib.osutils import format_date
117
 
    from bzrlib.errors import BzrCheckError
118
 
    from bzrlib.textui import show_status
119
 
    
120
 
    from warnings import warn
 
125
    from osutils import format_date
 
126
    from errors import BzrCheckError
 
127
    from textui import show_status
121
128
 
122
 
    if not isinstance(lf, LogFormatter):
123
 
        warn("not a LogFormatter instance: %r" % lf)
124
129
 
125
130
    if specific_fileid:
126
131
        mutter('get log for file_id %r' % specific_fileid)
127
132
 
128
 
    if search is not None:
129
 
        import re
130
 
        searchRE = re.compile(search, re.IGNORECASE)
131
 
    else:
132
 
        searchRE = None
 
133
    if to_file == None:
 
134
        import sys
 
135
        to_file = sys.stdout
133
136
 
134
137
    which_revs = branch.enum_history(direction)
135
 
    which_revs = [x for x in which_revs if (
136
 
            (start_revision is None or x[0] >= start_revision)
137
 
            and (end_revision is None or x[0] <= end_revision))]
138
138
 
139
139
    if not (verbose or specific_fileid):
140
140
        # no need to know what changed between revisions
142
142
    elif direction == 'reverse':
143
143
        with_deltas = deltas_for_log_reverse(branch, which_revs)
144
144
    else:        
145
 
        with_deltas = deltas_for_log_forward(branch, which_revs)
 
145
        raise NotImplementedError("sorry, verbose forward logs not done yet")
146
146
 
147
147
    for revno, rev, delta in with_deltas:
148
148
        if specific_fileid:
149
149
            if not delta.touches_file_id(specific_fileid):
150
150
                continue
151
151
 
 
152
        if start_revision is not None and revno < start_revision:
 
153
            continue
 
154
 
 
155
        if end_revision is not None and revno > end_revision:
 
156
            continue
 
157
        
152
158
        if not verbose:
153
159
            # although we calculated it, throw it away without display
154
160
            delta = None
155
 
 
156
 
        if searchRE is None or searchRE.search(rev.message):
157
 
            lf.show(revno, rev, delta)
 
161
            
 
162
        show_one_log(revno, rev, delta, show_ids, to_file, show_timezone)
158
163
 
159
164
 
160
165
 
184
189
        if last_revno:
185
190
            yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
186
191
 
187
 
        this_tree = EmptyTree(branch.get_root_id())
188
 
 
189
192
        last_revno = revno
190
193
        last_revision = this_revision
191
194
        last_tree = this_tree
192
195
 
193
196
    if last_revno:
194
 
        if last_revno == 1:
195
 
            this_tree = EmptyTree(branch.get_root_id())
196
 
        else:
197
 
            this_revno = last_revno - 1
198
 
            this_revision_id = branch.revision_history()[this_revno]
199
 
            this_tree = branch.revision_tree(this_revision_id)
 
197
        this_tree = EmptyTree()
200
198
        yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
201
199
 
202
200
 
203
 
def deltas_for_log_forward(branch, which_revs):
204
 
    """Compute deltas for display in forward log.
205
 
 
206
 
    Given a sequence of (revno, revision_id) pairs, return
207
 
    (revno, rev, delta).
208
 
 
209
 
    The delta is from the given revision to the next one in the
210
 
    sequence, which makes sense if the log is being displayed from
211
 
    newest to oldest.
212
 
    """
213
 
    from tree import EmptyTree
214
 
    from diff import compare_trees
215
 
 
216
 
    last_revno = last_revision_id = last_tree = None
217
 
    prev_tree = EmptyTree(branch.get_root_id())
218
 
 
 
201
 
 
202
def junk():
 
203
    precursor = None
 
204
    if verbose:
 
205
        from tree import EmptyTree
 
206
        prev_tree = EmptyTree()
219
207
    for revno, revision_id in which_revs:
 
208
        precursor = revision_id
 
209
 
 
210
    if revision_id != rev.revision_id:
 
211
        raise BzrCheckError("retrieved wrong revision: %r"
 
212
                            % (revision_id, rev.revision_id))
 
213
 
 
214
    if verbose:
220
215
        this_tree = branch.revision_tree(revision_id)
221
 
        this_revision = branch.get_revision(revision_id)
222
 
 
223
 
        if not last_revno:
224
 
            if revno == 1:
225
 
                last_tree = EmptyTree(branch.get_root_id())
226
 
            else:
227
 
                last_revno = revno - 1
228
 
                last_revision_id = branch.revision_history()[last_revno]
229
 
                last_tree = branch.revision_tree(last_revision_id)
230
 
 
231
 
        yield revno, this_revision, compare_trees(last_tree, this_tree, False)
232
 
 
233
 
        last_revno = revno
234
 
        last_revision = this_revision
235
 
        last_tree = this_tree
236
 
 
237
 
 
238
 
class LogFormatter(object):
239
 
    """Abstract class to display log messages."""
240
 
    def __init__(self, to_file, show_ids=False, show_timezone=False):
241
 
        self.to_file = to_file
242
 
        self.show_ids = show_ids
243
 
        self.show_timezone = show_timezone
244
 
        
245
 
 
246
 
 
247
 
 
248
 
 
249
 
 
250
 
class LongLogFormatter(LogFormatter):
251
 
    def show(self, revno, rev, delta):
252
 
        from osutils import format_date
253
 
 
254
 
        to_file = self.to_file
255
 
 
256
 
        print >>to_file,  '-' * 60
257
 
        print >>to_file,  'revno:', revno
258
 
        if self.show_ids:
259
 
            print >>to_file,  'revision-id:', rev.revision_id
260
 
        print >>to_file,  'committer:', rev.committer
261
 
        print >>to_file,  'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
262
 
                                             self.show_timezone))
263
 
 
264
 
        print >>to_file,  'message:'
265
 
        if not rev.message:
266
 
            print >>to_file,  '  (no message)'
267
 
        else:
268
 
            for l in rev.message.split('\n'):
269
 
                print >>to_file,  '  ' + l
270
 
 
271
 
        if delta != None:
272
 
            delta.show(to_file, self.show_ids)
273
 
 
274
 
 
275
 
 
276
 
class ShortLogFormatter(LogFormatter):
277
 
    def show(self, revno, rev, delta):
278
 
        from bzrlib.osutils import format_date
279
 
 
280
 
        to_file = self.to_file
281
 
 
282
 
        print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
283
 
                format_date(rev.timestamp, rev.timezone or 0,
284
 
                            self.show_timezone))
285
 
        if self.show_ids:
286
 
            print >>to_file,  '      revision-id:', rev.revision_id
287
 
        if not rev.message:
288
 
            print >>to_file,  '      (no message)'
289
 
        else:
290
 
            for l in rev.message.split('\n'):
291
 
                print >>to_file,  '      ' + l
292
 
 
293
 
        if delta != None:
294
 
            delta.show(to_file, self.show_ids)
295
 
        print
296
 
 
297
 
 
298
 
 
299
 
FORMATTERS = {'long': LongLogFormatter,
300
 
              'short': ShortLogFormatter,
301
 
              }
302
 
 
303
 
 
304
 
def log_formatter(name, *args, **kwargs):
305
 
    from bzrlib.errors import BzrCommandError
 
216
        delta = compare_trees(prev_tree, this_tree, want_unchanged=False)
 
217
        prev_tree = this_tree
 
218
    else:
 
219
        delta = None    
 
220
 
 
221
 
 
222
 
 
223
def show_one_log(revno, rev, delta, show_ids, to_file, show_timezone):
 
224
    from osutils import format_date
306
225
    
307
 
    try:
308
 
        return FORMATTERS[name](*args, **kwargs)
309
 
    except IndexError:
310
 
        raise BzrCommandError("unknown log formatter: %r" % name)
 
226
    print >>to_file,  '-' * 60
 
227
    print >>to_file,  'revno:', revno
 
228
    if show_ids:
 
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,
 
232
                                         show_timezone))
 
233
 
 
234
    print >>to_file,  'message:'
 
235
    if not rev.message:
 
236
        print >>to_file,  '  (no message)'
 
237
    else:
 
238
        for l in rev.message.split('\n'):
 
239
            print >>to_file,  '  ' + l
 
240
 
 
241
    if delta != None:
 
242
        delta.show(to_file, show_ids)