~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Robert Collins
  • Date: 2005-10-17 11:56:54 UTC
  • mfrom: (1185.16.59)
  • Revision ID: robertc@robertcollins.net-20051017115654-662239e1587524a8
mergeĀ fromĀ martin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
"""
51
51
 
52
52
 
53
 
# TODO: option to show delta summaries for merged-in revisions
54
 
 
55
53
import bzrlib.errors as errors
56
54
from bzrlib.tree import EmptyTree
57
55
from bzrlib.delta import compare_trees
180
178
        warn("not a LogFormatter instance: %r" % lf)
181
179
 
182
180
    if specific_fileid:
183
 
        mutter('get log for file_id %r', specific_fileid)
 
181
        mutter('get log for file_id %r' % specific_fileid)
184
182
 
185
183
    if search is not None:
186
184
        import re
344
342
    def show(self, revno, rev, delta):
345
343
        raise NotImplementedError('not implemented in abstract base')
346
344
 
347
 
    def short_committer(self, rev):
348
 
        return re.sub('<.*@.*>', '', rev.committer).strip(' ')
349
 
    
350
345
    
351
346
class LongLogFormatter(LogFormatter):
352
347
    def show(self, revno, rev, delta):
353
 
        return self._show_helper(revno=revno, rev=rev, delta=delta)
 
348
        from osutils import format_date
 
349
 
 
350
        to_file = self.to_file
 
351
 
 
352
        print >>to_file,  '-' * 60
 
353
        print >>to_file,  'revno:', revno
 
354
        if self.show_ids:
 
355
            print >>to_file,  'revision-id:', rev.revision_id
 
356
 
 
357
            for parent_id in rev.parent_ids:
 
358
                print >>to_file, 'parent:', parent_id
 
359
            
 
360
        print >>to_file,  'committer:', rev.committer
 
361
 
 
362
        date_str = format_date(rev.timestamp,
 
363
                               rev.timezone or 0,
 
364
                               self.show_timezone)
 
365
        print >>to_file,  'timestamp: %s' % date_str
 
366
 
 
367
        print >>to_file,  'message:'
 
368
        if not rev.message:
 
369
            print >>to_file,  '  (no message)'
 
370
        else:
 
371
            for l in rev.message.split('\n'):
 
372
                print >>to_file,  '  ' + l
 
373
 
 
374
        if delta != None:
 
375
            delta.show(to_file, self.show_ids)
354
376
 
355
377
    def show_merge(self, rev):
356
 
        return self._show_helper(rev=rev, indent='    ', merged=True, delta=None)
 
378
        from osutils import format_date
357
379
 
358
 
    def _show_helper(self, rev=None, revno=None, indent='', merged=False, delta=None):
359
 
        """Show a revision, either merged or not."""
360
 
        from bzrlib.osutils import format_date
361
380
        to_file = self.to_file
 
381
 
 
382
        indent = '    '
 
383
 
362
384
        print >>to_file,  indent+'-' * 60
363
 
        if revno is not None:
364
 
            print >>to_file,  'revno:', revno
365
 
        if merged:
366
 
            print >>to_file,  indent+'merged:', rev.revision_id
367
 
        elif self.show_ids:
368
 
            print >>to_file,  indent+'revision-id:', rev.revision_id
 
385
        print >>to_file,  indent+'merged:', rev.revision_id
369
386
        if self.show_ids:
370
387
            for parent_id in rev.parent_ids:
371
388
                print >>to_file, indent+'parent:', parent_id
 
389
            
372
390
        print >>to_file,  indent+'committer:', rev.committer
373
 
        try:
374
 
            print >>to_file, indent+'branch nick: %s' % \
375
 
                rev.properties['branch-nick']
376
 
        except KeyError:
377
 
            pass
 
391
 
378
392
        date_str = format_date(rev.timestamp,
379
393
                               rev.timezone or 0,
380
394
                               self.show_timezone)
384
398
        if not rev.message:
385
399
            print >>to_file,  indent+'  (no message)'
386
400
        else:
387
 
            message = rev.message.rstrip('\r\n')
388
 
            for l in message.split('\n'):
 
401
            for l in rev.message.split('\n'):
389
402
                print >>to_file,  indent+'  ' + l
390
 
        if delta != None:
391
 
            delta.show(to_file, self.show_ids)
392
403
 
393
404
 
394
405
class ShortLogFormatter(LogFormatter):
398
409
        to_file = self.to_file
399
410
        date_str = format_date(rev.timestamp, rev.timezone or 0,
400
411
                            self.show_timezone)
401
 
        print >>to_file, "%5d %s\t%s" % (revno, self.short_committer(rev),
 
412
        print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
402
413
                format_date(rev.timestamp, rev.timezone or 0,
403
 
                            self.show_timezone, date_fmt="%Y-%m-%d",
404
 
                           show_offset=False))
 
414
                            self.show_timezone))
405
415
        if self.show_ids:
406
416
            print >>to_file,  '      revision-id:', rev.revision_id
407
417
        if not rev.message:
408
418
            print >>to_file,  '      (no message)'
409
419
        else:
410
 
            message = rev.message.rstrip('\r\n')
411
 
            for l in message.split('\n'):
 
420
            for l in rev.message.split('\n'):
412
421
                print >>to_file,  '      ' + l
413
422
 
414
423
        # TODO: Why not show the modified files in a shorter form as
415
424
        # well? rewrap them single lines of appropriate length
416
425
        if delta != None:
417
426
            delta.show(to_file, self.show_ids)
418
 
        print >>to_file, ''
 
427
        print
419
428
 
420
429
class LineLogFormatter(LogFormatter):
421
430
    def truncate(self, str, max_len):
435
444
        else:
436
445
            return rev.message
437
446
 
 
447
    def short_committer(self, rev):
 
448
        return re.sub('<.*@.*>', '', rev.committer).strip(' ')
 
449
    
438
450
    def show(self, revno, rev, delta):
439
451
        print >> self.to_file, self.log_string(rev, 79) 
440
452
 
470
482
    # deprecated; for compatability
471
483
    lf = LongLogFormatter(to_file=to_file, show_timezone=show_timezone)
472
484
    lf.show(revno, rev, delta)
473
 
 
474
 
def show_changed_revisions(branch, old_rh, new_rh, to_file=None, log_format='long'):
475
 
    """Show the change in revision history comparing the old revision history to the new one.
