~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Aaron Bentley
  • Date: 2005-07-29 17:19:16 UTC
  • mto: (1092.1.41) (1185.3.4) (974.1.47)
  • mto: This revision was merged to the branch mainline in revision 1020.
  • Revision ID: abentley@panoramicfeedback.com-20050729171916-322fd81b451d2e3e
Added merge-type parameter to merge.

Show diffs side-by-side

added added

removed removed

Lines of Context:
84
84
 
85
85
 
86
86
def show_log(branch,
 
87
             lf,
87
88
             specific_fileid=None,
88
 
             show_timezone='original',
89
89
             verbose=False,
90
 
             show_ids=False,
91
 
             to_file=None,
92
90
             direction='reverse',
93
91
             start_revision=None,
94
 
             end_revision=None):
 
92
             end_revision=None,
 
93
             search=None):
95
94
    """Write out human-readable log of commits to this branch.
96
95
 
 
96
    lf
 
97
        LogFormatter object to show the output.
 
98
 
97
99
    specific_fileid
98
100
        If true, list only the commits affecting the specified
99
101
        file, rather than all commits.
100
102
 
101
 
    show_timezone
102
 
        'original' (committer's timezone),
103
 
        'utc' (universal time), or
104
 
        'local' (local user's timezone)
105
 
 
106
103
    verbose
107
104
        If true show added/changed/deleted/renamed files.
108
105
 
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
 
 
115
106
    direction
116
107
        'reverse' (default) is latest to earliest;
117
108
        'forward' is earliest to latest.
122
113
    end_revision
123
114
        If not None, only show revisions <= end_revision
124
115
    """
125
 
    from osutils import format_date
126
 
    from errors import BzrCheckError
127
 
    from textui import show_status
 
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
128
121
 
 
122
    if not isinstance(lf, LogFormatter):
 
123
        warn("not a LogFormatter instance: %r" % lf)
129
124
 
130
125
    if specific_fileid:
131
126
        mutter('get log for file_id %r' % specific_fileid)
132
127
 
133
 
    if to_file == None:
134
 
        import sys
135
 
        to_file = sys.stdout
 
128
    if search is not None:
 
129
        import re
 
130
        searchRE = re.compile(search, re.IGNORECASE)
 
131
    else:
 
132
        searchRE = None
136
133
 
137
134
    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
 
        raise NotImplementedError("sorry, verbose forward logs not done yet")
 
145
        with_deltas = deltas_for_log_forward(branch, which_revs)
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
 
        
158
152
        if not verbose:
159
153
            # although we calculated it, throw it away without display
160
154
            delta = None
161
 
            
162
 
        show_one_log(revno, rev, delta, show_ids, to_file, show_timezone)
 
155
 
 
156
        if searchRE is None or searchRE.search(rev.message):
 
157
            lf.show(revno, rev, delta)
163
158
 
164
159
 
165
160
 
189
184
        if last_revno:
190
185
            yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
191
186
 
 
187
        this_tree = EmptyTree(branch.get_root_id())
 
188
 
192
189
        last_revno = revno
193
190
        last_revision = this_revision
194
191
        last_tree = this_tree
195
192
 
196
193
    if last_revno:
197
 
        this_tree = EmptyTree()
 
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)
198
200
        yield last_revno, last_revision, compare_trees(this_tree, last_tree, False)
199
201
 
200
202
 
201
 
 
202
 
def junk():
203
 
    precursor = None
204
 
    if verbose:
205
 
        from tree import EmptyTree
206
 
        prev_tree = EmptyTree()
 
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
 
207
219
    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:
215
220
        this_tree = branch.revision_tree(revision_id)
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
 
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
225
306
    
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)
 
307
    try:
 
308
        return FORMATTERS[name](*args, **kwargs)
 
309
    except IndexError:
 
310
        raise BzrCommandError("unknown log formatter: %r" % name)