25
from bzrlib import tsort
26
25
from bzrlib.errors import NoSuchRevision
27
from bzrlib.revision import NULL_REVISION
29
27
from colormap import AnnotateColorMap, AnnotateColorSaturation
30
28
from logview import LogView
59
57
self.span_selector.hide()
61
def annotate(self, branch, file_id, revision_id=None):
59
def annotate(self, branch, file_id):
62
60
self.revisions = {}
65
self.file_id = file_id
66
self.revision_id = revision_id
68
62
# [revision id, line number, committer, revno, highlight color, line]
69
63
self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
79
73
branch.repository.lock_read()
80
74
for line_no, (revision, revno, line)\
81
in enumerate(self._annotate(branch, file_id, revision_id)):
75
in enumerate(self._annotate(branch, file_id)):
82
76
if revision.revision_id == last_seen and not self.all:
83
77
revno = committer = ""
117
110
print("gannotate: Line number %d does't exist. Defaulting to "
118
111
"line 1." % lineno)
123
115
self.annoview.set_cursor(row)
124
self.annoview.scroll_to_cell(row, use_align=True)
126
def _dotted_revnos(self, repository, revision_id):
127
"""Return a dict of revision_id -> dotted revno
129
:param repository: The repository to get the graph from
130
:param revision_id: The last revision for which this info is needed
132
graph = repository.get_revision_graph(revision_id)
134
for n, revision_id, d, revno, e in tsort.merge_sort(graph,
135
revision_id, generate_revno=True):
136
dotted[revision_id] = '.'.join(str(num) for num in revno)
139
def _annotate(self, branch, file_id, revision_id):
117
def _annotate(self, branch, file_id):
118
rev_hist = branch.revision_history()
140
119
repository = branch.repository
141
if revision_id is None:
142
revision_id = branch.last_revision()
143
dotted = self._dotted_revnos(repository, revision_id)
144
rev_tree = repository.revision_tree(revision_id)
145
revision_id = rev_tree.inventory[file_id].revision
120
rev_tree = repository.revision_tree(branch.last_revision())
121
rev_id = rev_tree.inventory[file_id].revision
146
122
weave = repository.weave_store.get_weave(file_id,
147
123
branch.get_transaction())
149
125
revision_cache = RevisionCache(repository)
150
for origin, text in weave.annotate_iter(revision_id):
126
for origin, text in weave.annotate_iter(rev_id):
153
129
revision = revision_cache.get_revision(rev_id)
154
revno = dotted.get(rev_id, 'merge')
130
if rev_id in rev_hist:
131
revno = branch.revision_id_to_revno(rev_id)
157
134
except NoSuchRevision:
158
135
revision = NoneRevision(rev_id)
227
def row_diff(self, tv, path, tvc):
229
revision = self.annotations[row]
230
repository = self.branch.repository
231
tree1 = repository.revision_tree(revision.revision_id)
232
if len(revision.parent_ids) > 0:
233
tree2 = repository.revision_tree(revision.parent_ids[0])
235
tree2 = repository.revision_tree(NULL_REVISION)
236
from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
237
window = DiffWindow()
238
window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
239
window.set_file(tree1.id2path(self.file_id))
243
199
def _create_annotate_view(self):
244
200
tv = gtk.TreeView()
245
201
tv.set_rules_hint(False)
246
202
tv.connect("cursor-changed", self._show_log)
248
tv.connect("row-activated", self.row_diff)
250
205
cell = gtk.CellRendererText()
251
206
cell.set_property("xalign", 1.0)