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

  • Committer: Daniel Schierbeck
  • Date: 2007-12-06 23:37:06 UTC
  • mto: This revision was merged to the branch mainline in revision 417.
  • Revision ID: daniel.schierbeck@gmail.com-20071206233706-eeinks66w86r3gfm
Fixed bug in gmissing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
import os.path
18
 
import re
19
 
 
20
17
try:
21
18
    import pygtk
22
19
    pygtk.require("2.0")
27
24
import gobject
28
25
import pango
29
26
 
 
27
import os.path
 
28
import re
 
29
 
30
30
from bzrlib import errors, osutils
31
31
from bzrlib.trace import mutter
32
32
from bzrlib.util import bencode
33
33
 
34
 
from bzrlib.plugins.gtk import _i18n
35
 
from bzrlib.plugins.gtk.dialog import question_dialog
36
 
from bzrlib.plugins.gtk.errors import show_bzr_error
 
34
from dialog import error_dialog, question_dialog
 
35
from errors import show_bzr_error
37
36
 
38
37
try:
39
38
    import dbus
97
96
    return pm
98
97
 
99
98
 
100
 
_newline_variants_re = re.compile(r'\r\n?')
101
 
def _sanitize_and_decode_message(utf8_message):
102
 
    """Turn a utf-8 message into a sanitized Unicode message."""
103
 
    fixed_newline = _newline_variants_re.sub('\n', utf8_message)
104
 
    return fixed_newline.decode('utf-8')
105
 
 
106
 
 
107
99
class CommitDialog(gtk.Dialog):
108
100
    """Implementation of Commit."""
109
101
 
110
102
    def __init__(self, wt, selected=None, parent=None):
111
 
        gtk.Dialog.__init__(self, title="Commit to %s" % wt.basedir,
 
103
        gtk.Dialog.__init__(self, title="Commit - Olive",
112
104
                                  parent=parent,
113
105
                                  flags=0,
114
 
                                  buttons=(gtk.STOCK_CANCEL,
115
 
                                           gtk.RESPONSE_CANCEL))
 
106
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
116
107
        self._question_dialog = question_dialog
117
108
 
118
109
        self._wt = wt
173
164
        store = self._files_store
174
165
        self._treeview_files.set_model(None)
175
166
 
176
 
        added = _i18n('added')
177
 
        removed = _i18n('removed')
178
 
        renamed = _i18n('renamed')
179
 
        renamed_and_modified = _i18n('renamed and modified')
180
 
        modified = _i18n('modified')
181
 
        kind_changed = _i18n('kind changed')
 
167
        added = _('added')
 
168
        removed = _('removed')
 
169
        renamed = _('renamed')
 
170
        renamed_and_modified = _('renamed and modified')
 
171
        modified = _('modified')
 
172
        kind_changed = _('kind changed')
182
173
 
183
174
        # The store holds:
184
175
        # [file_id, real path, checkbox, display path, changes type, message]
185
 
        # iter_changes returns:
 
176
        # _iter_changes returns:
186
177
        # (file_id, (path_in_source, path_in_target),
187
178
        #  changed_content, versioned, parent, name, kind,
188
179
        #  executable)
195
186
        self._wt.lock_read()
196
187
        self._basis_tree.lock_read()
197
188
        try:
198
 
            from diff import iter_changes_to_status
 
189
            from diff import _iter_changes_to_status
199
190
            for (file_id, real_path, change_type, display_path
200
 
                ) in iter_changes_to_status(self._basis_tree, self._wt):
 
191
                ) in _iter_changes_to_status(self._basis_tree, self._wt):
201
192
                if self._selected and real_path != self._selected:
202
193
                    enabled = False
203
194
                else:
236
227
            return
237
228
        if have_dbus:
238
229
            bus = dbus.SystemBus()
239
 
            try:
240
 
                proxy_obj = bus.get_object('org.freedesktop.NetworkManager',
241
 
                                           '/org/freedesktop/NetworkManager')
242
 
            except dbus.DBusException:
