/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 olive/__init__.py

  • Committer: Robert Collins
  • Date: 2007-07-07 22:02:45 UTC
  • mto: This revision was merged to the branch mainline in revision 216.
  • Revision ID: robertc@robertcollins.net-20070707220245-rqbiv4nerkk7z9oc
Add a Branch button to commit-notify.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 #!/usr/bin/python
2
 
 
3
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
4
2
#
5
3
# This program is free software; you can redistribute it and/or modify
41
39
from bzrlib.ui import ui_factory
42
40
from bzrlib.workingtree import WorkingTree
43
41
 
44
 
from bzrlib.plugins.gtk import _i18n
45
42
from bzrlib.plugins.gtk.dialog import error_dialog, info_dialog, warning_dialog
46
43
from bzrlib.plugins.gtk.errors import show_bzr_error
47
44
from guifiles import GLADEFILENAME
58
55
from bzrlib.plugins.gtk.push import PushDialog
59
56
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
60
57
 
61
 
def about():
62
 
    """ Display the AboutDialog. """
63
 
    from bzrlib.plugins.gtk import __version__
64
 
    from bzrlib.plugins.gtk.olive.guifiles import GLADEFILENAME
65
 
 
66
 
    # Load AboutDialog description
67
 
    dglade = gtk.glade.XML(GLADEFILENAME, 'aboutdialog')
68
 
    dialog = dglade.get_widget('aboutdialog')
69
 
 
70
 
    # Set version
71
 
    dialog.set_version(__version__)
72
 
    dialog.set_authors([ _i18n("Lead Developer:"),
73
 
                         "Szilveszter Farkas <szilveszter.farkas@gmail.com>",
74
 
                         _i18n("Contributors:"),
75
 
                         "Jelmer Vernooij <jelmer@samba.org>",
76
 
                         "Mateusz Korniak <mateusz.korniak@ant.gliwice.pl>",
77
 
                         "Gary van der Merwe <garyvdm@gmail.com>" ])
78
 
    dialog.set_artists([ "Simon Pascal Klein <klepas@klepas.org>",
79
 
                         "Jakub Steiner <jimmac@novell.com>" ])
80
 
 
81
 
    dialog.run()
82
 
    # Destroy the dialog
83
 
    dialog.destroy()
84
 
 
85
58
class OliveGtk:
86
59
    """ The main Olive GTK frontend class. This is called when launching the
87
60
    program. """
106
79
        # Get some important menu items
107
80
        self.menuitem_add_files = self.toplevel.get_widget('menuitem_add_files')
108
81
        self.menuitem_remove_files = self.toplevel.get_widget('menuitem_remove_file')
109
 
        self.menuitem_file_bookmark = self.toplevel.get_widget('menuitem_file_bookmark')
110
82
        self.menuitem_file_make_directory = self.toplevel.get_widget('menuitem_file_make_directory')
111
83
        self.menuitem_file_rename = self.toplevel.get_widget('menuitem_file_rename')
112
84
        self.menuitem_file_move = self.toplevel.get_widget('menuitem_file_move')
113
85
        self.menuitem_file_annotate = self.toplevel.get_widget('menuitem_file_annotate')
114
86
        self.menuitem_view_show_hidden_files = self.toplevel.get_widget('menuitem_view_show_hidden_files')
115
 
        self.menuitem_view_show_ignored_files = self.toplevel.get_widget('menuitem_view_show_ignored_files')
116
87
        self.menuitem_branch = self.toplevel.get_widget('menuitem_branch')
117
88
        self.menuitem_branch_init = self.toplevel.get_widget('menuitem_branch_initialize')
118
89
        self.menuitem_branch_get = self.toplevel.get_widget('menuitem_branch_get')
119
90
        self.menuitem_branch_checkout = self.toplevel.get_widget('menuitem_branch_checkout')
120
91
        self.menuitem_branch_pull = self.toplevel.get_widget('menuitem_branch_pull')
121
92
        self.menuitem_branch_push = self.toplevel.get_widget('menuitem_branch_push')
122
 
        self.menuitem_branch_update = self.toplevel.get_widget('menuitem_branch_update')
123
93
        self.menuitem_branch_revert = self.toplevel.get_widget('menuitem_branch_revert')
124
94
        self.menuitem_branch_merge = self.toplevel.get_widget('menuitem_branch_merge')
125
95
        self.menuitem_branch_commit = self.toplevel.get_widget('menuitem_branch_commit')
137
107
        self.toolbutton_commit = self.toplevel.get_widget('toolbutton_commit')
138
108
        self.toolbutton_pull = self.toplevel.get_widget('toolbutton_pull')
139
109
        self.toolbutton_push = self.toplevel.get_widget('toolbutton_push')
140
 
        self.toolbutton_update = self.toplevel.get_widget('toolbutton_update')
141
110
        # Get the drive selector
142
111
        self.combobox_drive = gtk.combo_box_new_text()
143
112
        self.combobox_drive.connect("changed", self._refresh_drives)
163
132
                "on_about_activate": self.on_about_activate,
164
133
                "on_menuitem_add_files_activate": self.on_menuitem_add_files_activate,
165
134
                "on_menuitem_remove_file_activate": self.on_menuitem_remove_file_activate,
166
 
                "on_menuitem_file_bookmark_activate": self.on_menuitem_file_bookmark_activate,
167
135
                "on_menuitem_file_make_directory_activate": self.on_menuitem_file_make_directory_activate,
168
136
                "on_menuitem_file_move_activate": self.on_menuitem_file_move_activate,
169
137
                "on_menuitem_file_rename_activate": self.on_menuitem_file_rename_activate,
170
138
                "on_menuitem_file_annotate_activate": self.on_menuitem_file_annotate_activate,
171
139
                "on_menuitem_view_show_hidden_files_activate": self.on_menuitem_view_show_hidden_files_activate,
172
 
                "on_menuitem_view_show_ignored_files_activate": self.on_menuitem_view_show_ignored_files_activate,
173
140
                "on_menuitem_view_refresh_activate": self.on_menuitem_view_refresh_activate,
174
141
                "on_menuitem_branch_initialize_activate": self.on_menuitem_branch_initialize_activate,
175
142
                "on_menuitem_branch_get_activate": self.on_menuitem_branch_get_activate,
179
146
                "on_menuitem_branch_commit_activate": self.on_menuitem_branch_commit_activate,
180
147
                "on_menuitem_branch_push_activate": self.on_menuitem_branch_push_activate,
181
148
                "on_menuitem_branch_pull_activate": self.on_menuitem_branch_pull_activate,
182
 
                "on_menuitem_branch_update_activate": self.on_menuitem_branch_update_activate,                
183
149
                "on_menuitem_branch_tags_activate": self.on_menuitem_branch_tags_activate,
184
150
                "on_menuitem_branch_status_activate": self.on_menuitem_branch_status_activate,
185
151
                "on_menuitem_branch_missing_revisions_activate": self.on_menuitem_branch_missing_revisions_activate,
194
160
                "on_toolbutton_commit_clicked": self.on_menuitem_branch_commit_activate,
195
161
                "on_toolbutton_pull_clicked": self.on_menuitem_branch_pull_activate,
196
162
                "on_toolbutton_push_clicked": self.on_menuitem_branch_push_activate,
197
 
                "on_toolbutton_update_clicked": self.on_menuitem_branch_update_activate,
198
163
                "on_treeview_right_button_press_event": self.on_treeview_right_button_press_event,
199
164
                "on_treeview_right_row_activated": self.on_treeview_right_row_activated,
200
165
                "on_treeview_left_button_press_event": self.on_treeview_left_button_press_event,
201
 
                "on_treeview_left_button_release_event": self.on_treeview_left_button_release_event,
202
166
                "on_treeview_left_row_activated": self.on_treeview_left_row_activated,
203
167
                "on_button_location_up_clicked": self.on_button_location_up_clicked,
204
168
                "on_button_location_jump_clicked": self.on_button_location_jump_clicked,
242
206
 
243
207
        # Apply menu state
244
208
        self.menuitem_view_show_hidden_files.set_active(self.pref.get_preference('dotted_files', 'bool'))
245
 
        self.menuitem_view_show_ignored_files.set_active(self.pref.get_preference('ignored_files', 'bool'))
246
209
 
247
210
        # We're starting local
248
211
        self.remote = False
391
354
                return self.remote_branch.base
392
355
   
393
356
    def on_about_activate(self, widget):
 
357
        from bzrlib.plugins.gtk.dialog import about
394
358
        about()
 
359
        
395
360
    
396
361
    def on_button_history_browse_clicked(self, widget):
