/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: Daniel Schierbeck
  • Date: 2008-01-13 14:12:49 UTC
  • mto: (423.1.2 trunk)
  • mto: This revision was merged to the branch mainline in revision 429.
  • Revision ID: daniel.schierbeck@gmail.com-20080113141249-gd0i2lknr3yik55r
Moved branch view to its own package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
class GAnnotateWindow(Window):
46
46
    """Annotate window."""
47
47
 
48
 
    def __init__(self, all=False, plain=False, parent=None, branch=None):
 
48
    def __init__(self, all=False, plain=False, parent=None):
49
49
        self.all = all
50
50
        self.plain = plain
51
 
        self._branch = branch
52
51
        
53
52
        Window.__init__(self, parent)
54
53
        
81
80
        try:
82
81
            branch.lock_read()
83
82
            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
83
            for line_no, (revision, revno, line)\
89
84
                    in enumerate(self._annotate(tree, file_id)):
90
85
                if revision.revision_id == last_seen and not self.all:
91
86
                    revno = author = ""
92
87
                else:
93
88
                    last_seen = revision.revision_id
94
 
                    author = ", ".join(revision.get_apparent_authors())
 
89
                    author = revision.get_apparent_author()
95
90
 
96
91
                if revision.revision_id not in self.revisions:
97
92
                    self.revisions[revision.revision_id] = revision
114
109
 
115
110
        self.annoview.set_model(self.annomodel)
116
111
        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
112
 
121
113
    def jump_to_line(self, lineno):
122
114
        if lineno > len(self.annomodel) or lineno < 1:
132
124
        self.annoview.set_cursor(row)
133
125
        self.annoview.scroll_to_cell(row, use_align=True)
134
126
 
 
127
    def _dotted_revnos(self, repository, revision_id):
 
128
        """Return a dict of revision_id -> dotted revno
 
129
        
 
130
        :param repository: The repository to get the graph from
 
131
        :param revision_id: The last revision for which this info is needed
 
132
        """
 
133
        graph = repository.get_revision_graph(revision_id)
 
134
        dotted = {}
 
135
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
 
136
            revision_id, generate_revno=True):
 
137
            dotted[revision_id] = '.'.join(str(num) for num in revno)
 
138
        return dotted
135
139
 
136
140
    def _annotate(self, tree, file_id):
137
141
        current_revision = FakeRevision(CURRENT_REVISION)
139
143
        current_revision.timestamp = time.time()
140
144
        current_revision.message = '[Not yet committed]'
141
145
        current_revision.parent_ids = tree.get_parent_ids()
142
 
        current_revision.properties['branch-nick'] = self.branch._get_nick(local=True)
 
146
        current_revision.properties['branch-nick'] = self.branch.nick
143
147
        current_revno = '%d?' % (self.branch.revno() + 1)
144
148
        repository = self.branch.repository
145
149
        if self.revision_id == CURRENT_REVISION:
146
150
            revision_id = self.branch.last_revision()
147
151
        else:
148
152
            revision_id = self.revision_id
 
153
        dotted = self._dotted_revnos(repository, revision_id)
149
154
        revision_cache = RevisionCache(repository, self.revisions)
150
155
        for origin, text in tree.annotate_iter(file_id):
151
156
            rev_id = origin
155
160
            else:
156
161
                try:
157
162
                    revision = revision_cache.get_revision(rev_id)
158
 
                    revno = self.dotted.get(rev_id, 'merge')
 
163
                    revno = dotted.get(rev_id, 'merge')
159
164
                    if len(revno) > 15:
160
165
                        revno = 'merge'
161
166
                except NoSuchRevision:
178
183
 
179
184
    def _activate_selected_revision(self, w):
180
185
        rev_id = self._selected_revision()
181
 
        if not rev_id or rev_id == NULL_REVISION:
 
186
        if rev_id is None:
182
187
            return
183
188
        selected = self.revisions[rev_id]
184
189
        self.revisionview.set_revision(selected)
212
217
        hbox.pack_start(self.back_button, expand=False, fill=True)
213
218
        self.forward_button = self._create_forward_button()
