/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: John Arbash Meinel
  • Date: 2007-10-30 21:15:13 UTC
  • mfrom: (326 trunk)
  • mto: (330.3.3 trunk)
  • mto: This revision was merged to the branch mainline in revision 368.
  • Revision ID: john@arbash-meinel.com-20071030211513-l8ukdfa81g1y74mi
Merge the latest trunk 326

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
105
104
                                  parent=parent,
106
105
                                  flags=0,
107
106
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
 
107
        self._question_dialog = question_dialog
108
108
 
109
109
        self._wt = wt
110
110
        # TODO: Do something with this value, it is used by Olive
111
111
        #       It used to set all changes but this one to False
112
112
        self._selected = selected
113
113
        self._enable_per_file_commits = True
114
 
        self._commit_all_changes = True
115
114
        self.committed_revision_id = None # Nothing has been committed yet
116
115
 
117
116
        self.setup_params()
164
163
        store = self._files_store
165
164
        self._treeview_files.set_model(None)
166
165
 
167
 
        added = _i18n('added')
168
 
        removed = _i18n('removed')
169
 
        renamed = _i18n('renamed')
170
 
        renamed_and_modified = _i18n('renamed and modified')
171
 
        modified = _i18n('modified')
172
 
        kind_changed = _i18n('kind changed')
 
166
        added = _('added')
 
167
        removed = _('removed')
 
168
        renamed = _('renamed')
 
169
        renamed_and_modified = _('renamed and modified')
 
170
        modified = _('modified')
 
171
        kind_changed = _('kind changed')
173
172
 
174
173
        # The store holds:
175
174
        # [file_id, real path, checkbox, display path, changes type, message]
176
 
        # iter_changes returns:
 
175
        # _iter_changes returns:
177
176
        # (file_id, (path_in_source, path_in_target),
178
177
        #  changed_content, versioned, parent, name, kind,
179
178
        #  executable)
186
185
        self._wt.lock_read()
187
186
        self._basis_tree.lock_read()
188
187
        try:
189
 
            from diff import iter_changes_to_status
 
188
            from diff import _iter_changes_to_status
190
189
            for (file_id, real_path, change_type, display_path
191
 
                ) in iter_changes_to_status(self._basis_tree, self._wt):
 
190
                ) in _iter_changes_to_status(self._basis_tree, self._wt):
192
191
                if self._selected and real_path != self._selected:
193
192
                    enabled = False
194
193
                else:
227
226
            return
228
227
        if have_dbus:
229
228
            bus = dbus.SystemBus()
230
 
            try:
231
 
                proxy_obj = bus.get_object('org.freedesktop.NetworkManager',
232
 
                                           '/org/freedesktop/NetworkManager')
233
 
            except dbus.DBusException:
234
 
                mutter("networkmanager not available.")
235
 
                self._check_local.show()
236
 
                return
237
 
            
 
229
            proxy_obj = bus.get_object('org.freedesktop.NetworkManager',
 
230
                                       '/org/freedesktop/NetworkManager')
238
231
            dbus_iface = dbus.Interface(proxy_obj,
239
232
                                        'org.freedesktop.NetworkManager')
240
233
            try:
257
250
            self._enable_per_file_commits = True
258
251
        if not self._enable_per_file_commits:
259
252
            self._file_message_expander.hide()
260
 
            self._global_message_label.set_markup(_i18n('<b>Commit Message</b>'))
261
253
 
262
254
    def _compute_delta(self):
263
255
        self._delta = self._wt.changes_from(self._basis_tree)
302
294
                            gtk.gdk.CONTROL_MASK, 0, self._on_accel_next)
303
295
        self.add_accel_group(group)
304
296
 
305
 
        # ignore the escape key (avoid closing the window)
306
 
        self.connect_object('close', self.emit_stop_by_name, 'close')
307
 
 
308
297
    def _construct_left_pane(self):
309
298
        self._left_pane_box = gtk.VBox(homogeneous=False, spacing=5)
310
299
        self._construct_file_list()
311
300
        self._construct_pending_list()
312
301
 
