/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:
22
22
import gobject
23
23
import subprocess
24
24
 
 
25
from bzrlib.plugins.gtk import icon_path
25
26
from bzrlib.osutils import format_date
26
27
from bzrlib.util.bencode import bdecode
27
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
 
28
41
def _open_link(widget, uri):
29
42
    subprocess.Popen(['sensible-browser', uri], close_fds=True)
30
43
 
31
44
gtk.link_button_set_uri_hook(_open_link)
32
45
 
33
 
class BugsTab(gtk.Table):
 
46
class BugsTab(gtk.VBox):
 
47
 
34
48
    def __init__(self):
35
 
        super(BugsTab, self).__init__(rows=5, columns=2)
36
 
        self.set_row_spacings(6)
37
 
        self.set_col_spacings(6)
38
 
        self.clear()
 
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
39
112
 
40
113
    def clear(self):
41
 
        for c in self.get_children():
42
 
            self.remove(c)
43
 
        self.count = 0
44
 
        self.hide_all() # Only shown when there are bugs
 
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.")
45
119
 
46
120
    def add_bug(self, url, status):
47
 
        button = gtk.LinkButton(url, url)
48
 
        self.attach(button, 0, 1, self.count, self.count + 1,
49
 
                              gtk.EXPAND | gtk.FILL, gtk.FILL)
50
 
        status_label = gtk.Label(status)
51
 
        self.attach(status_label, 1, 2, self.count, self.count + 1,
52
 
                              gtk.EXPAND | gtk.FILL, gtk.FILL)
53
 
        self.count += 1
 
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)
54
192
        self.show_all()
55
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
 
56
270
 
57
271
class RevisionView(gtk.Notebook):
58
272
    """ Custom widget for commit log details.
91
305
        )
92
306
    }
93
307
 
94
 
 
95
 
    def __init__(self, branch=None):
 
308
    def __init__(self, branch=None, repository=None):
96
309
        gtk.Notebook.__init__(self)
97
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
 
98
318
        self._create_general()
99
319
        self._create_relations()
 
320
        if has_seahorse:
 
321
            self._create_signature()
100
322
        self._create_file_info_view()
101
323
        self._create_bugs()
102
324
 
103
 
        self.set_current_page(0)
 
325
        self.set_current_page(PAGE_GENERAL)
 
326
        self.connect_after('switch-page', self._switch_page_cb)
104
327
        
105
328
        self._show_callback = None
106
329
        self._clicked_callback = None
207
430
        else:
208
431
            self.file_info_box.hide()
209
432
 
210
 
        self.bugs_table.clear()
211
 
        bugs_text = revision.properties.get('bugs', None)
212
 
        if bugs_text:
213
 
            for bugline in bugs_text.splitlines():
214
 
                (url, status) = bugline.split(" ")
215
 
                self.bugs_table.add_bug(url, status)
216
 
 
217
433
    def update_tags(self):
218
434
        if self._branch is not None and self._branch.supports_tags():
219
435
            self._tagdict = self._branch.tags.get_reverse_tag_dict()
222
438
 
223
439
        self._add_tags()
224
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
 
225
450
    def set_children(self, children):
226
451
        self._add_parents_or_children(children,
227
452
                                      self.children_widgets,
228
453
                                      self.children_table)
229
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
 
230
461
    def _show_clicked_cb(self, widget, revid, parentid):
231
462
        """Callback for when the show button for a parent is clicked."""
232
463
        self._show_callback(revid, parentid)
235
466
        """Callback for when the go button for a parent is clicked."""
236
467
 
237
468
    def _add_tags(self, *args):
238
 
        if self._revision is None: return
 
469
        if self._revision is None:
 
470
            return
239
471
 
240
472
        if self._tagdict.has_key(self._revision.revision_id):
241
473
            tags = self._tagdict[self._revision.revision_id]
285
517
 
286
518
            button = gtk.Button(revid)
287
519
            button.connect("clicked",
288
 
                    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)
289
521
            button.set_use_underline(False)
290
522
            hbox.pack_start(button, expand=False, fill=True)
291
523
            button.show()
306
538
        self.append_page(vbox, tab_label=gtk.Label("Relations"))
307
539
        vbox.show()
308
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
 
309
546
    def _create_headers(self):
310
547
        self.table = gtk.Table(rows=5, columns=2)
311
548
        self.table.set_row_spacings(6)
413
650
        self.connect('notify::revision', self._add_tags)
414
651
 
415
652
        return self.table
416
 
 
417
653
    
418
654
    def _create_parents(self):
419
655
        hbox = gtk.HBox(True, 3)
461
697
        tv = gtk.TextView(msg_buffer)
462
698
        tv.set_editable(False)
463
699
        tv.set_wrap_mode(gtk.WRAP_WORD)
 
700
 
464
701
        tv.modify_font(pango.FontDescription("Monospace"))
465
702
        tv.show()
466
703
        window.add(tv)
468
705
        return window
469
706
 
470
707
    def _create_bugs(self):
471
 
        self.bugs_table = BugsTab()
472
 
        self.append_page(self.bugs_table, tab_label=gtk.Label('Bugs'))
 
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'))
473
711
 
474
712
    def _create_file_info_view(self):
475
713
        self.file_info_box = gtk.VBox(False, 6)