476
 
 
477
 
    :param branch: The branch where the revisions exist
478
 
    :param old_rh: The old revision history
479
 
    :param new_rh: The new revision history
480
 
    :param to_file: A file to write the results to. If None, stdout will be used
481
 
    """
482
 
    if to_file is None:
483
 
        import sys
484
 
        import codecs
485
 
        import bzrlib
486
 
        to_file = codecs.getwriter(bzrlib.user_encoding)(sys.stdout, errors='replace')
487
 
    lf = log_formatter(log_format,
488
 
                       show_ids=False,
489
 
                       to_file=to_file,
490
 
                       show_timezone='original')
491
 
 
492
 
    # This is the first index which is different between
493
 
    # old and new
494
 
    base_idx = None
495
 
    for i in xrange(max(len(new_rh),
496
 
                        len(old_rh))):
497
 
        if (len(new_rh) <= i
498
 
            or len(old_rh) <= i
499
 
            or new_rh[i] != old_rh[i]):
500
 
            base_idx = i
501
 
            break
502
 
 
503
 
    if base_idx is None:
504
 
        to_file.write('Nothing seems to have changed\n')
505
 
        return
506
 
    ## TODO: It might be nice to do something like show_log
507
 
    ##       and show the merged entries. But since this is the
508
 
    ##       removed revisions, it shouldn't be as important
509
 
    if base_idx < len(old_rh):
510
 
        to_file.write('*'*60)
511
 
        to_file.write('\nRemoved Revisions:\n')
512
 
        for i in range(base_idx, len(old_rh)):
513
 
            rev = branch.get_revision(old_rh[i])
514
 
            lf.show(i+1, rev, None)
515
 
        to_file.write('*'*60)
516
 
        to_file.write('\n\n')
517
 
    if base_idx < len(new_rh):
518
 
        to_file.write('Added Revisions:\n')
519
 
        show_log(branch,
520
 
                 lf,
521
 
                 None,
522
 
                 verbose=True,
523
 
                 direction='forward',
524
 
                 start_revision=base_idx+1,
525
 
                 end_revision=len(new_rh),
526
 
                 search=None)
527