~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-12-03 17:53:02 UTC
  • mfrom: (2997.1.4 kent.gibson)
  • Revision ID: pqm@pqm.ubuntu.com-20071203175302-n6fyku9etg5du9km
Support logging single merge revisions with short and line log formatters.
 (Kent Gibson)

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 (
56
63
    registry,
57
64
    symbol_versioning,
58
65
    )
59
 
import bzrlib.errors as errors
 
66
from bzrlib.errors import (
 
67
    BzrCommandError,
 
68
    )
 
69
from bzrlib.osutils import (
 
70
    format_date,
 
71
    get_terminal_encoding,
 
72
    terminal_width,
 
73
    )
60
74
from bzrlib.revision import (
61
75
    NULL_REVISION,
62
76
    )
187
201
             search=None,
188
202
             limit=None):
189
203
    """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
204
    if not isinstance(lf, LogFormatter):
196
205
        warn("not a LogFormatter instance: %r" % lf)
197
206
 
199
208
        mutter('get log for file_id %r', specific_fileid)
200
209
 
201
210
    if search is not None:
202
 
        import re
203
211
        searchRE = re.compile(search, re.IGNORECASE)
204
212
    else:
205
213
        searchRE = None
232
240
    else:
233
241
        generate_merge_revisions = getattr(lf, 'supports_merge_revisions', 
234
242
                                           False)
 
243
    generate_single_revision = False
235
244
    if ((not generate_merge_revisions)
236
245
        and ((start_rev_id and (start_rev_id not in rev_nos))
237
246
            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.')
 
247
        generate_single_revision = ((start_rev_id == end_rev_id)
 
248
            and getattr(lf, 'supports_single_merge_revision', False))
 
249
        if not generate_single_revision:
 
250
            raise BzrCommandError('Selected log formatter only supports '
 
251
                'mainline revisions.')
 
252
        generate_merge_revisions = generate_single_revision
241
253
    view_revs_iter = get_view_revisions(mainline_revs, rev_nos, branch,
242
254
                          direction, include_merges=generate_merge_revisions)
243
255
    view_revisions = _filter_revision_range(list(view_revs_iter),
244
256
                                            start_rev_id,
245
257
                                            end_rev_id)
 
258
    if view_revisions and generate_single_revision:
 
259
        view_revisions = view_revisions[0:1]
246
260
    if specific_fileid:
247
261
        view_revisions = _filter_revisions_touching_file_id(branch,
248
262
                                                         specific_fileid,
367
381
 
368
382
    if ((start_rev_id == NULL_REVISION)
369
383
        or (end_rev_id == NULL_REVISION)):
370
 
        from bzrlib.errors import BzrCommandError
371
384
        raise BzrCommandError('Logging revision 0 is invalid.')
372
385
    if start_revno > end_revno:
373
 
        from bzrlib.errors import BzrCommandError
374
386
        raise BzrCommandError("Start revision must be older than "
375
387
                              "the end revision.")
376
388
 
577
589
    - supports_delta must be True if this log formatter supports delta.
578
590
        Otherwise the delta attribute may not be populated.
579
591
    - 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.
 
592
        merge revisions.  If not, and if supports_single_merge_revisions is
 
593
        also not True, then only mainline revisions will be passed to the 
 
594
        formatter.
 
595
    - supports_single_merge_revision must be True if this log formatter
 
596
        supports logging only a single merge revision.  This flag is
 
597
        only relevant if supports_merge_revisions is not True.
582
598
    - supports_tags must be True if this log formatter supports tags.
583
599
        Otherwise the tags attribute may not be populated.
584
600
    """
628
644
 
629
645
    def log_revision(self, revision):
630
646
        """Log a revision, either merged or not."""
631
 
        from bzrlib.osutils import format_date
632
647
        indent = '    ' * revision.merge_depth
633
648
        to_file = self.to_file
634
649
        to_file.write(indent + '-' * 60 + '\n')
670
685
class ShortLogFormatter(LogFormatter):
671
686
 
672
687
    supports_delta = True
 
688
    supports_single_merge_revision = True
673
689
 
674
690
    @deprecated_method(zero_seventeen)
675
691
    def show(self, revno, rev, delta):
677
693
        return self.log_revision(lr)
678
694
 
679
695
    def log_revision(self, revision):
680
 
        from bzrlib.osutils import format_date
681
 
 
682
696
        to_file = self.to_file
683
697
        date_str = format_date(revision.rev.timestamp,
684
698
                               revision.rev.timezone or 0,
711
725
 
712
726
class LineLogFormatter(LogFormatter):
713
727
 
 
728
    supports_single_merge_revision = True
 
729
 
714
730
    def __init__(self, *args, **kwargs):
715
 
        from bzrlib.osutils import terminal_width
716
731
        super(LineLogFormatter, self).__init__(*args, **kwargs)
717
732
        self._max_chars = terminal_width() - 1
718
733
 
722
737
        return str[:max_len-3]+'...'
723
738
 
724
739
    def date_string(self, rev):
725
 
        from bzrlib.osutils import format_date
726
740
        return format_date(rev.timestamp, rev.timezone or 0, 
727
741
                           self.show_timezone, date_fmt="%Y-%m-%d",
728
742
                           show_offset=False)
735
749
 
736
750
    @deprecated_method(zero_seventeen)
737
751
    def show(self, revno, rev, delta):
738
 
        from bzrlib.osutils import terminal_width
739
752
        self.to_file.write(self.log_string(revno, rev, terminal_width()-1))
740
753
        self.to_file.write('\n')
741
754
 
803
816
    name -- Name of the formatter to construct; currently 'long', 'short' and
804
817
        'line' are supported.
805
818
    """
806
 
    from bzrlib.errors import BzrCommandError
807
819
    try:
808
820
        return log_formatter_registry.make_formatter(name, *args, **kwargs)
809
821
    except KeyError:
826
838
    :param to_file: A file to write the results to. If None, stdout will be used
827
839
    """
828
840
    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')
 
841
        to_file = codecs.getwriter(get_terminal_encoding())(sys.stdout,
 
842
            errors='replace')
834
843
    lf = log_formatter(log_format,
835
844
                       show_ids=False,
836
845
                       to_file=to_file,