~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

[merge] robertc's integration, updated tests to check for retcode=3

Show diffs side-by-side

added added

removed removed

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