397
362
        """ Browse for revision button handler. """
446
411
    @show_bzr_error
447
412
    def on_entry_history_revno_key_press_event(self, widget, event):
448
413
        """ Key pressed handler for the history entry. """
449
 
        if event.keyval == gtk.gdk.keyval_from_name('Return') or event.keyval == gtk.gdk.keyval_from_name('KP_Enter'):
 
414
        if event.keyval == 65293:
450
415
            # Return was hit, so we have to load that specific revision
451
416
            # Emulate being remote, so inventory should be used
452
417
            path = self.get_path()
461
426
    
462
427
    def on_entry_location_key_press_event(self, widget, event):
463
428
        """ Key pressed handler for the location entry. """
464
 
        if event.keyval == gtk.gdk.keyval_from_name('Return') or event.keyval == gtk.gdk.keyval_from_name('KP_Enter'):
 
429
        if event.keyval == 65293:
465
430
            # Return was hit, so we have to jump
466
431
            self.on_button_location_jump_clicked(widget)
467
432
    
508
473
    @show_bzr_error
509
474
    def on_menuitem_branch_commit_activate(self, widget):
510
475
        """ Branch/Commit... menu handler. """
511
 
#     def __init__(self, wt, wtpath, notbranch, selected=None, parent=None):
512
 
        selected = self.get_selected_right()
513
 
        if selected:
514
 
            selected = os.path.join(self.wtpath, selected)
515
 
        commit = CommitDialog(wt=self.wt,
516
 
                              parent=self.window,
517
 
                              selected=selected,
518
 
                             )
 
476
        commit = CommitDialog(self.wt, self.wtpath, self.notbranch, self.get_selected_right(), self.window)
519
477
        response = commit.run()
520
478
        if response != gtk.RESPONSE_NONE:
521
479
            commit.hide()
537
495
        from bzrlib.plugins.gtk.merge import MergeDialog
538
496
        
539
497
        if self.check_for_changes():
540
 
            error_dialog(_i18n('There are local changes in the branch'),
541
 
                         _i18n('Please commit or revert the changes before merging.'))
 
498
            error_dialog(_('There are local changes in the branch'),
 
499
                         _('Please commit or revert the changes before merging.'))
542
500
        else:
543
 
            parent_branch_path = self.wt.branch.get_parent()
544
 
            merge = MergeDialog(self.wt, self.wtpath,default_branch_path=parent_branch_path )
 
501
            merge = MergeDialog(self.wt, self.wtpath)
545
502
            merge.display()
546
503
 
547
504
    @show_bzr_error
548
505
    def on_menuitem_branch_missing_revisions_activate(self, widget):
549
506
        """ Branch/Missing revisions menu handler. """
550
 
        
551
 
        from bzrlib.missing import find_unmerged, iter_log_revisions
552
 
        
553
507
        local_branch = self.wt.branch
554
 
        parent_branch_path = local_branch.get_parent()
555
 
        if parent_branch_path is None:
556
 
            error_dialog(_i18n('Parent location is unknown'),
557
 
                         _i18n('Cannot determine missing revisions if no parent location is known.'))
 
508
        
 
509
        other_branch = local_branch.get_parent()
 
510
        if other_branch is None:
 
511
            error_dialog(_('Parent location is unknown'),
 
512
                         _('Cannot determine missing revisions if no parent location is known.'))
558
513
            return
559
514
        
560
 
        parent_branch = Branch.open(parent_branch_path)
561
 
        
562
 
        if parent_branch.base == local_branch.base:
563
 
            parent_branch = local_branch
564
 
        
565
 
        local_extra, remote_extra = find_unmerged(local_branch,parent_branch)
566
 
 
567
 
        if local_extra or remote_extra:
568
 
            
569
 
            ## def log_revision_one_line_text(log_revision):
570
 
            ##    """ Generates one line description of log_revison ended with end of line."""
571
 
            ##    revision = log_revision.rev
572
 
            ##    txt =  "- %s (%s)\n" % (revision.get_summary(), revision.committer, )
573
 
            ##    txt = txt.replace("<"," ") # Seems < > chars are expected to be xml tags ...
574
 
            ##    txt = txt.replace(">"," ")
575
 
            ##    return txt
576
 
            
577
 
            dlg_txt = ""
578
 
            if local_extra:
579
 
                dlg_txt += _i18n('%d local extra revision(s). \n') % (len(local_extra),) 
580
 
                ## NOTE: We do not want such ugly info about missing revisions
581
 
                ##       Revision Browser should be used there
582
 
                ## max_revisions = 10
583
 
                ## for log_revision in iter_log_revisions(local_extra, local_branch.repository, verbose=1):
584
 
                ##    dlg_txt += log_revision_one_line_text(log_revision)
585
 
                ##    if max_revisions <= 0:
586
 
                ##        dlg_txt += _i18n("more ... \n")
587
 
                ##        break
588
 
                ## max_revisions -= 1
589
 
            ## dlg_txt += "\n"
590
 
            if remote_extra:
591
 
                dlg_txt += _i18n('%d local missing revision(s).\n') % (len(remote_extra),) 
592
 
                ## max_revisions = 10
593
 
                ## for log_revision in iter_log_revisions(remote_extra, parent_branch.repository, verbose=1):
594
 
                ##    dlg_txt += log_revision_one_line_text(log_revision)
595
 
                ##    if max_revisions <= 0:
596
 
                ##        dlg_txt += _i18n("more ... \n")
597
 
                ##        break
598
 
                ##    max_revisions -= 1
599
 
                
600
 
            info_dialog(_i18n('There are missing revisions'),
601
 
                        dlg_txt)
 
515
        remote_branch = Branch.open(other_branch)
 
516
        
 
517
        if remote_branch.base == local_branch.base:
 
518
            remote_branch = local_branch
 
519
 
 
520
        ret = len(local_branch.missing_revisions(remote_branch))
 
521
 
 
522
        if ret > 0:
 
523
            info_dialog(_('There are missing revisions'),
 
524
                        _('%d revision(s) missing.') % ret)
602
525
        else:
603
 
            info_dialog(_i18n('Local branch up to date'),
604
 
                        _i18n('There are no missing revisions.'))
 
526
            info_dialog(_('Local branch up to date'),
 
527
                        _('There are no missing revisions.'))
605
528
 
606
529
    @show_bzr_error
607
530
    def on_menuitem_branch_pull_activate(self, widget):
610
533
 
611
534
        location = branch_to.get_parent()
612
535
        if location is None:
613
 
            error_dialog(_i18n('Parent location is unknown'),
614
 
                                     _i18n('Pulling is not possible until there is a parent location.'))
 
536
            error_dialog(_('Parent location is unknown'),
 
537
                                     _('Pulling is not possible until there is a parent location.'))
615
538
            return
616
539
 
617
540
        branch_from = Branch.open(location)
621
544
 
622
545
        ret = branch_to.pull(branch_from)
623
546
        
624
 
        info_dialog(_i18n('Pull successful'), _i18n('%d revision(s) pulled.') % ret)
625
 
        
626
 
    @show_bzr_error
627
 
    def on_menuitem_branch_update_activate(self, widget):
628
 
        """ Brranch/checkout update menu handler. """
629
 
        
630
 
        ret = self.wt.update()
631
 
        conflicts = self.wt.conflicts()
632
 
        if conflicts:
633
 
            info_dialog(_i18n('Update successful but conflicts generated'), _i18n('Number of conflicts generated: %d.') % (len(conflicts),) )
634
 
        else:
635
 
            info_dialog(_i18n('Update successful'), _i18n('No conflicts generated.') )
 
547
        info_dialog(_('Pull successful'), _('%d revision(s) pulled.') % ret)
636
548
    
637
549
    def on_menuitem_branch_push_activate(self, widget):
638
550
        """ Branch/Push... menu handler. """
639
 
        push = PushDialog(repository=None,revid=None,branch=self.wt.branch, parent=self.window)
 
551
        push = PushDialog(self.wt.branch, self.window)
640
552
        response = push.run()
641
553
        if response != gtk.RESPONSE_NONE:
642
554
            push.destroy()
646
558
        """ Branch/Revert all changes menu handler. """
647
559
        ret = self.wt.revert([])
648
560
        if ret:
649
 
            warning_dialog(_i18n('Conflicts detected'),
650
 
                           _i18n('Please have a look at the working tree before continuing.'))
 
561
            warning_dialog(_('Conflicts detected'),
 
562
                           _('Please have a look at the working tree before continuing.'))
651
563
        else:
652
 
            info_dialog(_i18n('Revert successful'),
653
 
                        _i18n('All files reverted to last revision.'))
 
564
            info_dialog(_('Revert successful'),
 
565
                        _('All files reverted to last revision.'))
654
566
        self.refresh_right()
655
567
    
656
568
    def on_menuitem_branch_status_activate(self, widget):
685
597
    def on_menuitem_file_annotate_activate(self, widget):
686
598
        """ File/Annotate... menu handler. """
687
599
        if self.get_selected_right() is None:
688
 
            error_dialog(_i18n('No file was selected'),
689
 
                         _i18n('Please select a file from the list.'))
 
600
            error_dialog(_('No file was selected'),
 
601
                         _('Please select a file from the list.'))
690
602
            return
691
603
        
692
604
        branch = self.wt.branch
693
605
        file_id = self.wt.path2id(self.wt.relpath(os.path.join(self.path, self.get_selected_right())))
694
606
        
695
 
        window = GAnnotateWindow(all=False, plain=False, parent=self.window)
 
607
        window = GAnnotateWindow(all=False, plain=False)
696
608
        window.set_title(os.path.join(self.path, self.get_selected_right()) + " - Annotate")
697
609
        config = GAnnotateConfig(window)
698
610
        window.show()
702
614
        finally:
703
615
            branch.unlock()
704
616
    
705
 
    def on_menuitem_file_bookmark_activate(self, widget):
706
 
        """ File/Bookmark current directory menu handler. """
707
 
        if self.pref.add_bookmark(self.path):
708
 
            info_dialog(_i18n('Bookmark successfully added'),
709
 
                        _i18n('The current directory was bookmarked. You can reach\nit by selecting it from the left panel.'))
710
 
            self.pref.write()
711
 
        else:
712
 
            warning_dialog(_i18n('Location already bookmarked'),
713
 
                           _i18n('The current directory is already bookmarked.\nSee the left panel for reference.'))
714
 
        
715
 
        self.refresh_left()
716
 
    
717
617
    def on_menuitem_file_make_directory_activate(self, widget):
718
618
        """ File/Make directory... menu handler. """
719
619
        from mkdir import OliveMkdir
751
651
    
752
652
    def on_menuitem_stats_diff_activate(self, widget):
753
653
        """ Statistics/Differences... menu handler. """
754
 
        window = DiffWindow(parent=self.window)
 
654
        window = DiffWindow()
755
655
        parent_tree = self.wt.branch.repository.revision_tree(self.wt.branch.last_revision())
756
656
        window.set_diff(self.wt.branch.nick, self.wt, parent_tree)
757
657
        window.show()
767
667
    
768
668
    def on_menuitem_stats_log_activate(self, widget):
769
669
        """ Statistics/Log... menu handler. """
770
 
 
 
670
        window = branchwin.BranchWindow()
771
671
        if not self.remote:
772
 
            branch = self.wt.branch
 
672
            window.set_branch(self.wt.branch, self.wt.branch.last_revision(), None)
773
673
        else:
774
 
            branch = self.remote_branch
775
 
 
776
 
        window = branchwin.BranchWindow(branch, branch.last_revision(), None, parent=self.window)
 
674
            window.set_branch(self.remote_branch, self.remote_branch.last_revision(), None)
777
675
        window.show()
778
676
    
779
677
    def on_menuitem_view_refresh_activate(self, widget):
789
687
        if self.path is not None:
790
688
            self.refresh_right()
791
689
 
792
 
    def on_menuitem_view_show_ignored_files_activate(self, widget):
793
 
        """ Hide/Show ignored files menu handler. """
794
 
        self.pref.set_preference('ignored_files', widget.get_active())
795
 
        if self.path is not None:
796
 
            self.refresh_right()
797
 
            
798
690
    def on_treeview_left_button_press_event(self, widget, event):
799
691
        """ Occurs when somebody right-clicks in the bookmark list. """
800
692
        if event.button == 3:
811
703
            menu.left_context_menu().popup(None, None, None, 0,
812
704
                                           event.time)
813
705
 
814
 
    def on_treeview_left_button_release_event(self, widget, event):
815
 
        """ Occurs when somebody just clicks a bookmark. """
816
 
        if event.button != 3:
817
 
            # Allow one-click bookmark opening
818
 
            if self.get_selected_left() == None:
819
 
                return
820
 
            
821
 
            newdir = self.get_selected_left()
822
 
            if newdir == None:
823
 
                return
824
 
 
825
 
            if self.set_path(newdir):
826
 
                self.refresh_right()
827
 
 
828
706
    def on_treeview_left_row_activated(self, treeview, path, view_column):
829
707
        """ Occurs when somebody double-clicks or enters an item in the
830
708
        bookmark list. """
940
818
        bookmarks = self.pref.get_bookmarks()
941
819
        
942
820
        # Add them to the TreeStore
943
 
        titer = treestore.append(None, [_i18n('Bookmarks'), None])
 
821
        titer = treestore.append(None, [_('Bookmarks'), None])
944
822
        for item in bookmarks:
945
823
            title = self.pref.get_bookmark_title(item)
946
824
            treestore.append(titer, [title, item])
947
825
        
948
826
        # Create the column and add it to the TreeView
949
827
        self.treeview_left.set_model(treestore)
950
 
        tvcolumn_bookmark = gtk.TreeViewColumn(_i18n('Bookmark'))
 
828
        tvcolumn_bookmark = gtk.TreeViewColumn(_('Bookmark'))
951
829
        self.treeview_left.append_column(tvcolumn_bookmark)
952
830
        
953
831
        # Set up the cells
961
839
    def _load_right(self):
962
840
        """ Load data into the right panel. (Filelist) """
963
841
        # Create ListStore
964
 
        # Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid ]
 
842
        # Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid]