313
 
        self._check_local = gtk.CheckButton(_i18n("_Only commit locally"),
 
302
        self._check_local = gtk.CheckButton(_("_Only commit locally"),
314
303
                                            use_underline=True)
315
304
        self._left_pane_box.pack_end(self._check_local, False, False)
316
305
        self._check_local.set_active(False)
337
326
        self._hpane.pack2(self._right_pane_table, resize=True, shrink=True)
338
327
 
339
328
    def _construct_action_pane(self):
340
 
        self._button_commit = gtk.Button(_i18n("Comm_it"), use_underline=True)
 
329
        self._button_commit = gtk.Button(_("Comm_it"), use_underline=True)
341
330
        self._button_commit.connect('clicked', self._on_commit_clicked)
342
331
        self._button_commit.set_flags(gtk.CAN_DEFAULT)
343
332
        self._button_commit.show()
363
352
 
364
353
    def _construct_file_list(self):
365
354
        self._files_box = gtk.VBox(homogeneous=False, spacing=0)
366
 
        file_label = gtk.Label(_i18n('Files'))
367
 
        # file_label.show()
 
355
        file_label = gtk.Label(_('Files'))
 
356
        file_label.show()
368
357
        self._files_box.pack_start(file_label, expand=False)
369
358
 
370
 
        self._commit_all_files_radio = gtk.RadioButton(
371
 
            None, _i18n("Commit all changes"))
372
 
        self._files_box.pack_start(self._commit_all_files_radio, expand=False)
373
 
        self._commit_all_files_radio.show()
374
 
        self._commit_all_files_radio.connect('toggled',
375
 
            self._toggle_commit_selection)
376
 
        self._commit_selected_radio = gtk.RadioButton(
377
 
            self._commit_all_files_radio, _i18n("Only commit selected changes"))
378
 
        self._files_box.pack_start(self._commit_selected_radio, expand=False)
379
 
        self._commit_selected_radio.show()
380
 
        self._commit_selected_radio.connect('toggled',
381
 
            self._toggle_commit_selection)
382
 
        if self._pending:
383
 
            self._commit_all_files_radio.set_label(_i18n('Commit all changes*'))
384
 
            self._commit_all_files_radio.set_sensitive(False)
385
 
            self._commit_selected_radio.set_sensitive(False)
386
 
 
387
359
        scroller = gtk.ScrolledWindow()
388
360
        scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
389
361
        self._treeview_files = gtk.TreeView()
410
382
        self._files_store = liststore
411
383
        self._treeview_files.set_model(liststore)
412
384
        crt = gtk.CellRendererToggle()
413
 
        crt.set_property('activatable', not bool(self._pending))
 
385
        crt.set_active(not bool(self._pending))
414
386
        crt.connect("toggled", self._toggle_commit, self._files_store)
415
387
        if self._pending:
416
 
            name = _i18n('Commit*')
 
388
            name = _('Commit*')
417
389
        else:
418
 
            name = _i18n('Commit')
419
 
        commit_col = gtk.TreeViewColumn(name, crt, active=2)
420
 
        commit_col.set_visible(False)
421
 
        self._treeview_files.append_column(commit_col)
422
 
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Path'),
 
390
            name = _('Commit')
 
391
        self._treeview_files.append_column(gtk.TreeViewColumn(name,
 
392
                                           crt, active=2))
 
393
        self._treeview_files.append_column(gtk.TreeViewColumn(_('Path'),
423
394
                                           gtk.CellRendererText(), text=3))
424
 
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Type'),
 
395
        self._treeview_files.append_column(gtk.TreeViewColumn(_('Type'),
425
396
                                           gtk.CellRendererText(), text=4))
426
397
        self._treeview_files.connect('cursor-changed',
427
398
                                     self._on_treeview_files_cursor_changed)
434
405
        else:
435
406
            model[path][2] = not model[path][2]
436
407
 
437
 
    def _toggle_commit_selection(self, button):
438
 
        all_files = self._commit_all_files_radio.get_active()
439
 
        if self._commit_all_changes != all_files:
440
 
            checked_col = self._treeview_files.get_column(0)
441
 
            self._commit_all_changes = all_files
442
 
            if all_files:
443
 
                checked_col.set_visible(False)
444
 
            else:
445
 
                checked_col.set_visible(True)
446
 
            renderer = checked_col.get_cell_renderers()[0]
447
 
            renderer.set_property('activatable', not all_files)
448
 
 
449
408
    def _construct_pending_list(self):
450
409
        # Pending information defaults to hidden, we put it all in 1 box, so
451
410
        # that we can show/hide all of them at once
454
413
 
455
414
        pending_message = gtk.Label()
456
415
        pending_message.set_markup(
457
 
            _i18n('<i>* Cannot select specific files when merging</i>'))
 
416
            _('<i>* Cannot select specific files when merging</i>'))
458
417
        self._pending_box.pack_start(pending_message, expand=False, padding=5)
459
418
        pending_message.show()
460
419
 
461
 
        pending_label = gtk.Label(_i18n('Pending Revisions'))
 
420
        pending_label = gtk.Label(_('Pending Revisions'))
462
421
        self._pending_box.pack_start(pending_label, expand=False, padding=0)
463
422
        pending_label.show()
464
423
 
480
439
                                 )
481
440
        self._pending_store = liststore
482
441
        self._treeview_pending.set_model(liststore)
483
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Date'),
 
442
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Date'),
484
443
                                             gtk.CellRendererText(), text=1))
485
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Committer'),
 
444
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Committer'),
486
445
                                             gtk.CellRendererText(), text=2))
487
 
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Summary'),
 
446
        self._treeview_pending.append_column(gtk.TreeViewColumn(_('Summary'),
488
447
                                             gtk.CellRendererText(), text=3))
489
448
 
490
449
    def _construct_diff_view(self):
491
450
        from diff import DiffView
492
451
 
493
 
        # TODO: jam 2007-10-30 The diff label is currently disabled. If we
494
 
        #       decide that we really don't ever want to display it, we should
495
 
        #       actually remove it, and other references to it, along with the
496
 
        #       tests that it is set properly.
497
 
        self._diff_label = gtk.Label(_i18n('Diff for whole tree'))
 
