/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-07-21 13:16:33 UTC
  • mto: This revision was merged to the branch mainline in revision 248.
  • Revision ID: matkor@laptop-hp-20070721131633-t40kxs20j1q2fvvc
Context menu "Remove and delete added"
Acts like "Remove" but also deletes file locally.

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