965
843
        liststore = gtk.ListStore(gobject.TYPE_STRING,
966
844
                                  gobject.TYPE_BOOLEAN,
967
845
                                  gobject.TYPE_STRING,
968
846
                                  gobject.TYPE_STRING,
969
847
                                  gobject.TYPE_STRING,
970
 
                                  gobject.TYPE_STRING,
 
848
                                  gobject.TYPE_INT,
971
849
                                  gobject.TYPE_STRING,
972
850
                                  gobject.TYPE_INT,
973
851
                                  gobject.TYPE_STRING,
994
872
        
995
873
        # Add'em to the ListStore
996
874
        for item in dirs:
997
 
            try:
998
 
                statinfo = os.stat(self.path + os.sep + item)
999
 
            except OSError, e:
1000
 
                if e.errno == 40:
1001
 
                    continue
1002
 
                else:
1003
 
                    raise
 
875
            statinfo = os.stat(self.path + os.sep + item)
1004
876
            liststore.append([ gtk.STOCK_DIRECTORY,
1005
877
                               True,
1006
878
                               item,
1007
879
                               '',
1008
880
                               '',
1009
 
                               "<DIR>",
1010
 
                               "<DIR>",
 
881
                               statinfo.st_size,
 
882
                               self._format_size(statinfo.st_size),
1011
883
                               statinfo.st_mtime,
1012
884
                               self._format_date(statinfo.st_mtime),
1013
885
                               ''])
1047
919
                    self.wt.unlock()
1048
920
            
1049
921
            if status == 'renamed':
1050
 
                st = _i18n('renamed')
 
922
                st = _('renamed')
1051
923
            elif status == 'removed':
1052
 
                st = _i18n('removed')
 
924
                st = _('removed')
1053
925
            elif status == 'added':
1054
 
                st = _i18n('added')
 
926
                st = _('added')
1055
927
            elif status == 'modified':
1056
 
                st = _i18n('modified')
 
928
                st = _('modified')
1057
929
            elif status == 'unchanged':
1058
 
                st = _i18n('unchanged')
 
930
                st = _('unchanged')
1059
931
            elif status == 'ignored':
1060
 
                st = _i18n('ignored')
 
932
                st = _('ignored')
1061
933
            else:
1062
 
                st = _i18n('unknown')
 
934
                st = _('unknown')
1063
935
            
1064
 
            try:
1065
 
                statinfo = os.stat(self.path + os.sep + item)
1066
 
            except OSError, e:
1067
 
                if e.errno == 40:
1068
 
                    continue
1069
 
                else:
1070
 
                    raise
 
936
            statinfo = os.stat(self.path + os.sep + item)
1071
937
            liststore.append([gtk.STOCK_FILE,
1072
938
                              False,
1073
939
                              item,
1074
940
                              st,
1075
941
                              status,
1076
 
                              str(statinfo.st_size), # NOTE: if int used there it will fail for large files (size expressed as long int)
 
942
                              statinfo.st_size,
1077
943
                              self._format_size(statinfo.st_size),
1078
944
                              statinfo.st_mtime,
1079
945
                              self._format_date(statinfo.st_mtime),
1081
947
        
1082
948
        # Create the columns and add them to the TreeView
1083
949
        self.treeview_right.set_model(liststore)
1084
 
        self._tvcolumn_filename = gtk.TreeViewColumn(_i18n('Filename'))
1085
 
        self._tvcolumn_status = gtk.TreeViewColumn(_i18n('Status'))
1086
 
        self._tvcolumn_size = gtk.TreeViewColumn(_i18n('Size'))
1087
 
        self._tvcolumn_mtime = gtk.TreeViewColumn(_i18n('Last modified'))
 
950
        self._tvcolumn_filename = gtk.TreeViewColumn(_('Filename'))
 
951
        self._tvcolumn_status = gtk.TreeViewColumn(_('Status'))
 
952
        self._tvcolumn_size = gtk.TreeViewColumn(_('Size'))
 
953
        self._tvcolumn_mtime = gtk.TreeViewColumn(_('Last modified'))
1088
954
        self.treeview_right.append_column(self._tvcolumn_filename)
1089
955
        self.treeview_right.append_column(self._tvcolumn_status)
1090
956
        self.treeview_right.append_column(self._tvcolumn_size)
1170
1036
            self.menuitem_branch_checkout.set_sensitive(self.notbranch)
1171
1037
            self.menuitem_branch_pull.set_sensitive(not self.notbranch)
1172
1038
            self.menuitem_branch_push.set_sensitive(not self.notbranch)
1173
 
            self.menuitem_branch_update.set_sensitive(not self.notbranch)
1174
1039
            self.menuitem_branch_revert.set_sensitive(not self.notbranch)
1175
1040
            self.menuitem_branch_merge.set_sensitive(not self.notbranch)
1176
1041
            self.menuitem_branch_commit.set_sensitive(not self.notbranch)
1192
1057
            self.toolbutton_commit.set_sensitive(not self.notbranch)
1193
1058
            self.toolbutton_pull.set_sensitive(not self.notbranch)
1194
1059
            self.toolbutton_push.set_sensitive(not self.notbranch)
1195
 
            self.toolbutton_update.set_sensitive(not self.notbranch)
1196
1060
        else:
1197
1061
            # We're remote
1198
1062
            self.menuitem_branch_init.set_sensitive(False)
1200
1064
            self.menuitem_branch_checkout.set_sensitive(True)
1201
1065
            self.menuitem_branch_pull.set_sensitive(False)
1202
1066
            self.menuitem_branch_push.set_sensitive(False)
1203
 
            self.menuitem_branch_update.set_sensitive(False)
1204
1067
            self.menuitem_branch_revert.set_sensitive(False)
1205
1068
            self.menuitem_branch_merge.set_sensitive(False)
1206
1069
            self.menuitem_branch_commit.set_sensitive(False)
1222
1085
            self.toolbutton_commit.set_sensitive(False)
1223
1086
            self.toolbutton_pull.set_sensitive(False)
1224
1087
            self.toolbutton_push.set_sensitive(False)
1225
 
            self.toolbutton_update.set_sensitive(False)
1226
1088
    
1227
1089
    def refresh_left(self):
1228
1090
        """ Refresh the bookmark list. """
1238
1100
        bookmarks = self.pref.get_bookmarks()
1239
1101
 
1240
1102
        # Add them to the TreeStore
1241
 
        titer = treestore.append(None, [_i18n('Bookmarks'), None])
 
1103
        titer = treestore.append(None, [_('Bookmarks'), None])
1242
1104
        for item in bookmarks:
1243
1105
            title = self.pref.get_bookmark_title(item)
1244
1106
            treestore.append(titer, [title, item])
1274
1136
    
1275
1137
            # Fill the appropriate lists
1276
1138
            dotted_files = self.pref.get_preference('dotted_files', 'bool')
1277
 
            ignored_files = self.pref.get_preference('ignored_files', 'bool')
1278
 
 
1279
1139
            for item in os.listdir(path):
1280
1140
                if not dotted_files and item[0] == '.':
1281
1141
                    continue
1299
1159
                
1300
1160
            # Add'em to the ListStore
1301
1161
            for item in dirs:
1302
 
                try:
1303
 
                    statinfo = os.stat(self.path + os.sep + item)
1304
 
                except OSError, e:
1305
 
                    if e.errno == 40:
1306
 
                        continue
1307
 
                    else:
1308
 
                        raise
 
1162
                statinfo = os.stat(self.path + os.sep + item)
1309
1163
                liststore.append([gtk.STOCK_DIRECTORY,
1310
1164
                                  True,
1311
1165
                                  item,
1312
1166
                                  '',
1313
1167
                                  '',
1314
 
                                  "<DIR>",
1315
 
                                  "<DIR>",
 
1168
                                  statinfo.st_size,
 
1169
                                  self._format_size(statinfo.st_size),
1316
1170
                                  statinfo.st_mtime,
1317
1171
                                  self._format_date(statinfo.st_mtime),
1318
1172
                                  ''])
1352
1206
                        self.wt.unlock()
1353
1207
                
1354
1208
                if status == 'renamed':
1355
 
                    st = _i18n('renamed')
 
1209
                    st = _('renamed')
1356
1210
                elif status == 'removed':
1357
 
                    st = _i18n('removed')
 
1211
                    st = _('removed')
1358
1212
                elif status == 'added':
1359
 
                    st = _i18n('added')
 
1213
                    st = _('added')
1360
1214
                elif status == 'modified':
1361
 
                    st = _i18n('modified')
 
1215
                    st = _('modified')
1362
1216
                elif status == 'unchanged':
1363
 
                    st = _i18n('unchanged')
 
1217
                    st = _('unchanged')
1364
1218
                elif status == 'ignored':
1365
 
                    st = _i18n('ignored')
1366
 
                    if not ignored_files:
1367
 
                        continue
 
1219
                    st = _('ignored')
1368
1220
                else:
1369
 
                    st = _i18n('unknown')
 
1221
                    st = _('unknown')
1370
1222
                
1371
 
                try:
1372
 
                    statinfo = os.stat(self.path + os.sep + item)
1373
 
                except OSError, e:
1374
 
                    if e.errno == 40:
1375
 
                        continue
1376
 
                    else:
1377
 
                        raise
 
1223
                statinfo = os.stat(self.path + os.sep + item)
1378
1224
                liststore.append([gtk.STOCK_FILE,
1379
1225
                                  False,
1380
1226
                                  item,
1381
1227
                                  st,
1382
1228
                                  status,
1383
 
                                  str(statinfo.st_size),
 
1229
                                  statinfo.st_size,
1384
1230
                                  self._format_size(statinfo.st_size),
1385
1231
                                  statinfo.st_mtime,
1386
1232
                                  self._format_date(statinfo.st_mtime),
1437
1283
                                       item.name,
1438
1284
                                       '',
1439
1285
                                       '',
1440
 
                                       "<DIR>",
1441
 
                                       "<DIR>",
 
1286
                                       0,
 
1287
                                       self._format_size(0),
1442
1288
                                       rev.timestamp,
1443
1289
                                       self._format_date(rev.timestamp),
1444
1290
                                       ''
1454
1300
                                       item.name,
1455
1301
                                       '',
1456
1302
                                       '',
1457
 
                                       str(item.text_size),
 
1303
                                       item.text_size,
1458
1304
                                       self._format_size(item.text_size),
1459
1305
                                       rev.timestamp,
1460
1306
                                       self._format_date(rev.timestamp),
1556
1402
    
1557
1403
    def _format_size(self, size):
1558
1404
        """ Format size to a human readable format. """
1559
 
        if size < 1000:
1560
 
            return "%d[B]" % (size,)
1561
 
        size = size / 1000.0
1562
 
        
1563
 
        for metric in ["kB","MB","GB","TB"]:
1564
 
            if size < 1000:
1565
 
                break
1566
 
            size = size / 1000.0
1567
 
        return "%.1f[%s]" % (size,metric) 
 
1405
        return size
1568
1406
    
1569
1407
    def _format_date(self, timestamp):
1570
1408
        """ Format the time (given in secs) to a human readable format. """
1606
1444
        # Some default options
1607
1445
        self.defaults = { 'strict_commit' : False,
1608
1446
                          'dotted_files'  : False,
1609
 
                          'ignored_files' : True,
1610
1447
                          'window_width'  : 700,
1611
1448
                          'window_height' : 400,
1612
1449
                          'window_x'      : 40,