/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Lukáš Lalinský
  • Date: 2007-12-17 17:28:25 UTC
  • mfrom: (3120 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3123.
  • Revision ID: lalinsky@gmail.com-20071217172825-tr3pqm1mhvs3gwnn
Merge bzr.dev.

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
60
 
from bzrlib.revisionspec import(
61
 
    RevisionInfo
 
68
from bzrlib.errors import (
 
69
    BzrCommandError,
 
70
    )
 
71
from bzrlib.osutils import (
 
72
    format_date,
 
73
    get_terminal_encoding,
 
74
    terminal_width,
 
75
    )
 
76
from bzrlib.revision import (
 
77
    NULL_REVISION,
 
78
    )
 
79
from bzrlib.revisionspec import (
 
80
    RevisionInfo,
62
81
    )
63
82
from bzrlib.symbol_versioning import (
64
83
    deprecated_method,
184
203
             search=None,
185
204
             limit=None):
186
205
    """Worker function for show_log - see show_log."""
187
 
    from bzrlib.osutils import format_date
188
 
    from bzrlib.errors import BzrCheckError
189
 
    
190
 
    from warnings import warn
191
 
 
192
206
    if not isinstance(lf, LogFormatter):
193
207
        warn("not a LogFormatter instance: %r" % lf)
194
208
 
196
210
        mutter('get log for file_id %r', specific_fileid)
197
211
 
198
212
    if search is not None:
199
 
        import re
200
213
        searchRE = re.compile(search, re.IGNORECASE)
201
214
    else:
202
215
        searchRE = None
229
242
    else:
230
243
        generate_merge_revisions = getattr(lf, 'supports_merge_revisions', 
231
244
                                           False)
 
245
    generate_single_revision = False
 
246
    if ((not generate_merge_revisions)
 
247
        and ((start_rev_id and (start_rev_id not in rev_nos))
 
248
            or (end_rev_id and (end_rev_id not in rev_nos)))):
 
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
232
255
    view_revs_iter = get_view_revisions(mainline_revs, rev_nos, branch,
233
256
                          direction, include_merges=generate_merge_revisions)
234
257
    view_revisions = _filter_revision_range(list(view_revs_iter),
235
258
                                            start_rev_id,
236
259
                                            end_rev_id)
 
260
    if view_revisions and generate_single_revision:
 
261
        view_revisions = view_revisions[0:1]
237
262
    if specific_fileid:
238
263
        view_revisions = _filter_revisions_touching_file_id(branch,
239
264
                                                         specific_fileid,
356
381
            branch.check_real_revno(end_revision)
357
382
            end_revno = end_revision
358
383
 
 
384
    if ((start_rev_id == NULL_REVISION)
 
385
        or (end_rev_id == NULL_REVISION)):
 
386
        raise BzrCommandError('Logging revision 0 is invalid.')
359
387
    if start_revno > end_revno:
360
 
        from bzrlib.errors import BzrCommandError
361
388
        raise BzrCommandError("Start revision must be older than "
362
389
                              "the end revision.")
363
390
 
564
591
    - supports_delta must be True if this log formatter supports delta.
565
592
        Otherwise the delta attribute may not be populated.
566
593
    - supports_merge_revisions must be True if this log formatter supports 
567
 
        merge revisions.  If not, only mainline revisions (those 
568
 
        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.
569
600
    - supports_tags must be True if this log formatter supports tags.
570
601
        Otherwise the tags attribute may not be populated.
571
602
    """
590
621
        raise NotImplementedError('not implemented in abstract base')
591
622
 
592
623
    def short_committer(self, rev):
593
 
        return re.sub('<.*@.*>', '', rev.committer).strip(' ')
 
624
        name, address = config.parse_username(rev.committer)
 
625
        if name:
 
626
            return name
 
627
        return address
594
628
 
595
629
    def short_author(self, rev):
596
 
        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
597
634
 
598
635
 
599
636
class LongLogFormatter(LogFormatter):
615
652
 
616
653
    def log_revision(self, revision):
617
654
        """Log a revision, either merged or not."""
618
 
        from bzrlib.osutils import format_date
619
655
        indent = '    ' * revision.merge_depth
620
656
        to_file = self.to_file
621
657
        to_file.write(indent + '-' * 60 + '\n')
657
693
class ShortLogFormatter(LogFormatter):
658
694
 
659
695
    supports_delta = True
 
696
    supports_single_merge_revision = True
660
697
 
661
698
    @deprecated_method(zero_seventeen)
662
699
    def show(self, revno, rev, delta):
664
701
        return self.log_revision(lr)
665
702
 
666
703
    def log_revision(self, revision):
667
 
        from bzrlib.osutils import format_date
668
 
 
669
704
        to_file = self.to_file
670
705
        date_str = format_date(revision.rev.timestamp,
671
706
                               revision.rev.timezone or 0,
698
733
 
699
734
class LineLogFormatter(LogFormatter):
700
735
 
 
736
    supports_single_merge_revision = True
 
737
 
701
738
    def __init__(self, *args, **kwargs):
702
 
        from bzrlib.osutils import terminal_width
703
739
        super(LineLogFormatter, self).__init__(*args, **kwargs)
704
740
        self._max_chars = terminal_width() - 1
705
741
 
709
745
        return str[:max_len-3]+'...'
710
746
 
711
747
    def date_string(self, rev):
712
 
        from bzrlib.osutils import format_date
713
748
        return format_date(rev.timestamp, rev.timezone or 0, 
714
749
                           self.show_timezone, date_fmt="%Y-%m-%d",
715
750
                           show_offset=False)
722
757
 
723
758
    @deprecated_method(zero_seventeen)
724
759
    def show(self, revno, rev, delta):
725
 
        from bzrlib.osutils import terminal_width
726
760
        self.to_file.write(self.log_string(revno, rev, terminal_width()-1))
727
761
        self.to_file.write('\n')
728
762
 
790
824
    name -- Name of the formatter to construct; currently 'long', 'short' and
791
825
        'line' are supported.
792
826
    """
793
 
    from bzrlib.errors import BzrCommandError
794
827
    try:
795
828
        return log_formatter_registry.make_formatter(name, *args, **kwargs)
796
829
    except KeyError:
813
846
    :param to_file: A file to write the results to. If None, stdout will be used
814
847
    """
815
848
    if to_file is None:
816
 
        import sys
817
 
        import codecs
818
 
        import bzrlib
819
 
        to_file = codecs.getwriter(bzrlib.user_encoding)(sys.stdout,
820
 
                                                         errors='replace')
 
849
        to_file = codecs.getwriter(get_terminal_encoding())(sys.stdout,
 
850
            errors='replace')
821
851
    lf = log_formatter(log_format,
822
852
                       show_ids=False,
823
853
                       to_file=to_file,