342
346
def show(self, revno, rev, delta):
343
347
raise NotImplementedError('not implemented in abstract base')
349
def short_committer(self, rev):
350
return re.sub('<.*@.*>', '', rev.committer).strip(' ')
346
353
class LongLogFormatter(LogFormatter):
347
354
def show(self, revno, rev, delta):
348
from osutils import format_date
350
to_file = self.to_file
352
print >>to_file, '-' * 60
353
print >>to_file, 'revno:', revno
355
print >>to_file, 'revision-id:', rev.revision_id
357
for parent_id in rev.parent_ids:
358
print >>to_file, 'parent:', parent_id
360
print >>to_file, 'committer:', rev.committer
362
date_str = format_date(rev.timestamp,
365
print >>to_file, 'timestamp: %s' % date_str
367
print >>to_file, 'message:'
369
print >>to_file, ' (no message)'
371
for l in rev.message.split('\n'):
372
print >>to_file, ' ' + l
375
delta.show(to_file, self.show_ids)
355
return self._show_helper(revno=revno, rev=rev, delta=delta)
377
357
def show_merge(self, rev):
378
from osutils import format_date
358
return self._show_helper(rev=rev, indent=' ', merged=True, delta=None)
360
def _show_helper(self, rev=None, revno=None, indent='', merged=False, delta=None):
361
"""Show a revision, either merged or not."""
362
from bzrlib.osutils import format_date
380
363
to_file = self.to_file
384
364
print >>to_file, indent+'-' * 60
385
print >>to_file, indent+'merged:', rev.revision_id
365
if revno is not None:
366
print >>to_file, 'revno:', revno
368
print >>to_file, indent+'merged:', rev.revision_id
370
print >>to_file, indent+'revision-id:', rev.revision_id
386
371
if self.show_ids:
387
372
for parent_id in rev.parent_ids:
388
373
print >>to_file, indent+'parent:', parent_id
390
374
print >>to_file, indent+'committer:', rev.committer
376
print >>to_file, indent+'branch nick: %s' % \
377
rev.properties['branch-nick']
392
380
date_str = format_date(rev.timestamp,
393
381
rev.timezone or 0,
394
382
self.show_timezone)
409
400
to_file = self.to_file
410
401
date_str = format_date(rev.timestamp, rev.timezone or 0,
411
402
self.show_timezone)
412
print >>to_file, "%5d %s\t%s" % (revno, rev.committer,
403
print >>to_file, "%5d %s\t%s" % (revno, self.short_committer(rev),
413
404
format_date(rev.timestamp, rev.timezone or 0,
405
self.show_timezone, date_fmt="%Y-%m-%d",
415
407
if self.show_ids:
416
408
print >>to_file, ' revision-id:', rev.revision_id
417
409
if not rev.message:
418
410
print >>to_file, ' (no message)'
420
for l in rev.message.split('\n'):
412
message = rev.message.rstrip('\r\n')
413
for l in message.split('\n'):
421
414
print >>to_file, ' ' + l
423
416
# TODO: Why not show the modified files in a shorter form as
424
417
# well? rewrap them single lines of appropriate length
425
418
if delta != None:
426
419
delta.show(to_file, self.show_ids)
429
422
class LineLogFormatter(LogFormatter):
430
423
def truncate(self, str, max_len):
460
450
lf = LineLogFormatter(None)
461
451
return lf.log_string(rev, max_chars)
463
FORMATTERS = {'long': LongLogFormatter,
454
'long': LongLogFormatter,
464
455
'short': ShortLogFormatter,
465
456
'line': LineLogFormatter,
459
def register_formatter(name, formatter):
460
FORMATTERS[name] = formatter
469
462
def log_formatter(name, *args, **kwargs):
470
463
"""Construct a formatter from arguments.
475
468
from bzrlib.errors import BzrCommandError
477
470
return FORMATTERS[name](*args, **kwargs)
479
472
raise BzrCommandError("unknown log formatter: %r" % name)
481
474
def show_one_log(revno, rev, delta, verbose, to_file, show_timezone):
482
475
# deprecated; for compatability
483
476
lf = LongLogFormatter(to_file=to_file, show_timezone=show_timezone)
484
477
lf.show(revno, rev, delta)
479
def show_changed_revisions(branch, old_rh, new_rh, to_file=None, log_format='long'):
480
"""Show the change in revision history comparing the old revision history to the new one.
482
:param branch: The branch where the revisions exist
483
:param old_rh: The old revision history
484
:param new_rh: The new revision history
485
:param to_file: A file to write the results to. If None, stdout will be used
491
to_file = codecs.getwriter(bzrlib.user_encoding)(sys.stdout, errors='replace')
492
lf = log_formatter(log_format,
495
show_timezone='original')
497
# This is the first index which is different between
500
for i in xrange(max(len(new_rh),
504
or new_rh[i] != old_rh[i]):
509
to_file.write('Nothing seems to have changed\n')
511
## TODO: It might be nice to do something like show_log
512
## and show the merged entries. But since this is the
513
## removed revisions, it shouldn't be as important
514
if base_idx < len(old_rh):
515
to_file.write('*'*60)
516
to_file.write('\nRemoved Revisions:\n')
517
for i in range(base_idx, len(old_rh)):
518
rev = branch.repository.get_revision(old_rh[i])
519
lf.show(i+1, rev, None)
520
to_file.write('*'*60)
521
to_file.write('\n\n')
522
if base_idx < len(new_rh):
523
to_file.write('Added Revisions:\n')
529
start_revision=base_idx+1,
530
end_revision=len(new_rh),