214
219
        hbox.pack_start(self.forward_button, expand=False, fill=True)
215
 
        self.find_button = self._create_find_button()
216
 
        hbox.pack_start(self.find_button, expand=False, fill=True)
217
 
        self.goto_button = self._create_goto_button()
218
 
        hbox.pack_start(self.goto_button, expand=False, fill=True)
219
220
        hbox.show()
220
221
        vbox.pack_start(hbox, expand=False, fill=True)
221
222
        
238
239
 
239
240
        self.add(vbox)
240
241
 
241
 
    def _search_by_text(self, *ignored): # (accel_group, window, key, modifiers):
 
242
    def _search_by_text(self, accel_group, window, key, modifiers):
242
243
        self._search.show_for('text')
243
244
        self._search.set_target(self.annoview, TEXT_LINE_COL)
244
245
 
245
 
    def _search_by_line(self, *ignored): # accel_group, window, key, modifiers):
 
246
    def _search_by_line(self, accel_group, window, key, modifiers):
246
247
        self._search.show_for('line')
247
248
        self._search.set_target(self.annoview, LINE_NUM_COL)
248
249
 
249
 
    def line_diff(self, tv, path, tvc):
 
250
    def row_diff(self, tv, path, tvc):
250
251
        row = path[0]
251
252
        revision = self.annotations[row]
252
253
        repository = self.branch.repository
261
262
                tree2 = repository.revision_tree(NULL_REVISION)
262
263
        from bzrlib.plugins.gtk.diff import DiffWindow
263
264
        window = DiffWindow()
264
 
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
 
265
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
265
266
        window.set_file(tree1.id2path(self.file_id))
266
267
        window.show()
267
268
 
271
272
        tv.set_rules_hint(False)
272
273
        tv.connect("cursor-changed", self._activate_selected_revision)
273
274
        tv.show()
274
 
        tv.connect("row-activated", self.line_diff)
 
275
        tv.connect("row-activated", self.row_diff)
275
276
 
276
277
        cell = gtk.CellRendererText()
277
278
        cell.set_property("xalign", 1.0)
325
326
        return tv
326
327
 
327
328
    def _create_log_view(self):
328
 
        lv = RevisionView(self._branch)
 
329
        lv = RevisionView()
329
330
        lv.show()
330
331
        return lv
331
332
 
348
349
        button.set_sensitive(False)
349
350
        return button
350
351
 
351
 
    def _create_find_button(self):
352
 
        button = gtk.Button()
353
 
        button.set_use_stock(True)
354
 
        button.set_label("gtk-find")
355
 
        button.set_tooltip_text("Search for text (Ctrl+F)")
356
 
        button.connect("clicked", self._search_by_text)
357
 
        button.set_relief(gtk.RELIEF_NONE)
358
 
        button.show()
359
 
        button.set_sensitive(True)
360
 
        return button
361
 
 
362
 
    def _create_goto_button(self):
363
 
        button = gtk.Button()
364
 
        button.set_label("Goto Line")
365
 
        button.set_tooltip_text("Scroll to a line by entering its number (Ctrl+G)")
366
 
        button.connect("clicked", self._search_by_line)
367
 
        button.set_relief(gtk.RELIEF_NONE)
368
 
        button.show()
369
 
        button.set_sensitive(True)
370
 
        return button
371
 
 
372
352
    def go_back(self):
373
353
        last_tree = self.tree
374
354
        rev_id = self._selected_revision()
414
394
                return j - i
415
395
 
416
396
 
417
 
class FakeRevision(object):
 
397
class FakeRevision:
418
398
    """ A fake revision.
419
399
 
420
400
    For when a revision is referenced but not present.
429
409
        self.timezone = 0
430
410
        self.properties = {}
431
411
 
432
 
    def get_apparent_authors(self):
433
 
        return [self.committer]
 
412
    def get_apparent_author(self):
 
413
        return self.committer
434
414
 
435
415
 
436
416
class RevisionCache(object):
437
417
    """A caching revision source"""
438
 
 
439
418
    def __init__(self, real_source, seed_cache=None):
440
419
        self.__real_source = real_source
441
420
        if seed_cache is None: