/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 revisionview.py

  • Committer: Vincent Ladeuil
  • Date: 2008-05-05 18:16:46 UTC
  • mto: (487.1.1 gtk)
  • mto: This revision was merged to the branch mainline in revision 490.
  • Revision ID: v.ladeuil+lp@free.fr-20080505181646-n95l8ltw2u6jtr26
Fix bug #187283 fix replacing _() by _i18n().

* genpot.sh 
Remove duplication. Add the ability to specify the genrated pot
file on command-line for debugging purposes.

* po/olive-gtk.pot:
Regenerated.

* __init__.py, branch.py, branchview/treeview.py, checkout.py,
commit.py, conflicts.py, diff.py, errors.py, initialize.py,
merge.py, nautilus-bzr.py, olive/__init__.py, olive/add.py,
olive/bookmark.py, olive/guifiles.py, olive/info.py,
olive/menu.py, olive/mkdir.py, olive/move.py, olive/remove.py,
olive/rename.py, push.py, revbrowser.py, status.py, tags.py:
Replace all calls to _() by calls to _i18n(), the latter being
defined in __init__.py and imported in the other modules from
there. This fix the problem encountered countless times when
running bzr selftest and getting silly error messages about
boolean not being callables.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import gtk
21
21
import pango
22
22
import gobject
 
23
import subprocess
23
24
 
 
25
from bzrlib.plugins.gtk import icon_path
24
26
from bzrlib.osutils import format_date
25
27
from bzrlib.util.bencode import bdecode
26
28
 
 
29
try:
 
30
    from bzrlib.plugins.gtk import seahorse
 
31
except ImportError:
 
32
    has_seahorse = False
 
33
else:
 
34
    has_seahorse = True
 
35
 
 
36
PAGE_GENERAL = 0
 
37
PAGE_RELATIONS = 1
 
38
PAGE_SIGNATURE = 2
 
39
PAGE_BUGS = 3
 
40
 
 
41
def _open_link(widget, uri):
 
42
    subprocess.Popen(['sensible-browser', uri], close_fds=True)
 
43
 
 
44
gtk.link_button_set_uri_hook(_open_link)
 
45
 
 
46
class BugsTab(gtk.VBox):
 
47
 
 
48
    def __init__(self):
 
49
        super(BugsTab, self).__init__(False, 6)
 
50
    
 
51
        table = gtk.Table(rows=2, columns=2)
 
52
 
 
53
        table.set_row_spacings(6)
 
54
        table.set_col_spacing(0, 16)
 
55
 
 
56
        image = gtk.Image()
 
57
        image.set_from_file(icon_path("bug.png"))
 
58
        table.attach(image, 0, 1, 0, 1, gtk.FILL)
 
59
 
 
60
        align = gtk.Alignment(0.0, 0.1)
 
61
        self.label = gtk.Label()
 
62
        align.add(self.label)
 
63
        table.attach(align, 1, 2, 0, 1, gtk.FILL)
 
64
 
 
65
        treeview = self.construct_treeview()
 
66
        table.attach(treeview, 1, 2, 1, 2, gtk.FILL | gtk.EXPAND)
 
67
 
 
68
        self.set_border_width(6)
 
69
        self.pack_start(table, expand=False)
 
70
 
 
71
        self.clear()
 
72
        self.show_all()
 
73
 
 
74
    def set_revision(self, revision):
 
75
        if revision is None:
 
76
            return
 
77
 
 
78
        self.clear()
 
79
        bugs_text = revision.properties.get('bugs', '')
 
80
        for bugline in bugs_text.splitlines():
 
81
                (url, status) = bugline.split(" ")
 
82
                if status == "fixed":
 
83
                    self.add_bug(url, status)
 
84
        
 
85
        if self.num_bugs == 0:
 
86
            return
 
87
        elif self.num_bugs == 1:
 
88
            label = "bug"
 
89
        else:
 
90
            label = "bugs"
 
91
 
 
92
        self.label.set_markup("<b>Bugs fixed</b>\n" +
 
93
                              "This revision claims to fix " +
 
94
                              "%d %s." % (self.num_bugs, label))
 
95
 
 
96
    def construct_treeview(self):
 
97
        self.bugs = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
 
98
        self.treeview = gtk.TreeView(self.bugs)
 
99
        self.treeview.set_headers_visible(False)
 
100
 
 
101
        uri_column = gtk.TreeViewColumn('Bug URI', gtk.CellRendererText(), text=0)
 
102
        self.treeview.append_column(uri_column)
 
103
 
 
104
        self.treeview.connect('row-activated', self.on_row_activated)
 
105
 
 
106
        win = gtk.ScrolledWindow()
 
107
        win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
108
        win.set_shadow_type(gtk.SHADOW_IN)
 
109
        win.add(self.treeview)
 
110
 
 
111
        return win
 
112
 
 
113
    def clear(self):
 
114
        self.num_bugs = 0
 
115
        self.bugs.clear()
 
116
        self.set_sensitive(False)
 
117
        self.label.set_markup("<b>No bugs fixed</b>\n" +
 
118
                              "This revision does not claim to fix any bugs.")
 
119
 
 
120
    def add_bug(self, url, status):
 
121
        self.num_bugs += 1
 
122
        self.bugs.append([url, status])
 
123
        self.set_sensitive(True)
 
124
 
 
125
    def get_num_bugs(self):
 
126
        return self.num_bugs
 
127
 
 
128
    def on_row_activated(self, treeview, path, column):
 
129
        uri = self.bugs.get_value(self.bugs.get_iter(path), 0)
 
130
        _open_link(self, uri)
 
131
 
 
132
 
 
133
class SignatureTab(gtk.VBox):
 
134
 
 
135
    def __init__(self, repository):
 
136
        self.key = None
 
137
        self.revision = None
 
138
        self.repository = repository
 
139
 
 
140
        super(SignatureTab, self).__init__(False, 6)
 
141
        signature_box = gtk.Table(rows=3, columns=3)
 
142
        signature_box.set_col_spacing(0, 16)
 
143
        signature_box.set_col_spacing(1, 12)
 
144
        signature_box.set_row_spacings(6)
 
145
 
 
146
        self.signature_image = gtk.Image()
 
147
        signature_box.attach(self.signature_image, 0, 1, 0, 1, gtk.FILL)
 
148
 
 
149
        align = gtk.Alignment(0.0, 0.1)
 
150
        self.signature_label = gtk.Label()
 
151
        align.add(self.signature_label)
 
152
        signature_box.attach(align, 1, 3, 0, 1, gtk.FILL)
 
153
 
 
154
        align = gtk.Alignment(0.0, 0.5)
 
155
        self.signature_key_id_label = gtk.Label()
 
156
        self.signature_key_id_label.set_markup("<b>Key Id:</b>")
 
157
        align.add(self.signature_key_id_label)
 
158
        signature_box.attach(align, 1, 2, 1, 2, gtk.FILL, gtk.FILL)
 
159
 
 
160
        align = gtk.Alignment(0.0, 0.5)
 
161
        self.signature_key_id = gtk.Label()
 
162
        self.signature_key_id.set_selectable(True)
 
163
        align.add(self.signature_key_id)
 
164
        signature_box.attach(align, 2, 3, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
165
 
 
166
        align = gtk.Alignment(0.0, 0.5)
 
167
        self.signature_fingerprint_label = gtk.Label()
 
168
        self.signature_fingerprint_label.set_markup("<b>Fingerprint:</b>")
 
169
        align.add(self.signature_fingerprint_label)
 
170
        signature_box.attach(align, 1, 2, 2, 3, gtk.FILL, gtk.FILL)
 
171
 
 
172
        align = gtk.Alignment(0.0, 0.5)
 
173
        self.signature_fingerprint = gtk.Label()
 
174
        self.signature_fingerprint.set_selectable(True)
 
175
        align.add(self.signature_fingerprint)
 
176
        signature_box.attach(align, 2, 3, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
177
 
 
178
        align = gtk.Alignment(0.0, 0.5)
 
179
        self.signature_trust_label = gtk.Label()
 
180
        self.signature_trust_label.set_markup("<b>Trust:</b>")
 
181
        align.add(self.signature_trust_label)
 
182
        signature_box.attach(align, 1, 2, 3, 4, gtk.FILL, gtk.FILL)
 
183
 
 
184
        align = gtk.Alignment(0.0, 0.5)
 
185
        self.signature_trust = gtk.Label()
 
186
        self.signature_trust.set_selectable(True)
 
187
        align.add(self.signature_trust)
 
188
        signature_box.attach(align, 2, 3, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
 
189
 
 
190
        self.set_border_width(6)
 
191
        self.pack_start(signature_box, expand=False)
 
192
        self.show_all()
 
193
 
 
194
    def set_revision(self, revision):
 
195
        self.revision = revision
 
196
        revid = revision.revision_id
 
197
 
 
198
        if self.repository.has_signature_for_revision_id(revid):
 
199
            crypttext = self.repository.get_signature_text(revid)
 
200
            self.show_signature(crypttext)
 
201
        else:
 
202
            self.show_no_signature()
 
203
 
 
204
    def show_no_signature(self):
 
205
        self.signature_key_id_label.hide()
 
206
        self.signature_key_id.set_text("")
 
207
 
 
208
        self.signature_fingerprint_label.hide()
 
209
        self.signature_fingerprint.set_text("")
 
210
 
 
211
        self.signature_trust_label.hide()
 
212
        self.signature_trust.set_text("")
 
213
 
 
214
        self.signature_image.set_from_file(icon_path("sign-unknown.png"))
 
215
        self.signature_label.set_markup("<b>Authenticity unknown</b>\n" +
 
216
                                        "This revision has not been signed.")
 
217
 
 
218
    def show_signature(self, crypttext):
 
219
        key = seahorse.verify(crypttext)
 
220
 
 
221
        if key and key.is_available():
 
222
            if key.is_trusted():
 
223
                if key.get_display_name() == self.revision.committer:
 
224
                    self.signature_image.set_from_file(icon_path("sign-ok.png"))
 
225
                    self.signature_label.set_markup("<b>Authenticity confirmed</b>\n" +
 
226
                                                    "This revision has been signed with " +
 
227
                                                    "a trusted key.")
 
228
                else:
 
229
                    self.signature_image.set_from_file(icon_path("sign-bad.png"))
 
230
                    self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
 
231
                                                    "Revision committer is not the same as signer.")
 
232
            else:
 
233
                self.signature_image.set_from_file(icon_path("sign-bad.png"))
 
234
                self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
 
235
                                                "This revision has been signed, but the " +
 
236
                                                "key is not trusted.")
 
237
        else:
 
238
            self.show_no_signature()
 
239
            self.signature_image.set_from_file(icon_path("sign-bad.png"))
 
240
            self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
 
241
                                            "Signature key not available.")
 
242
            return
 
243
 
 
244
        trust = key.get_trust()
 
245
 
 
246
        if trust <= seahorse.TRUST_NEVER:
 
247
            trust_text = 'never trusted'
 
248
        elif trust == seahorse.TRUST_UNKNOWN:
 
249
            trust_text = 'not trusted'
 
250
        elif trust == seahorse.TRUST_MARGINAL:
 
251
            trust_text = 'marginally trusted'
 
252
        elif trust == seahorse.TRUST_FULL:
 
253
            trust_text = 'fully trusted'
 
254
        elif trust == seahorse.TRUST_ULTIMATE:
 
255
            trust_text = 'ultimately trusted'
 
256
 
 
257
        self.signature_key_id_label.show()
 
258
        self.signature_key_id.set_text(key.get_id())
 
259
 
 
260
        fingerprint = key.get_fingerprint()
 
261
        if fingerprint == "":
 
262
            fingerprint = '<span foreground="dim grey">N/A</span>'
 
263
 
 
264
        self.signature_fingerprint_label.show()
 
265
        self.signature_fingerprint.set_markup(fingerprint)
 
266
 
 
267
        self.signature_trust_label.show()
 
268
        self.signature_trust.set_text('This key is ' + trust_text)
 
269
 
 
270
 
