~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

[merge] from aaron

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
from bzrlib.tree import EmptyTree
55
55
from bzrlib.delta import compare_trees
56
56
from bzrlib.trace import mutter
 
57
import re
57
58
 
58
59
 
59
60
def find_touching_revisions(branch, file_id):
227
228
                continue
228
229
 
229
230
        lf.show(revno, rev, delta)
230
 
        if revno == 1:
231
 
            excludes = set()
232
 
        else:
233
 
            # revno is 1 based, so -2 to get back 1 less.
234
 
            excludes = set(branch.get_ancestry(revision_history[revno - 2]))
235
 
        pending = list(rev.parent_ids)
236
 
        while pending:
237
 
            rev_id = pending.pop()
238
 
            if rev_id in excludes:
239
 
                continue
240
 
            # prevent showing merged revs twice if they multi-path.
241
 
            excludes.add(rev_id)
242
 
            try:
243
 
                rev = branch.get_revision(rev_id)
244
 
            except errors.NoSuchRevision:
245
 
                continue
246
 
            pending.extend(rev.parent_ids)
247
 
            lf.show_merge(rev)
 
231
        if hasattr(lf, 'show_merge'):
 
232
            if revno == 1:
 
233
                excludes = set()
 
234
            else:
 
235
                # revno is 1 based, so -2 to get back 1 less.
 
236
                excludes = set(branch.get_ancestry(revision_history[revno - 2]))
 
237
            pending = list(rev.parent_ids)
 
238
            while pending:
 
239
                rev_id = pending.pop()
 
240
                if rev_id in excludes:
 
241
                    continue
 
242
                # prevent showing merged revs twice if they multi-path.
 
243
                excludes.add(rev_id)
 
244
                try:
 
245
                    rev = branch.get_revision(rev_id)
 
246
                except errors.NoSuchRevision:
 
247
                    continue
 
248
                pending.extend(rev.parent_ids)
 
249
                lf.show_merge(rev)
248
250
 
249
251
 
250
252
def deltas_for_log_dummy(branch, which_revs):
340
342
    def show(self, revno, rev, delta):
341
343
        raise NotImplementedError('not implemented in abstract base')
342
344
 
343
 
    def show_merge(self, rev):
344
 
        pass
345
 
 
346
345
    
347
346
class LongLogFormatter(LogFormatter):
348
347
    def show(self, revno, rev, delta):
408
407
        from bzrlib.osutils import format_date
409
408
 
410
409
        to_file = self.to_file
411
 
 
 
410
        date_str = format_date(rev.timestamp, rev.timezone or 0,
 
411
                            self.show_timezone)
412
412
        print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
413
413
                format_date(rev.timestamp, rev.timezone or 0,
414
414
                            self.show_timezone))
426
426
            delta.show(to_file, self.show_ids)
427
427
        print
428
428
 
429
 
 
 
429
class LineLogFormatter(LogFormatter):
 
430
    def truncate(self, str, max_len):
 
431
        if len(str) <= max_len:
 
432
            return str
 
433
        return str[:max_len-3]+'...'
 
434
 
 
435
    def date_string(self, rev):
 
436
        from bzrlib.osutils import format_date
 
437
        return format_date(rev.timestamp, rev.timezone or 0, 
 
438
                           self.show_timezone, date_fmt="%Y-%m-%d",
 
439
                           show_offset=False)
 
440
 
 
441
    def message(self, rev):
 
442
        if not rev.message:
 
443
            return '(no message)'
 
444
        else:
 
445
            return rev.message
 
446
 
 
447
    def short_committer(self, rev):
 
448
        return re.sub('<.*@.*>', '', rev.committer).strip(' ')
 
449
    
 
450
    def show(self, revno, rev, delta):
 
451
        print >> self.to_file, self.log_string(rev, 79) 
 
452
 
 
453
    def log_string(self, rev, max_chars):
 
454
        out = [self.truncate(self.short_committer(rev), 20)]
 
455
        out.append(self.date_string(rev))
 
456
        out.append(self.message(rev).replace('\n', ' '))
 
457
        return self.truncate(" ".join(out).rstrip('\n'), max_chars)
 
458
 
 
459
def line_log(rev, max_chars):
 
460
    lf = LineLogFormatter(None)
 
461
    return lf.log_string(rev, max_chars)
430
462
 
431
463
FORMATTERS = {'long': LongLogFormatter,
432
464
              'short': ShortLogFormatter,
 
465
              'line': LineLogFormatter,
433
466
              }
434
467
 
435
468
 
436
469
def log_formatter(name, *args, **kwargs):
437
470
    """Construct a formatter from arguments.
438
471
 
439
 
    name -- Name of the formatter to construct; currently 'long' and
440
 
        'short' are supported.
 
472
    name -- Name of the formatter to construct; currently 'long', 'short' and
 
473
        'line' are supported.
441
474
    """
442
475
    from bzrlib.errors import BzrCommandError
443
476
    try: