/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/annotate.py

  • Committer: Martin Pool
  • Date: 2011-05-20 14:46:02 UTC
  • mto: This revision was merged to the branch mainline in revision 5923.
  • Revision ID: mbp@canonical.com-20110520144602-bqli0t6dj01gl0pv
Various pyflakes import fixes.

Some modules were used for subclassing or at module load time, so there is no
point loading them lazily.

Some were not imported when they should be.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
28
28
import sys
29
29
import time
30
30
 
 
31
from bzrlib.lazy_import import lazy_import
 
32
lazy_import(globals(), """
 
33
from bzrlib import (
 
34
    patiencediff,
 
35
    tsort,
 
36
    )
 
37
""")
31
38
from bzrlib import (
32
39
    errors,
33
40
    osutils,
34
 
    patiencediff,
35
 
    tsort,
36
41
    )
37
42
from bzrlib.config import extract_email_address
38
43
from bzrlib.repository import _strip_NULL_ghosts
39
 
from bzrlib.revision import CURRENT_REVISION, Revision
40
 
 
41
 
 
 
44
from bzrlib.revision import (
 
45
    CURRENT_REVISION,
 
46
    Revision,
 
47
    )
 
48
from bzrlib.symbol_versioning import (
 
49
    deprecated_function,
 
50
    deprecated_in,
 
51
    )
 
52
 
 
53
 
 
54
@deprecated_function(deprecated_in((2, 4, 0)))
42
55
def annotate_file(branch, rev_id, file_id, verbose=False, full=False,
43
56
                  to_file=None, show_ids=False):
44
57
    """Annotate file_id at revision rev_id in branch.
55
68
        used.
56
69
    :param show_ids: Show revision ids in the annotation output.
57
70
    """
58
 
    if to_file is None:
59
 
        to_file = sys.stdout
60
 
 
61
 
    # Handle the show_ids case
62
 
    annotations = _annotations(branch.repository, file_id, rev_id)
63
 
    if show_ids:
64
 
        return _show_id_annotations(annotations, to_file, full)
65
 
 
66
 
    # Calculate the lengths of the various columns
67
 
    annotation = list(_expand_annotations(annotations, branch))
68
 
    _print_annotations(annotation, verbose, to_file, full)
 
71
    tree = branch.repository.revision_tree(rev_id)
 
72
    annotate_file_tree(tree, file_id, to_file, verbose=verbose,
 
73
        full=full, show_ids=show_ids, branch=branch)
69
74
 
70
75
 
71
76
def annotate_file_tree(tree, file_id, to_file, verbose=False, full=False,
72
 
    show_ids=False):
 
77
    show_ids=False, branch=None):
73
78
    """Annotate file_id in a tree.
74
79
 
75
80
    The tree should already be read_locked() when annotate_file_tree is called.
81
86
        reasonable text width.
82
87
    :param full: XXXX Not sure what this does.
83
88
    :param show_ids: Show revision ids in the annotation output.
 
89
    :param branch: Branch to use for revision revno lookups
84
90
    """
85
 
    rev_id = tree.last_revision()
86
 
    branch = tree.branch
 
91
    if branch is None:
 
92
        branch = tree.branch
 
93
    if to_file is None:
 
94
        to_file = sys.stdout
87
95
 
88
96
    # Handle the show_ids case
89
97
    annotations = list(tree.annotate_iter(file_id))
90
98
    if show_ids:
91
99
        return _show_id_annotations(annotations, to_file, full)
92
100
 
93
 
    # Create a virtual revision to represent the current tree state.
94
 
    # Should get some more pending commit attributes, like pending tags,
95
 
    # bugfixes etc.
96
 
    current_rev = Revision(CURRENT_REVISION)
97
 
    current_rev.parent_ids = tree.get_parent_ids()
98
 
    current_rev.committer = tree.branch.get_config().username()
99
 
    current_rev.message = "?"
100
 
    current_rev.timestamp = round(time.time(), 3)
101
 
    current_rev.timezone = osutils.local_time_offset()
102
 
    annotation = list(_expand_annotations(annotations, tree.branch,
 
101
    if not getattr(tree, "get_revision_id", False):
 
102
        # Create a virtual revision to represent the current tree state.
 
103
        # Should get some more pending commit attributes, like pending tags,
 
104
        # bugfixes etc.
 
105
        current_rev = Revision(CURRENT_REVISION)
 
106
        current_rev.parent_ids = tree.get_parent_ids()
 
107
        current_rev.committer = branch.get_config().username()
 
108
        current_rev.message = "?"
 
109
        current_rev.timestamp = round(time.time(), 3)
 
110
        current_rev.timezone = osutils.local_time_offset()
 
111
    else:
 
112
        current_rev = None
 
113
    annotation = list(_expand_annotations(annotations, branch,
103
114
        current_rev))
104
115
    _print_annotations(annotation, verbose, to_file, full)
105
116
 
165
176
    return
166
177
 
167
178
 
168
 
def _annotations(repo, file_id, rev_id):
169
 
    """Return the list of (origin_revision_id, line_text) for a revision of a file in a repository."""
170
 
    annotations = repo.texts.annotate((file_id, rev_id))
171
 
    #
172
 
    return [(key[-1], line) for (key, line) in annotations]
173
 
 
174
 
 
175
179
def _expand_annotations(annotations, branch, current_rev=None):
176
180
    """Expand a file's annotations into command line UI ready tuples.
177
181
 
184
188
    """
185
189
    repository = branch.repository
186
190
    if current_rev is not None:
187
 
        # This can probably become a function on MutableTree, get_revno_map there,
188
 
        # or something.
 
191
        # This can probably become a function on MutableTree, get_revno_map
 
192
        # there, or something.
189
193
        last_revision = current_rev.revision_id
190
194
        # XXX: Partially Cloned from branch, uses the old_get_graph, eep.
191
195
        # XXX: The main difficulty is that we need to inject a single new node
312
316
 
313
317
 
314
318
def _get_matching_blocks(old, new):
315
 
    matcher = patiencediff.PatienceSequenceMatcher(None,
316
 
        old, new)
 
319
    matcher = patiencediff.PatienceSequenceMatcher(None, old, new)
317
320
    return matcher.get_matching_blocks()
318
321
 
319
322