27
271
class RevisionView(gtk.Notebook):
28
272
    """ Custom widget for commit log details.
29
273
 
61
305
        )
62
306
    }
63
307
 
64
 
 
65
 
    def __init__(self, branch=None):
 
308
    def __init__(self, branch=None, repository=None):
66
309
        gtk.Notebook.__init__(self)
67
310
 
 
311
        self._revision = None
 
312
        self._branch = branch
 
313
        if branch is not None:
 
314
            self._repository = branch.repository
 
315
        else:
 
316
            self._repository = repository
 
317
 
68
318
        self._create_general()
69
319
        self._create_relations()
 
320
        if has_seahorse:
 
321
            self._create_signature()
70
322
        self._create_file_info_view()
 
323
        self._create_bugs()
71
324
 
72
 
        self.set_current_page(0)
 
325
        self.set_current_page(PAGE_GENERAL)
 
326
        self.connect_after('switch-page', self._switch_page_cb)
73
327
        
74
328
        self._show_callback = None
75
329
        self._clicked_callback = None
184
438
 
185
439
        self._add_tags()
186
440
 
 
441
    def _update_signature(self, widget, param):
 
442
        if self.get_current_page() == PAGE_SIGNATURE:
 
443
            self.signature_table.set_revision(self._revision)
 
444
 
 
445
    def _update_bugs(self, widget, param):
 
446
        self.bugs_page.set_revision(self._revision)
 
447
        label = self.get_tab_label(self.bugs_page)
 
448
        label.set_sensitive(self.bugs_page.get_num_bugs() != 0)
 
449
 
187
450
    def set_children(self, children):
188
451
        self._add_parents_or_children(children,
189
452
                                      self.children_widgets,
190
453
                                      self.children_table)
191
454
 
 
455
    def _switch_page_cb(self, notebook, page, page_num):
 
456
        if page_num == PAGE_SIGNATURE:
 
457
            self.signature_table.set_revision(self._revision)
 
458
 
 
459
 
 
460
 
192
461
    def _show_clicked_cb(self, widget, revid, parentid):
193
462
        """Callback for when the show button for a parent is clicked."""
194
463
        self._show_callback(revid, parentid)
197
466
        """Callback for when the go button for a parent is clicked."""
198
467
 
199
468
    def _add_tags(self, *args):
200
 
        if self._revision is None: return
 
469
        if self._revision is None:
 
470
            return
201
471
 
202
472
        if self._tagdict.has_key(self._revision.revision_id):
203
473
            tags = self._tagdict[self._revision.revision_id]
247
517
 
248
518
            button = gtk.Button(revid)
249
519
            button.connect("clicked",
250
 
                    lambda w, r: self.set_revision(self._branch.repository.get_revision(r)), revid)
 
520
                    lambda w, r: self.set_revision(self._repository.get_revision(r)), revid)
251
521
            button.set_use_underline(False)
252
522
            hbox.pack_start(button, expand=False, fill=True)
253
523
            button.show()
268
538
        self.append_page(vbox, tab_label=gtk.Label("Relations"))
269
539
        vbox.show()
270
540
 
 
541
    def _create_signature(self):
 
542
        self.signature_table = SignatureTab(self._repository)
 
543
        self.append_page(self.signature_table, tab_label=gtk.Label('Signature'))
 
544
        self.connect_after('notify::revision', self._update_signature)
 
545
 
271
546
    def _create_headers(self):
272
547
        self.table = gtk.Table(rows=5, columns=2)
273
548
        self.table.set_row_spacings(6)
375
650
        self.connect('notify::revision', self._add_tags)
376
651
 
377
652
        return self.table
378
 
 
379
653
    
380
654
    def _create_parents(self):
381
655
        hbox = gtk.HBox(True, 3)
423
697
        tv = gtk.TextView(msg_buffer)
424
698
        tv.set_editable(False)
425
699
        tv.set_wrap_mode(gtk.WRAP_WORD)
 
700
 
426
701
        tv.modify_font(pango.FontDescription("Monospace"))
427
702
        tv.show()
428
703
        window.add(tv)
429
704
        window.show()
430
705
        return window
431
706
 
 
707
    def _create_bugs(self):
 
708
        self.bugs_page = BugsTab()
 
709
        self.connect_after('notify::revision', self._update_bugs) 
 
710
        self.append_page(self.bugs_page, tab_label=gtk.Label('Bugs'))
 
711
 
432
712
    def _create_file_info_view(self):
433
713
        self.file_info_box = gtk.VBox(False, 6)
434
714
        self.file_info_box.set_border_width(6)