452
        self._diff_label = gtk.Label(_('Diff for whole tree'))
498
453
        self._diff_label.set_alignment(0, 0)
499
454
        self._right_pane_table.set_row_spacing(self._right_pane_table_row, 0)
500
455
        self._add_to_right_table(self._diff_label, 1, False)
501
 
        # self._diff_label.show()
 
456
        self._diff_label.show()
502
457
 
503
458
        self._diff_view = DiffView()
504
459
        self._add_to_right_table(self._diff_view, 4, True)
518
473
        self._file_message_text_view.set_accepts_tab(False)
519
474
        self._file_message_text_view.show()
520
475
 
521
 
        self._file_message_expander = gtk.Expander(_i18n('File commit message'))
 
476
        self._file_message_expander = gtk.Expander(_('File commit message'))
522
477
        self._file_message_expander.set_expanded(True)
523
478
        self._file_message_expander.add(scroller)
524
479
        self._add_to_right_table(self._file_message_expander, 1, False)
525
480
        self._file_message_expander.show()
526
481
 
527
482
    def _construct_global_message(self):
528
 
        self._global_message_label = gtk.Label(_i18n('Global Commit Message'))
529
 
        self._global_message_label.set_markup(
530
 
            _i18n('<b>Global Commit Message</b>'))
 
483
        self._global_message_label = gtk.Label(_('Global Commit Message'))
531
484
        self._global_message_label.set_alignment(0, 0)
532
485
        self._right_pane_table.set_row_spacing(self._right_pane_table_row, 0)
533
486
        self._add_to_right_table(self._global_message_label, 1, False)
553
506
 
554
507
        if selection is not None:
555
508
            path, display_path = model.get(selection, 1, 3)
556
 
            self._diff_label.set_text(_i18n('Diff for ') + display_path)
 
509
            self._diff_label.set_text(_('Diff for ') + display_path)
557
510
            if path is None:
558
511
                self._diff_view.show_diff(None)
559
512
            else:
600
553
        text_buffer = self._file_message_text_view.get_buffer()
601
554
        file_id, display_path, message = self._files_store.get(selection, 0, 3, 5)
602
555
        if file_id is None: # Whole tree
603
 
            self._file_message_expander.set_label(_i18n('File commit message'))
 
556
            self._file_message_expander.set_label(_('File commit message'))
604
557
            self._file_message_expander.set_expanded(False)
605
558
            self._file_message_expander.set_sensitive(False)
606
559
            text_buffer.set_text('')
607
560
            self._last_selected_file = None
608
561
        else:
609
 
            self._file_message_expander.set_label(_i18n('Commit message for ')
 
562
            self._file_message_expander.set_label(_('Commit message for ')
610
563
                                                  + display_path)
611
564
            self._file_message_expander.set_expanded(True)
612
565
            self._file_message_expander.set_sensitive(True)
626
579
 
627
580
        file_info = []
628
581
        for record in records:
629
 
            if self._commit_all_changes or record[2]:# [2] checkbox
 
582
            if record[2]:           # [2] checkbox
630
583
                file_id = record[0] # [0] file_id
631
584
                path = record[1]    # [1] real path
632
585
                file_message = record[5] # [5] commit message
650
603
        message = self._get_global_commit_message()
651
604
 
652
605
        if message == '':
653
 
            response = question_dialog(
654
 
                _i18n('Commit with an empty message?'),
655
 
                _i18n('You can describe your commit intent in the message.'),
656
 
                parent=self)
 
606
            response = self._question_dialog(
 
607
                            _('Commit with an empty message?'),
 
608
                            _('You can describe your commit intent in the message.'))
657
609
            if response == gtk.RESPONSE_NO:
658
610
                # Kindly give focus to message area
659
611
                self._global_message_text_view.grab_focus()
671
623
        #       entirely, since there isn't a way for them to add the unknown
672
624
        #       files at this point.
673
625
        for path in self._wt.unknowns():
674
 
            response = question_dialog(
675
 
                _i18n("Commit with unknowns?"),
676
 
                _i18n("Unknown files exist in the working tree. Commit anyway?"),
677
 
                parent=self)
678
 
                # Doesn't set a parent for the dialog..
 
626
            response = self._question_dialog(
 
627
                _("Commit with unknowns?"),
 
628
                _("Unknown files exist in the working tree. Commit anyway?"))
679
629
            if response == gtk.RESPONSE_NO:
680
630
                return
681
631
            break
692
642
                       specific_files=specific_files,
693
643
                       revprops=revprops)
694
644
        except errors.PointlessCommit:
695
 
            response = question_dialog(
696
 
                _i18n('Commit with no changes?'),
697
 
                _i18n('There are no changes in the working tree.'
698
 
                      ' Do you want to commit anyway?'),
699
 
                parent=self)
 
645
            response = self._question_dialog(
 
646
                                _('Commit with no changes?'),
 
647
                                _('There are no changes in the working tree.'
 
648
                                  ' Do you want to commit anyway?'))
700
649
            if response == gtk.RESPONSE_YES:
701
650
                rev_id = self._wt.commit(message,
702
651
                               allow_pointless=True,