~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/annotate.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-09-20 00:57:43 UTC
  • mfrom: (2834.1.1 ianc-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070920005743-h4qqzyty2apbhjta
annotate.py code cleanups (Ian Clatworthy)

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
    if to_file is None:
43
43
        to_file = sys.stdout
44
44
 
45
 
    prevanno=''
 
45
    # Handle the show_ids case
46
46
    last_rev_id = None
47
47
    if show_ids:
48
 
        w = branch.repository.weave_store.get_weave(file_id,
49
 
            branch.repository.get_transaction())
50
 
        annotations = list(w.annotate_iter(rev_id))
 
48
        annotations = _annotations(branch.repository, file_id, rev_id)
51
49
        max_origin_len = max(len(origin) for origin, text in annotations)
52
50
        for origin, text in annotations:
53
51
            if full or last_rev_id != origin:
58
56
            last_rev_id = origin
59
57
        return
60
58
 
 
59
    # Calculate the lengths of the various columns
61
60
    annotation = list(_annotate_file(branch, rev_id, file_id))
62
61
    if len(annotation) == 0:
63
62
        max_origin_len = max_revno_len = max_revid_len = 0
65
64
        max_origin_len = max(len(x[1]) for x in annotation)
66
65
        max_revno_len = max(len(x[0]) for x in annotation)
67
66
        max_revid_len = max(len(x[3]) for x in annotation)
68
 
 
69
67
    if not verbose:
70
68
        max_revno_len = min(max_revno_len, 12)
71
69
    max_revno_len = max(max_revno_len, 3)
72
70
 
 
71
    # Output the annotations
 
72
    prevanno = ''
 
73
    encoding = getattr(to_file, 'encoding', None) or \
 
74
            osutils.get_terminal_encoding()
73
75
    for (revno_str, author, date_str, line_rev_id, text) in annotation:
74
76
        if verbose:
75
77
            anno = '%-*s %-*s %8s ' % (max_revno_len, revno_str,
78
80
            if len(revno_str) > max_revno_len:
79
81
                revno_str = revno_str[:max_revno_len-1] + '>'
80
82
            anno = "%-*s %-7s " % (max_revno_len, revno_str, author[:7])
81
 
 
82
 
        if anno.lstrip() == "" and full: anno = prevanno
 
83
        if anno.lstrip() == "" and full:
 
84
            anno = prevanno
83
85
        try:
84
86
            to_file.write(anno)
85
87
        except UnicodeEncodeError:
89
91
            # a user function (non-scripting), so shouldn't die because of
90
92
            # unrepresentable annotation characters. So encode using 'replace',
91
93
            # and write them again.
92
 
            encoding = getattr(to_file, 'encoding', None) or \
93
 
                    osutils.get_terminal_encoding()
94
94
            to_file.write(anno.encode(encoding, 'replace'))
95
95
        print >>to_file, '| %s' % (text,)
96
 
        prevanno=anno
 
96
        prevanno = anno
 
97
 
 
98
 
 
99
def _annotations(repo, file_id, rev_id):
 
100
    """Return the list of (origin,text) for a revision of a file in a repository."""
 
101
    w = repo.weave_store.get_weave(file_id, repo.get_transaction())
 
102
    return list(w.annotate_iter(rev_id))
97
103
 
98
104
 
99
105
def _annotate_file(branch, rev_id, file_id):
103
109
    date string for the commit, rather than just the revision id.
104
110
    """
105
111
    revision_id_to_revno = branch.get_revision_id_to_revno_map()
106
 
    w = branch.repository.weave_store.get_weave(file_id,
107
 
        branch.repository.get_transaction())
 
112
    annotations = _annotations(branch.repository, file_id, rev_id)
108
113
    last_origin = None
109
 
    annotations = list(w.annotate_iter(rev_id))
110
114
    revision_ids = set(o for o, t in annotations)
111
115
    revision_ids = [o for o in revision_ids if 
112
116
                    branch.repository.has_revision(o)]
173
177
 
174
178
def _reannotate(parent_lines, new_lines, new_revision_id,
175
179
                matching_blocks=None):
176
 
    plain_parent_lines = [l for r, l in parent_lines]
177
 
    matcher = patiencediff.PatienceSequenceMatcher(None, plain_parent_lines,
178
 
                                                   new_lines)
179
180
    new_cur = 0
180
181
    if matching_blocks is None:
 
182
        plain_parent_lines = [l for r, l in parent_lines]
 
183
        matcher = patiencediff.PatienceSequenceMatcher(None,
 
184
            plain_parent_lines, new_lines)
181
185
        matching_blocks = matcher.get_matching_blocks()
182
186
    for i, j, n in matching_blocks:
183
187
        for line in new_lines[new_cur:j]: