/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:07:23 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629190723-l8mzg9x4oec0lhsl
Return cleartext from seahorse module

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
        
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.properties.get('author',
88
 
                        revision.committer)
 
94
                    author = revision.get_apparent_author()
89
95
 
90
96
                if revision.revision_id not in self.revisions:
91
97
                    self.revisions[revision.revision_id] = revision
92
98
 
93
99
                self.annomodel.append([revision.revision_id,
94
100
                                       line_no + 1,
95
 
                                       committer,
 
101
                                       author,
96
102
                                       revno,
97
103
                                       None,
98
104
                                       line.rstrip("\r\n")
108
114
 
109
115
        self.annoview.set_model(self.annomodel)
110
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)
111
120
 
112
121
    def jump_to_line(self, lineno):
113
122
        if lineno > len(self.annomodel) or lineno < 1:
123
132
        self.annoview.set_cursor(row)
124
133
        self.annoview.scroll_to_cell(row, use_align=True)
125
134
 
126
 
    def _dotted_revnos(self, repository, revision_id):
127
 
        """Return a dict of revision_id -> dotted revno
128
 
        
129
 
        :param repository: The repository to get the graph from
130
 
        :param revision_id: The last revision for which this info is needed
131
 
        """
132
 
        graph = repository.get_revision_graph(revision_id)
133
 
        dotted = {}
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)
137
 
        return dotted
138
135
 
139
136
    def _annotate(self, tree, file_id):
140
137
        current_revision = FakeRevision(CURRENT_REVISION)
149
146
            revision_id = self.branch.last_revision()
150
147
        else:
151
148
            revision_id = self.revision_id
152
 
        dotted = self._dotted_revnos(repository, revision_id)
153
149
        revision_cache = RevisionCache(repository, self.revisions)
154
150
        for origin, text in tree.annotate_iter(file_id):
155
151
            rev_id = origin
159
155
            else:
160
156
                try:
161
157
                    revision = revision_cache.get_revision(rev_id)
162
 
                    revno = dotted.get(rev_id, 'merge')
 
158
                    revno = self.dotted.get(rev_id, 'merge')
163
159
                    if len(revno) > 15:
164
160
                        revno = 'merge'
165
161
                except NoSuchRevision:
182
178
 
183
179
    def _activate_selected_revision(self, w):
184
180
        rev_id = self._selected_revision()
185
 
        if rev_id is None:
 
181
        if not rev_id or rev_id == NULL_REVISION:
186
182
            return
187
183
        selected = self.revisions[rev_id]
188
 
        self.logview.set_revision(selected)
 
184
        self.revisionview.set_revision(selected)
189
185
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
190
186
            self._no_back):
191
187
            enable_back = True
194
190
        self.back_button.set_sensitive(enable_back)
195
191
 
196
192
    def _create(self):
197
 
        self.logview = self._create_log_view()
 
193
        self.revisionview = self._create_log_view()
198
194
        self.annoview = self._create_annotate_view()
199
195
 
200
196
        vbox = gtk.VBox(False)
221
217
        
222
218
        self.pane = pane = gtk.VPaned()
223
219
        pane.add1(swbox)
224
 
        pane.add2(self.logview)
 
220
        pane.add2(self.revisionview)
225
221
        pane.show()
226
222
        vbox.pack_start(pane, expand=True, fill=True)
227
223
 
246
242
        self._search.show_for('line')
247
243
        self._search.set_target(self.annoview, LINE_NUM_COL)
248
244
 
249
 
    def row_diff(self, tv, path, tvc):
 
245
    def line_diff(self, tv, path, tvc):
250
246
        row = path[0]
251
247
        revision = self.annotations[row]
252
248
        repository = self.branch.repository
261
257
                tree2 = repository.revision_tree(NULL_REVISION)
262
258
        from bzrlib.plugins.gtk.diff import DiffWindow
263
259
        window = DiffWindow()
264
 
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
 
260
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
265
261
        window.set_file(tree1.id2path(self.file_id))
266
262
        window.show()
267
263
 
271
267
        tv.set_rules_hint(False)
272
268
        tv.connect("cursor-changed", self._activate_selected_revision)
273
269
        tv.show()
274
 
        tv.connect("row-activated", self.row_diff)
 
270
        tv.connect("row-activated", self.line_diff)
275
271
 
276
272
        cell = gtk.CellRendererText()
277
273
        cell.set_property("xalign", 1.0)
325
321
        return tv
326
322
 
327
323
    def _create_log_view(self):
328
 
        lv = LogView()
 
324
        lv = RevisionView(self._branch)
329
325
        lv.show()
330
326
        return lv
331
327
 
393
389
                return j - i
394
390
 
395
391
 
396
 
 
397
392
class FakeRevision:
398
393
    """ A fake revision.
399
394
 
409
404
        self.timezone = 0
410
405
        self.properties = {}
411
406
 
 
407
    def get_apparent_author(self):
 
408
        return self.committer
 
409
 
412
410
 
413
411
class RevisionCache(object):
414
412
    """A caching revision source"""