/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: Mateusz Korniak
  • Date: 2007-09-02 15:26:42 UTC
  • mto: This revision was merged to the branch mainline in revision 274.
  • Revision ID: matkor@laptop-hp-20070902152642-kkzpolnsn8hr7upv
Added RevisionControl;Qt;KDE to Categories, pl descriptions

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