~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: John Arbash Meinel
  • Date: 2007-12-05 22:52:58 UTC
  • mfrom: (3080 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3084.
  • Revision ID: john@arbash-meinel.com-20071205225258-kn799zf3tewncv7p
[merge] bzr.dev 3080

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
all the changes since the previous revision that touched hello.c.
50
50
"""
51
51
 
52
 
from itertools import izip
 
52
import codecs
 
53
from itertools import (
 
54
    izip,
 
55
    )
53
56
import re
 
57
import sys
 
58
from warnings import (
 
59
    warn,
 
60
    )
54
61
 
55
62
from bzrlib import (
 
63
    config,
 
64
    lazy_regex,
56
65
    registry,
57
66
    symbol_versioning,
58
67
    )
59
 
import bzrlib.errors as errors
 
68
from bzrlib.errors import (
 
69
    BzrCommandError,
 
70
    )
 
71
from bzrlib.osutils import (
 
72
    format_date,
 
73
    get_terminal_encoding,
 
74
    terminal_width,
 
75
    )
60
76
from bzrlib.revision import (
61
77
    NULL_REVISION,
62
78
    )
187
203
             search=None,
188
204
             limit=None):
189
205
    """Worker function for show_log - see show_log."""
190
 
    from bzrlib.osutils import format_date
191
 
    from bzrlib.errors import BzrCheckError
192
 
    
193
 
    from warnings import warn
194
 
 
195
206
    if not isinstance(lf, LogFormatter):
196
207
        warn("not a LogFormatter instance: %r" % lf)
197
208
 
199
210
        mutter('get log for file_id %r', specific_fileid)
200
211
 
201
212
    if search is not None:
202
 
        import re
203
213
        searchRE = re.compile(search, re.IGNORECASE)
204
214
    else:
205
215
        searchRE = None
232
242
    else:
233
243
        generate_merge_revisions = getattr(lf, 'supports_merge_revisions', 
234
244
                                           False)
 
245
    generate_single_revision = False
235
246
    if ((not generate_merge_revisions)
236
247
        and ((start_rev_id and (start_rev_id not in rev_nos))
237
248
            or (end_rev_id and (end_rev_id not in rev_nos)))):
238
 
        from bzrlib.errors import BzrCommandError
239
 
        raise BzrCommandError('Selected log formatter only supports '
240
 
            'mainline revisions.')
 
249
        generate_single_revision = ((start_rev_id == end_rev_id)
 
250
            and getattr(lf, 'supports_single_merge_revision', False))
 
251
        if not generate_single_revision:
 
252
            raise BzrCommandError('Selected log formatter only supports '
 
253
                'mainline revisions.')
 
254
        generate_merge_revisions = generate_single_revision
241
255
    view_revs_iter = get_view_revisions(mainline_revs, rev_nos, branch,
242
256
                          direction, include_merges=generate_merge_revisions)
243
257
    view_revisions = _filter_revision_range(list(view_revs_iter),
244
258
                                            start_rev_id,
245
259
                                            end_rev_id)
 
260
    if view_revisions and generate_single_revision:
 
261
        view_revisions = view_revisions[0:1]
246
262
    if specific_fileid:
247
263
        view_revisions = _filter_revisions_touching_file_id(branch,
248
264
                                                         specific_fileid,
367
383
 
368
384
    if ((start_rev_id == NULL_REVISION)
369
385
        or (end_rev_id == NULL_REVISION)):
370
 
        from bzrlib.errors import BzrCommandError
371
386
        raise BzrCommandError('Logging revision 0 is invalid.')
372
387
    if start_revno > end_revno:
373
 
        from bzrlib.errors import BzrCommandError
374
388
        raise BzrCommandError("Start revision must be older than "
375
389
                              "the end revision.")
376
390
 
577
591
    - supports_delta must be True if this log formatter supports delta.
578
592
        Otherwise the delta attribute may not be populated.
579
593
    - supports_merge_revisions must be True if this log formatter supports 
580
 
        merge revisions.  If not, only mainline revisions (those 
581
 
        with merge_depth == 0) will be passed to the formatter.
 
594
        merge revisions.  If not, and if supports_single_merge_revisions is
 
595
        also not True, then only mainline revisions will be passed to the 
 
596
        formatter.
 
597
    - supports_single_merge_revision must be True if this log formatter
 
598
        supports logging only a single merge revision.  This flag is
 
599
        only relevant if supports_merge_revisions is not True.
582
600
    - supports_tags must be True if this log formatter supports tags.
583
601
        Otherwise the tags attribute may not be populated.
584
602
    """
603
621
        raise NotImplementedError('not implemented in abstract base')
604
622
 
605
623
    def short_committer(self, rev):
606
 
        return re.sub('<.*@.*>', '', rev.committer).strip(' ')
 
624
        name, address = config.parse_username(rev.committer)
 
625
        if name:
 
626
            return name
 
627
        return address
607
628
 
608
629
    def short_author(self, rev):
609
 
        return re.sub('<.*@.*>', '', rev.get_apparent_author()).strip(' ')
 
630
        name, address = config.parse_username(rev.get_apparent_author())
 
631
        if name:
 
632
            return name
 
633
        return address
610
634
 
611
635
 
612
636
class LongLogFormatter(LogFormatter):
628
652
 
629
653
    def log_revision(self, revision):
630
654
        """Log a revision, either merged or not."""
631
 
        from bzrlib.osutils import format_date
632
655
        indent = '    ' * revision.merge_depth
633
656
        to_file = self.to_file
634
657
        to_file.write(indent + '-' * 60 + '\n')
670
693
class ShortLogFormatter(LogFormatter):
671
694
 
672
695
    supports_delta = True
 
696
    supports_single_merge_revision = True
673
697
 
674
698
    @deprecated_method(zero_seventeen)
675
699
    def show(self, revno, rev, delta):
677
701
        return self.log_revision(lr)
678
702
 
679
703
    def log_revision(self, revision):
680
 
        from bzrlib.osutils import format_date
681
 
 
682
704
        to_file = self.to_file
683
705
        date_str = format_date(revision.rev.timestamp,
684
706
                               revision.rev.timezone or 0,
711
733
 
712
734
class LineLogFormatter(LogFormatter):
713
735
 
 
736
    supports_single_merge_revision = True
 
737
 
714
738
    def __init__(self, *args, **kwargs):
715
 
        from bzrlib.osutils import terminal_width
716
739
        super(LineLogFormatter, self).__init__(*args, **kwargs)
717
740
        self._max_chars = terminal_width() - 1
718
741
 
722
745
        return str[:max_len-3]+'...'
723
746
 
724
747
    def date_string(self, rev):
725
 
        from bzrlib.osutils import format_date
726
748
        return format_date(rev.timestamp, rev.timezone or 0, 
727
749
                           self.show_timezone, date_fmt="%Y-%m-%d",
728
750
                           show_offset=False)
735
757
 
736
758
    @deprecated_method(zero_seventeen)
737
759
    def show(self, revno, rev, delta):
738
 
        from bzrlib.osutils import terminal_width
739
760
        self.to_file.write(self.log_string(revno, rev, terminal_width()-1))
740
761
        self.to_file.write('\n')
741
762
 
803
824
    name -- Name of the formatter to construct; currently 'long', 'short' and
804
825
        'line' are supported.
805
826
    """
806
 
    from bzrlib.errors import BzrCommandError
807
827
    try:
808
828
        return log_formatter_registry.make_formatter(name, *args, **kwargs)
809
829
    except KeyError:
826
846
    :param to_file: A file to write the results to. If None, stdout will be used
827
847
    """
828
848
    if to_file is None:
829
 
        import sys
830
 
        import codecs
831
 
        import bzrlib
832
 
        to_file = codecs.getwriter(bzrlib.user_encoding)(sys.stdout,
833
 
                                                         errors='replace')
 
849
        to_file = codecs.getwriter(get_terminal_encoding())(sys.stdout,
 
850
            errors='replace')
834
851
    lf = log_formatter(log_format,
835
852
                       show_ids=False,
836
853
                       to_file=to_file,