/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: Robert Collins
  • Date: 2008-04-04 00:43:07 UTC
  • mfrom: (3331 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3333.
  • Revision ID: robertc@robertcollins.net-20080404004307-0whomfhm3yal2rvw
Resolve conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
63
63
    config,
64
64
    lazy_regex,
65
65
    registry,
66
 
    symbol_versioning,
67
66
    )
68
67
from bzrlib.errors import (
69
68
    BzrCommandError,
73
72
    get_terminal_encoding,
74
73
    terminal_width,
75
74
    )
 
75
from bzrlib.repository import _strip_NULL_ghosts
76
76
from bzrlib.revision import (
77
77
    NULL_REVISION,
78
78
    )
79
79
from bzrlib.revisionspec import (
80
80
    RevisionInfo,
81
81
    )
82
 
from bzrlib.symbol_versioning import (
83
 
    deprecated_method,
84
 
    zero_seventeen,
85
 
    )
86
82
from bzrlib.trace import mutter
87
83
from bzrlib.tsort import (
88
84
    merge_sort,
193
189
    finally:
194
190
        branch.unlock()
195
191
 
 
192
 
196
193
def _show_log(branch,
197
194
             lf,
198
195
             specific_fileid=None,
208
205
 
209
206
    if specific_fileid:
210
207
        mutter('get log for file_id %r', specific_fileid)
211
 
 
 
208
    generate_merge_revisions = getattr(lf, 'supports_merge_revisions', False)
 
209
    allow_single_merge_revision = getattr(lf,
 
210
        'supports_single_merge_revision', False)
 
211
    view_revisions = calculate_view_revisions(branch, start_revision,
 
212
                                              end_revision, direction,
 
213
                                              specific_fileid,
 
214
                                              generate_merge_revisions,
 
215
                                              allow_single_merge_revision)
212
216
    if search is not None:
213
217
        searchRE = re.compile(search, re.IGNORECASE)
214
218
    else:
215
219
        searchRE = None
216
220
 
 
221
    rev_tag_dict = {}
 
222
    generate_tags = getattr(lf, 'supports_tags', False)
 
223
    if generate_tags:
 
224
        if branch.supports_tags():
 
225
            rev_tag_dict = branch.tags.get_reverse_tag_dict()
 
226
 
 
227
    generate_delta = verbose and getattr(lf, 'supports_delta', False)
 
228
 
 
229
    # now we just print all the revisions
 
230
    log_count = 0
 
231
    for (rev_id, revno, merge_depth), rev, delta in _iter_revisions(
 
232
        branch.repository, view_revisions, generate_delta):
 
233
        if searchRE:
 
234
            if not searchRE.search(rev.message):
 
235
                continue
 
236
 
 
237
        lr = LogRevision(rev, revno, merge_depth, delta,
 
238
                         rev_tag_dict.get(rev_id))
 
239
        lf.log_revision(lr)
 
240
        if limit:
 
241
            log_count += 1
 
242
            if log_count >= limit:
 
243
                break
 
244
 
 
245
 
 
246
def calculate_view_revisions(branch, start_revision, end_revision, direction,
 
247
                             specific_fileid, generate_merge_revisions,
 
248
                             allow_single_merge_revision):
 
249
    if (not generate_merge_revisions and start_revision is end_revision is
 
250
        None and direction == 'reverse' and specific_fileid is None):
 
251
        return _linear_view_revisions(branch)
 
252
 
217
253
    mainline_revs, rev_nos, start_rev_id, end_rev_id = \
218
254
        _get_mainline_revs(branch, start_revision, end_revision)
219
255
    if not mainline_revs:
220
 
        return
 
256
        return []
221
257
 
222
258
    if direction == 'reverse':
223
259
        start_rev_id, end_rev_id = end_rev_id, start_rev_id
224
 
        
225
 
    legacy_lf = getattr(lf, 'log_revision', None) is None
226
 
    if legacy_lf:
227
 
        # pre-0.17 formatters use show for mainline revisions.
228
 
        # how should we show merged revisions ?
229
 
        #   pre-0.11 api: show_merge
230
 
        #   0.11-0.16 api: show_merge_revno
231
 
        show_merge_revno = getattr(lf, 'show_merge_revno', None)
232
 
        show_merge = getattr(lf, 'show_merge', None)
233
 
        if show_merge is None and show_merge_revno is None:
234
 
            # no merged-revno support
235
 
            generate_merge_revisions = False
236
 
        else:
237
 
            generate_merge_revisions = True
238
 
        # tell developers to update their code
239
 
        symbol_versioning.warn('LogFormatters should provide log_revision '
240
 
            'instead of show and show_merge_revno since bzr 0.17.',
241
 
            DeprecationWarning, stacklevel=3)
242
 
    else:
243
 
        generate_merge_revisions = getattr(lf, 'supports_merge_revisions', 
244
 
                                           False)
 
260
 
245
261
    generate_single_revision = False
246
262
    if ((not generate_merge_revisions)
247
263
        and ((start_rev_id and (start_rev_id not in rev_nos))
248
264
            or (end_rev_id and (end_rev_id not in rev_nos)))):
249
265
        generate_single_revision = ((start_rev_id == end_rev_id)
250
 
            and getattr(lf, 'supports_single_merge_revision', False))
 
266
            and allow_single_merge_revision)
251
267
        if not generate_single_revision:
252
268
            raise BzrCommandError('Selected log formatter only supports '
253
269
                'mainline revisions.')
271
287
        min_depth = min([d for r,n,d in view_revisions])
272
288
        if min_depth != 0:
273
289
            view_revisions = [(r,n,d-min_depth) for r,n,d in view_revisions]
274
 
        
275
 
    rev_tag_dict = {}
276
 
    generate_tags = getattr(lf, 'supports_tags', False)
277
 
    if generate_tags:
278
 
        if branch.supports_tags():
279
 
            rev_tag_dict = branch.tags.get_reverse_tag_dict()
280
 
 
281
 
    generate_delta = verbose and getattr(lf, 'supports_delta', False)
282
 
 
283
 
    def iter_revisions():
 
290
    return view_revisions
 
291
 
 
292
 
 
293
def _linear_view_revisions(branch):
 
294
    start_revno, start_revision_id = branch.last_revision_info()
 
295
    repo = branch.repository
 
296
    revision_ids = repo.iter_reverse_revision_history(start_revision_id)
 
297
    for num, revision_id in enumerate(revision_ids):
 
298
        yield revision_id, str(start_revno - num), 0
 
299
 
 
300
 
 
301
def _iter_revisions(repository, view_revisions, generate_delta):
 
302
    num = 9
 
303
    view_revisions = iter(view_revisions)
 
304
    while True:
 
305
        cur_view_revisions = [d for x, d in zip(range(num), view_revisions)]
 
306
        if len(cur_view_revisions) == 0:
 
307
            break
 
308
        cur_deltas = {}
284
309
        # r = revision, n = revno, d = merge depth
285
 
        revision_ids = [r for r, n, d in view_revisions]
286
 
        num = 9
287
 
        repository = branch.repository
288
 
        while revision_ids:
289
 
            cur_deltas = {}
290
 
            revisions = repository.get_revisions(revision_ids[:num])
291
 
            if generate_delta:
292
 
                deltas = repository.get_deltas_for_revisions(revisions)
293
 
                cur_deltas = dict(izip((r.revision_id for r in revisions),
294
 
                                       deltas))
295
 
            for revision in revisions:
296
 
                yield revision, cur_deltas.get(revision.revision_id)
297
 
            revision_ids  = revision_ids[num:]
298
 
            num = min(int(num * 1.5), 200)
299
 
 
300
 
    # now we just print all the revisions
301
 
    log_count = 0
302
 
    for ((rev_id, revno, merge_depth), (rev, delta)) in \
303
 
         izip(view_revisions, iter_revisions()):
304
 
 
305
 
        if searchRE:
306
 
            if not searchRE.search(rev.message):
307
 
                continue
308
 
 
309
 
        if not legacy_lf:
310
 
            lr = LogRevision(rev, revno, merge_depth, delta,
311
 
                             rev_tag_dict.get(rev_id))
312
 
            lf.log_revision(lr)
313
 
        else:
314
 
            # support for legacy (pre-0.17) LogFormatters
315
 
            if merge_depth == 0:
316
 
                if generate_tags:
317
 
                    lf.show(revno, rev, delta, rev_tag_dict.get(rev_id))
318
 
                else:
319
 
                    lf.show(revno, rev, delta)
320
 
            else:
321
 
                if show_merge_revno is None:
322
 
                    lf.show_merge(rev, merge_depth)
323
 
                else:
324
 
                    if generate_tags:
325
 
                        lf.show_merge_revno(rev, merge_depth, revno,
326
 
                                            rev_tag_dict.get(rev_id))
327
 
                    else:
328
 
                        lf.show_merge_revno(rev, merge_depth, revno)
329
 
        if limit:
330
 
            log_count += 1
331
 
            if log_count >= limit:
332
 
                break
 
310
        revision_ids = [r for (r, n, d) in cur_view_revisions]
 
311
        revisions = repository.get_revisions(revision_ids)
 
312
        if generate_delta:
 
313
            deltas = repository.get_deltas_for_revisions(revisions)
 
314
            cur_deltas = dict(izip((r.revision_id for r in revisions),
 
315
                                   deltas))
 
316
        for view_data, revision in izip(cur_view_revisions, revisions):
 
317
            yield view_data, revision, cur_deltas.get(revision.revision_id)
 
318
        num = min(int(num * 1.5), 200)
333
319
 
334
320
 
335
321
def _get_mainline_revs(branch, start_revision, end_revision):
474
460
    weave_modifed_revisions = set(file_weave.versions())
475
461
    # build the ancestry of each revision in the graph
476
462
    # - only listing the ancestors that change the specific file.
477
 
    rev_graph = branch.repository.get_revision_graph(mainline_revisions[-1])
478
 
    sorted_rev_list = topo_sort(rev_graph)
 
463
    graph = branch.repository.get_graph()
 
464
    # This asks for all mainline revisions, which means we only have to spider
 
465
    # sideways, rather than depth history. That said, its still size-of-history
 
466
    # and should be addressed.
 
467
    parent_map = dict(((key, value) for key, value in
 
468
        graph.iter_ancestry(mainline_revisions) if value is not None))
 
469
    sorted_rev_list = topo_sort(parent_map.items())
479
470
    ancestry = {}
480
471
    for rev in sorted_rev_list:
481
 
        parents = rev_graph[rev]
 
472
        parents = parent_map[rev]
482
473
        if rev not in weave_modifed_revisions and len(parents) == 1:
483
474
            # We will not be adding anything new, so just use a reference to
484
475
            # the parent ancestry.
492
483
        ancestry[rev] = rev_ancestry
493
484
 
494
485
    def is_merging_rev(r):
495
 
        parents = rev_graph[r]
 
486
        parents = parent_map[r]
496
487
        if len(parents) > 1:
497
488
            leftparent = parents[0]
498
489
            for rightparent in parents[1:]:
520
511
        for revision_id in revision_ids:
521
512
            yield revision_id, str(rev_nos[revision_id]), 0
522
513
        return
 
514
    graph = branch.repository.get_graph()
 
515
    # This asks for all mainline revisions, which means we only have to spider
 
516
    # sideways, rather than depth history. That said, its still size-of-history
 
517
    # and should be addressed.
 
518
    parent_map = dict(((key, value) for key, value in
 
519
        graph.iter_ancestry(mainline_revs) if value is not None))
 
520
    # filter out ghosts; merge_sort errors on ghosts.
 
521
    rev_graph = _strip_NULL_ghosts(parent_map)
523
522
    merge_sorted_revisions = merge_sort(
524
 
        branch.repository.get_revision_graph(mainline_revs[-1]),
 
523
        rev_graph,
525
524
        mainline_revs[-1],
526
525
        mainline_revs,
527
526
        generate_revno=True)
616
615
#        """
617
616
#        raise NotImplementedError('not implemented in abstract base')
618
617
 
619
 
    @deprecated_method(zero_seventeen)
620
 
    def show(self, revno, rev, delta):
621
 
        raise NotImplementedError('not implemented in abstract base')
622
 
 
623
618
    def short_committer(self, rev):
624
619
        name, address = config.parse_username(rev.committer)
625
620
        if name:
639
634
    supports_delta = True
640
635
    supports_tags = True
641
636
 
642
 
    @deprecated_method(zero_seventeen)
643
 
    def show(self, revno, rev, delta, tags=None):
644
 
        lr = LogRevision(rev, revno, 0, delta, tags)
645
 
        return self.log_revision(lr)
646
 
 
647
 
    @deprecated_method(zero_seventeen)
648
 
    def show_merge_revno(self, rev, merge_depth, revno, tags=None):
649
 
        """Show a merged revision rev, with merge_depth and a revno."""
650
 
        lr = LogRevision(rev, revno, merge_depth, tags=tags)
651
 
        return self.log_revision(lr)
652
 
 
653
637
    def log_revision(self, revision):
654
638
        """Log a revision, either merged or not."""
655
639
        indent = '    ' * revision.merge_depth
660
644
        if revision.tags:
661
645
            to_file.write(indent + 'tags: %s\n' % (', '.join(revision.tags)))
662
646
        if self.show_ids:
663
 
            to_file.write(indent + 'revision-id:' + revision.rev.revision_id)
 
647
            to_file.write(indent + 'revision-id: ' + revision.rev.revision_id)
664
648
            to_file.write('\n')
665
649
            for parent_id in revision.rev.parent_ids:
666
650
                to_file.write(indent + 'parent: %s\n' % (parent_id,))
695
679
    supports_delta = True
696
680
    supports_single_merge_revision = True
697
681
 
698
 
    @deprecated_method(zero_seventeen)
699
 
    def show(self, revno, rev, delta):
700
 
        lr = LogRevision(rev, revno, 0, delta)
701
 
        return self.log_revision(lr)
702
 
 
703
682
    def log_revision(self, revision):
704
683
        to_file = self.to_file
705
684
        date_str = format_date(revision.rev.timestamp,
755
734
        else:
756
735
            return rev.message
757
736
 
758
 
    @deprecated_method(zero_seventeen)
759
 
    def show(self, revno, rev, delta):
760
 
        self.to_file.write(self.log_string(revno, rev, terminal_width()-1))
761
 
        self.to_file.write('\n')
762
 
 
763
737
    def log_revision(self, revision):
764
738
        self.to_file.write(self.log_string(revision.revno, revision.rev,
765
739
                                              self._max_chars))