/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to annotate/gannotate.py

  • Committer: Jelmer Vernooij
  • Date: 2008-06-29 19:18:34 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629191834-ha2ecpv5szt96nge
Make sure signed testament matches repository data.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
29
29
 
30
30
from colormap import AnnotateColorMap, AnnotateColorSaturation
31
 
from bzrlib.plugins.gtk.logview import LogView
 
31
from bzrlib.plugins.gtk.revisionview import RevisionView
 
32
from bzrlib.plugins.gtk.window import Window
32
33
 
33
34
 
34
35
(
41
42
) = range(6)
42
43
 
43
44
 
44
 
class GAnnotateWindow(gtk.Window):
 
45
class GAnnotateWindow(Window):
45
46
    """Annotate window."""
46
47
 
47
 
    def __init__(self, all=False, plain=False):
 
48
    def __init__(self, all=False, plain=False, parent=None, branch=None):
48
49
        self.all = all
49
50
        self.plain = plain
 
51
        self._branch = branch
50
52
        
51
 
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
 
53
        Window.__init__(self, parent)
52
54
        
53
55
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
54
56
        self.annotate_colormap = AnnotateColorSaturation()
63
65
        self.branch = branch
64
66
        self.tree = tree
65
67
        self.file_id = file_id
 
68
        self.revisionview.set_file_id(file_id)
66
69
        self.revision_id = getattr(tree, 'get_revision_id', 
67
70
                                   lambda: CURRENT_REVISION)()
68
71
        
69
 
        # [revision id, line number, committer, revno, highlight color, line]
 
72
        # [revision id, line number, author, revno, highlight color, line]
70
73
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
71
74
                                       gobject.TYPE_STRING,
72
75
                                       gobject.TYPE_STRING,
78
81
        try:
79
82
            branch.lock_read()
80
83
            branch.repository.lock_read()
 
84
            self.dotted = {}
 
85
            revno_map = self.branch.get_revision_id_to_revno_map()
 
86
            for revision_id, revno in revno_map.iteritems():
 
87
                self.dotted[revision_id] = '.'.join(str(num) for num in revno)
81
88
            for line_no, (revision, revno, line)\
82
89
                    in enumerate(self._annotate(tree, file_id)):
83
90
                if revision.revision_id == last_seen and not self.all:
84
 
                    revno = committer = ""
 
91
                    revno = author = ""
85
92
                else:
86
93
                    last_seen = revision.revision_id
87
 
                    committer = revision.committer
 
94
                    author = revision.get_apparent_author()
88
95
 
89
96
                if revision.revision_id not in self.revisions:
90
97
                    self.revisions[revision.revision_id] = revision
91
98
 
92
99
                self.annomodel.append([revision.revision_id,
93
100
                                       line_no + 1,
94
 
                                       committer,
 
101
                                       author,
95
102
                                       revno,
96
103
                                       None,
97
104
                                       line.rstrip("\r\n")
107
114
 
108
115
        self.annoview.set_model(self.annomodel)
109
116
        self.annoview.grab_focus()
 
117
        my_revno = self.dotted.get(self.revision_id, 'current')
 
118
        title = '%s (%s) - gannotate' % (self.tree.id2path(file_id), my_revno)
 
119
        self.set_title(title)
110
120
 
111
121
    def jump_to_line(self, lineno):
112
122
        if lineno > len(self.annomodel) or lineno < 1:
122
132
        self.annoview.set_cursor(row)
123
133
        self.annoview.scroll_to_cell(row, use_align=True)
124
134
 
125
 
    def _dotted_revnos(self, repository, revision_id):
126
 
        """Return a dict of revision_id -> dotted revno
127
 
        
128
 
        :param repository: The repository to get the graph from
129
 
        :param revision_id: The last revision for which this info is needed
130
 
        """
131
 
        graph = repository.get_revision_graph(revision_id)
132
 
        dotted = {}
133
 
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
134
 
            revision_id, generate_revno=True):
135
 
            dotted[revision_id] = '.'.join(str(num) for num in revno)
136
 
        return dotted
137
135
 
138
136
    def _annotate(self, tree, file_id):
139
137
        current_revision = FakeRevision(CURRENT_REVISION)
148
146
            revision_id = self.branch.last_revision()
149
147
        else:
150
148
            revision_id = self.revision_id
151
 
        dotted = self._dotted_revnos(repository, revision_id)
152
149
        revision_cache = RevisionCache(repository, self.revisions)
153
150
        for origin, text in tree.annotate_iter(file_id):
154
151
            rev_id = origin
158
155
            else:
159
156
                try:
160
157
                    revision = revision_cache.get_revision(rev_id)
161
 
                    revno = dotted.get(rev_id, 'merge')
 
158
                    revno = self.dotted.get(rev_id, 'merge')
162
159
                    if len(revno) > 15:
163
160
                        revno = 'merge'
164
161
                except NoSuchRevision:
181
178
 
182
179
    def _activate_selected_revision(self, w):
183
180
        rev_id = self._selected_revision()
184
 
        if rev_id is None:
 
181
        if not rev_id or rev_id == NULL_REVISION:
185
182
            return
186
183
        selected = self.revisions[rev_id]
187
 
        self.logview.set_revision(selected)
 
184
        self.revisionview.set_revision(selected)
188
185
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
189
186
            self._no_back):
190
187
            enable_back = True
193
190
        self.back_button.set_sensitive(enable_back)
194
191
 
195
192
    def _create(self):
196
 
        self.logview = self._create_log_view()
 
193
        self.revisionview = self._create_log_view()
197
194
        self.annoview = self._create_annotate_view()
198
195
 
199
196
        vbox = gtk.VBox(False)
220
217
        
221
218
        self.pane = pane = gtk.VPaned()
222
219
        pane.add1(swbox)
223
 
        pane.add2(self.logview)
 
220
        pane.add2(self.revisionview)
224
221
        pane.show()
225
222
        vbox.pack_start(pane, expand=True, fill=True)
226
223
 
245
242
        self._search.show_for('line')
246
243
        self._search.set_target(self.annoview, LINE_NUM_COL)
247
244
 
248
 
    def row_diff(self, tv, path, tvc):
 
245
    def line_diff(self, tv, path, tvc):
249
246
        row = path[0]
250
247
        revision = self.annotations[row]
251
248
        repository = self.branch.repository
260
257
                tree2 = repository.revision_tree(NULL_REVISION)
261
258
        from bzrlib.plugins.gtk.diff import DiffWindow
262
259
        window = DiffWindow()
263
 
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
 
260
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
264
261
        window.set_file(tree1.id2path(self.file_id))
265
262
        window.show()
266
263
 
270
267
        tv.set_rules_hint(False)
271
268
        tv.connect("cursor-changed", self._activate_selected_revision)
272
269
        tv.show()
273
 
        tv.connect("row-activated", self.row_diff)
 
270
        tv.connect("row-activated", self.line_diff)
274
271
 
275
272
        cell = gtk.CellRendererText()
276
273
        cell.set_property("xalign", 1.0)
324
321
        return tv
325
322
 
326
323
    def _create_log_view(self):
327
 
        lv = LogView()
 
324
        lv = RevisionView(self._branch)
328
325
        lv.show()
329
326
        return lv
330
327
 
392
389
                return j - i
393
390
 
394
391
 
395
 
 
396
392
class FakeRevision:
397
393
    """ A fake revision.
398
394
 
408
404
        self.timezone = 0
409
405
        self.properties = {}
410
406
 
 
407
    def get_apparent_author(self):
 
408
        return self.committer
 
409
 
411
410
 
412
411
class RevisionCache(object):
413
412
    """A caching revision source"""