243
 
                mutter("networkmanager not available.")
244
 
                self._check_local.show()
245
 
                return
246
 
            
 
230
            proxy_obj = bus.get_object('org.freedesktop.NetworkManager',
 
231
                                       '/org/freedesktop/NetworkManager')
247
232
            dbus_iface = dbus.Interface(proxy_obj,
248
233
                                        'org.freedesktop.NetworkManager')
249
234
            try:
266
251
            self._enable_per_file_commits = True
267
252
        if not self._enable_per_file_commits:
268
253
            self._file_message_expander.hide()
269
 
            self._global_message_label.set_markup(_i18n('<b>Commit Message</b>'))
 
254
            self._global_message_label.set_markup(_('<b>Commit Message</b>'))
270
255
 
271
256
    def _compute_delta(self):
272
257
        self._delta = self._wt.changes_from(self._basis_tree)
311
296
                            gtk.gdk.CONTROL_MASK, 0, self._on_accel_next)
312
297
        self.add_accel_group(group)
313
298
 
314
 
        # ignore the escape key (avoid closing the window)
315
 
        self.connect_object('close', self.emit_stop_by_name, 'close')
316
 
 
317
299
    def _construct_left_pane(self):
318
300
        self._left_pane_box = gtk.VBox(homogeneous=False, spacing=5)
319
301
        self._construct_file_list()
320
302
        self._construct_pending_list()
321
303
 
322
 
        self._check_local = gtk.CheckButton(_i18n("_Only commit locally"),
 
304
        self._check_local = gtk.CheckButton(_("_Only commit locally"),
323
305
                                            use_underline=True)
324
306
        self._left_pane_box.pack_end(self._check_local, False, False)
325
307
        self._check_local.set_active(False)
346
328
        self._hpane.pack2(self._right_pane_table, resize=True, shrink=True)
347
329
 
348
330
    def _construct_action_pane(self):
349
 
        self._button_commit = gtk.Button(_i18n("Comm_it"), use_underline=True)
 
331
        self._button_commit = gtk.Button(_("Comm_it"), use_underline=True)
350
332
        self._button_commit.connect('clicked', self._on_commit_clicked)
351
333
        self._button_commit.set_flags(gtk.CAN_DEFAULT)
352
334
        self._button_commit.show()
372
354
 
373
355
    def _construct_file_list(self):
374
356
        self._files_box = gtk.VBox(homogeneous=False, spacing=0)
375
 
        file_label = gtk.Label(_i18n('Files'))
 
357
        file_label = gtk.Label(_('Files'))
376
358
        # file_label.show()
377
359
        self._files_box.pack_start(file_label, expand=False)
378
360
 
379
361
        self._commit_all_files_radio = gtk.RadioButton(
380
 
            None, _i18n("Commit all changes"))
 
362
            None, _("Commit all changes"))
381
363
        self._files_box.pack_start(self._commit_all_files_radio, expand=False)
382
364
        self._commit_all_files_radio.show()
383
365
        self._commit_all_files_radio.connect('toggled',
384
366
            self._toggle_commit_selection)
385
367
        self._commit_selected_radio = gtk.RadioButton(
386
 
            self._commit_all_files_radio, _i18n("Only commit selected changes"))
 
368
            self._commit_all_files_radio, _("Only commit selected changes"))
387
369
        self._files_box.pack_start(self._commit_selected_radio, expand=False)
388
370
        self._commit_selected_radio.show()
389
371
        self._commit_selected_radio.connect('toggled',
390
372
            self._toggle_commit_selection)
391
373
        if self._pending:
392
 
            self._commit_all_files_radio.set_label(_i18n('Commit all changes*'))
 
374
            self._commit_all_files_radio.set_label(_('Commit all changes*'))
393
375
            self._commit_all_files_radio.set_sensitive(False)
394
376
            self._commit_selected_radio.set_sensitive(False)
395
377
 
422
404
        crt.set_property('activatable', not bool(self._pending))
423
405
        crt.connect("toggled", self._toggle_commit, self._files_store)
424
406
        if self._pending:
425
 
            name = _i18n('Commit*')
 
407
            name = _('Commit*')
426
408
        else:
427
 
            name = _i18n('Commit')
 
409
            name = _('Commit')
428
410
        commit_col = gtk.TreeViewColumn(name, crt, active=2)
429
411
        commit_col.set_visible(False)
430
412
        self._treeview_files.append_column(commit_col)
431
 
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Path'),
 
413
        self._treeview_files.append_column(gtk.TreeViewColumn(_('Path'),
432
414
                                           gtk.CellRendererText(), text=3))
433
 
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Type'),
 
415
        self._treeview_files.append_column(gtk.TreeViewColumn(_('Type'),
434
416
                                           gtk.CellRendererText(), text=4))
435
417
        self._treeview_files.connect('cursor-changed',
436
418
                                     self._on_treeview_files_cursor_changed)
463
445
 
464
446
        pending_message = gtk.Label()
465
447
        pending_message.set_markup(
466
 
            _i18n('<i>* Cannot select specific files when merging</i>'))
 
448
            _('<i>* Cannot select specific files when merging</i>'))
467
449
        self._pending_box.pack_start(pending_message, expand=False, padding=5)
468
450
        pending_message.show()
469
451
 
470
 
        pending_label = gtk.Label(_i18n('Pending Revisions'))
 
452
        pending_label = gtk.Label(_('Pending Revisions'))
471
453
        self._pending_box.pack_start(pending_label, expand=False, padding=0)
472
454
        pending_label.show()
473
455
 
489
471
                                 )
490
472
        self._pending_store = liststore
491
473
        self._treeview_pending.set_model(liststore)
492
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Date'),
 
474
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Date'),
493
475
                                             gtk.CellRendererText(), text=1))
494
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Committer'),
 
476
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Committer'),
495
477
                                             gtk.CellRendererText(), text=2))
496
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Summary'),
 
478
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Summary'),
497
479
                                             gtk.CellRendererText(), text=3))
498
480
 
499
481
    def _construct_diff_view(self):
503
485
        #       decide that we really don't ever want to display it, we should
504
486
        #       actually remove it, and other references to it, along with the
505
487
        #       tests that it is set properly.
506
 
        self._diff_label = gtk.Label(_i18n('Diff for whole tree'))
 
488
        self._diff_label = gtk.Label(_('Diff for whole tree'))
507
489
        self._diff_label.set_alignment(0, 0)
508
490
        self._right_pane_table.set_row_spacing(self._right_pane_table_row, 0)
509
491
        self._add_to_right_table(self._diff_label, 1, False)
527
509
        self._file_message_text_view.set_accepts_tab(False)
528
510
        self._file_message_text_view.show()
529
511
 
530
 
        self._file_message_expander = gtk.Expander(_i18n('File commit message'))
 
512
        self._file_message_expander = gtk.Expander(_('File commit message'))
531
513
        self._file_message_expander.set_expanded(True)
532
514
        self._file_message_expander.add(scroller)
533
515
        self._add_to_right_table(self._file_message_expander, 1, False)
534
516
        self._file_message_expander.show()
535
517
 
536
518
    def _construct_global_message(self):
537
 
        self._global_message_label = gtk.Label(_i18n('Global Commit Message'))
538
 
        self._global_message_label.set_markup(
539
 
            _i18n('<b>Global Commit Message</b>'))
 
519
        self._global_message_label = gtk.Label(_('Global Commit Message'))
 
520
        self._global_message_label.set_markup(_('<b>Global Commit Message</b>'))
540
521
        self._global_message_label.set_alignment(0, 0)
541
522
        self._right_pane_table.set_row_spacing(self._right_pane_table_row, 0)
542
523
        self._add_to_right_table(self._global_message_label, 1, False)
562
543
 
563
544
        if selection is not None:
564
545
            path, display_path = model.get(selection, 1, 3)
565
 
            self._diff_label.set_text(_i18n('Diff for ') + display_path)
 
546
            self._diff_label.set_text(_('Diff for ') + display_path)
566
547
            if path is None:
567
548
                self._diff_view.show_diff(None)
568
549
            else:
609
590
        text_buffer = self._file_message_text_view.get_buffer()
610
591
        file_id, display_path, message = self._files_store.get(selection, 0, 3, 5)
611
592
        if file_id is None: # Whole tree
612
 
            self._file_message_expander.set_label(_i18n('File commit message'))
 
593
            self._file_message_expander.set_label(_('File commit message'))
613
594
            self._file_message_expander.set_expanded(False)
614
595
            self._file_message_expander.set_sensitive(False)
615
596
            text_buffer.set_text('')
616
597
            self._last_selected_file = None
617
598
        else:
618
 
            self._file_message_expander.set_label(_i18n('Commit message for ')
 
599
            self._file_message_expander.set_label(_('Commit message for ')
619
600
                                                  + display_path)
620
601
            self._file_message_expander.set_expanded(True)
621
602
            self._file_message_expander.set_sensitive(True)
638
619
            if self._commit_all_changes or record[2]:# [2] checkbox
639
620
                file_id = record[0] # [0] file_id
640
621
                path = record[1]    # [1] real path
641
 
                # [5] commit message
642
 
                file_message = _sanitize_and_decode_message(record[5])
 
622
                file_message = record[5] # [5] commit message
643
623
                files.append(path.decode('UTF-8'))
644
624
                if self._enable_per_file_commits and file_message:
645
625
                    # All of this needs to be utf-8 information
646
 
                    file_message = file_message.encode('UTF-8')
647
626
                    file_info.append({'path':path, 'file_id':file_id,
648
627
                                     'message':file_message})
649
628
        file_info.sort(key=lambda x:(x['path'], x['file_id']))
662
641
 
663
642
        if message == '':
664
643
            response = self._question_dialog(
665
 
                _i18n('Commit with an empty message?'),
666
 
                _i18n('You can describe your commit intent in the message.'),
667
 
                parent=self)
 
644
                            _('Commit with an empty message?'),
 
645
                            _('You can describe your commit intent in the message.'))
668
646
            if response == gtk.RESPONSE_NO:
669
647
                # Kindly give focus to message area
670
648
                self._global_message_text_view.grab_focus()
683
661
        #       files at this point.
684
662
        for path in self._wt.unknowns():
685
663
            response = self._question_dialog(
686
 
                _i18n("Commit with unknowns?"),
687
 
                _i18n("Unknown files exist in the working tree. Commit anyway?"),
688
 
                parent=self)
689
 
                # Doesn't set a parent for the dialog..
 
664
                _("Commit with unknowns?"),
 
665
                _("Unknown files exist in the working tree. Commit anyway?"))
690
666
            if response == gtk.RESPONSE_NO:
691
667
                return
692
668
            break
704
680
                       revprops=revprops)
705
681
        except errors.PointlessCommit:
706
682
            response = self._question_dialog(
707
 
                _i18n('Commit with no changes?'),
708
 
                _i18n('There are no changes in the working tree.'
709
 
                      ' Do you want to commit anyway?'),
710
 
                parent=self)
 
683
                                _('Commit with no changes?'),
 
684
                                _('There are no changes in the working tree.'
 
685
                                  ' Do you want to commit anyway?'))
711
686
            if response == gtk.RESPONSE_YES:
712
687
                rev_id = self._wt.commit(message,
713
688
                               allow_pointless=True,
721
696
    def _get_global_commit_message(self):
722
697
        buf = self._global_message_text_view.get_buffer()
723
698
        start, end = buf.get_bounds()
724
 
        text = buf.get_text(start, end)
725
 
        return _sanitize_and_decode_message(text)
 
699
        return buf.get_text(start, end).decode('utf-8')
726
700
 
727
701
    def _set_global_commit_message(self, message):
728
702
        """Just a helper for the test suite."""