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

  • Committer: Jelmer Vernooij
  • Date: 2006-09-30 10:21:43 UTC
  • Revision ID: jelmer@samba.org-20060930102143-c0ef64d6ca860c21
Merge some files from Olive and bzr-gtk.

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
18
 
 
19
 
from gi.repository import GObject
20
 
from gi.repository import Gtk
21
 
 
22
 
from bzrlib.branch import Branch
23
 
from bzrlib.config import GlobalConfig
24
 
 
25
 
from bzrlib.plugins.gtk.dialog import error_dialog
26
 
from bzrlib.plugins.gtk.errors import show_bzr_error
27
 
from bzrlib.plugins.gtk.history import UrlHistory
28
 
from bzrlib.plugins.gtk.i18n import _i18n
29
 
 
30
 
 
31
 
class CheckoutDialog(Gtk.Dialog):
32
 
    """ New implementation of the Checkout dialog. """
33
 
 
34
 
    def __init__(self, path=None, parent=None, remote_path=None):
 
17
import sys
 
18
 
 
19
try:
 
20
    import pygtk
 
21
    pygtk.require("2.0")
 
22
except:
 
23
    pass
 
24
 
 
25
import gtk
 
26
import gtk.glade
 
27
 
 
28
import bzrlib.errors as errors
 
29
 
 
30
from olive import gladefile
 
31
 
 
32
class OliveCheckout:
 
33
    """ Display checkout dialog and perform the needed operations. """
 
34
    def __init__(self, path=None):
35
35
        """ Initialize the Checkout dialog. """
36
 
        super(CheckoutDialog, self).__init__(
37
 
            title="Checkout - Olive", parent=parent, flags=0,
38
 
            buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
39
 
 
40
 
        # Get arguments
41
 
        self.path = path
42
 
 
43
 
        # Create the widgets
44
 
        self._button_checkout = Gtk.Button(_i18n("Check_out"), use_underline=True)
45
 
        self._button_revision = Gtk.Button('')
46
 
        self._image_browse = Gtk.Image()
47
 
        self._filechooser = Gtk.FileChooserButton(_i18n("Please select a folder"))
48
 
        self._combo = Gtk.ComboBox.new_with_entry()
49
 
        self._label_location = Gtk.Label(label=_i18n("Branch location:"))
50
 
        self._label_destination = Gtk.Label(label=_i18n("Destination:"))
51
 
        self._label_nick = Gtk.Label(label=_i18n("Branch nick:"))
52
 
        self._label_revision = Gtk.Label(label=_i18n("Revision:"))
53
 
        self._hbox_revision = Gtk.HBox()
54
 
        self._entry_revision = Gtk.Entry()
55
 
        self._entry_nick = Gtk.Entry()
56
 
        self._check_lightweight = Gtk.CheckButton(_i18n("_Lightweight checkout"),
57
 
                                                  use_underline=True)
58
 
 
59
 
        # Set callbacks
60
 
        self._button_checkout.connect('clicked', self._on_checkout_clicked)
61
 
        self._button_revision.connect('clicked', self._on_revision_clicked)
62
 
        self._combo.get_child().connect('focus-out-event', self._on_combo_changed)
63
 
 
64
 
        # Create the table and pack the widgets into it
65
 
        self._table = Gtk.Table(rows=3, columns=2)
66
 
        self._table.attach(self._label_location, 0, 1, 0, 1)
67
 
        self._table.attach(self._label_destination, 0, 1, 1, 2)
68
 
        self._table.attach(self._label_nick, 0, 1, 2, 3)
69
 
        self._table.attach(self._label_revision, 0, 1, 3, 4)
70
 
        self._table.attach(self._combo, 1, 2, 0, 1)
71
 
        self._table.attach(self._filechooser, 1, 2, 1, 2)
72
 
        self._table.attach(self._entry_nick, 1, 2, 2, 3)
73
 
        self._table.attach(self._hbox_revision, 1, 2, 3, 4)
74
 
        self._table.attach(self._check_lightweight, 1, 2, 4, 5)
75
 
 
76
 
        # Set properties
77
 
        self._image_browse.set_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON)
78
 
        self._button_revision.set_image(self._image_browse)
79
 
        self._button_revision.set_sensitive(False)
80
 
        self._filechooser.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
81
 
        self._label_location.set_alignment(0, 0.5)
82
 
        self._label_destination.set_alignment(0, 0.5)
83
 
        self._label_nick.set_alignment(0, 0.5)
84
 
        self._label_revision.set_alignment(0, 0.5)
85
 
        self._table.set_row_spacings(3)
86
 
        self._table.set_col_spacings(3)
87
 
        self.get_content_area().set_spacing(3)
88
 
        if self.path is not None:
89
 
            self._filechooser.set_filename(self.path)
90
 
        if remote_path is not None:
91
 
            self._combo.get_child().set_text(remote_path)
92
 
 
93
 
        # Pack some widgets
94
 
        self._hbox_revision.pack_start(self._entry_revision, True, True, 0)
95
 
        self._hbox_revision.pack_start(self._button_revision, False, False, 0)
96
 
        self.get_content_area().add(self._table)
97
 
        self.action_area.pack_end(self._button_checkout, False, False, 0)
98
 
 
99
 
        # Show the dialog
100
 
        self.get_content_area().show_all()
101
 
 
102
 
        # Build checkout history
103
 
        self._history = UrlHistory(GlobalConfig(), 'branch_history')
104
 
        self._build_history()
105
 
 
106
 
    def _build_history(self):
107
 
        """ Build up the checkout history. """
108
 
        self._combo_model = Gtk.ListStore(str)
109
 
 
110
 
        for item in self._history.get_entries():
111
 
            self._combo_model.append([ item ])
112
 
 
113
 
        self._combo.set_model(self._combo_model)
114
 
        self._combo.set_entry_text_column(0)
115
 
 
116
 
    def _get_last_revno(self):
117
 
        """ Get the revno of the last revision (if any). """
118
 
        location = self._combo.get_child().get_text()
119
 
        try:
120
 
            br = Branch.open(location)
121
 
        except:
122
 
            return None
123
 
        else:
124
 
            return br.revno()
125
 
 
126
 
    def _on_revision_clicked(self, button):
127
 
        """ Browse for revision button clicked handler. """
128
 
        from revbrowser import RevisionBrowser
129
 
 
130
 
        location = self._combo.get_child().get_text()
131
 
 
132
 
        try:
133
 
            br = Branch.open(location)
134
 
        except:
135
 
            return
136
 
        else:
137
 
            revb = RevisionBrowser(br, self)
138
 
            response = revb.run()
139
 
            if response != Gtk.ResponseType.NONE:
140
 
                revb.hide()
141
 
 
142
 
                if response == Gtk.ResponseType.OK:
143
 
                    if revb.selected_revno is not None:
144
 
                        self._entry_revision.set_text(revb.selected_revno)
145
 
 
146
 
                revb.destroy()
147
 
 
148
 
    @show_bzr_error
149
 
    def _on_checkout_clicked(self, button):
150
 
        """ Checkout button clicked handler. """
151
 
        location = self._combo.get_child().get_text()
 
36
        self.glade = gtk.glade.XML(gladefile, 'window_checkout', 'olive-gtk')
 
37
        
 
38
        self.window = self.glade.get_widget('window_checkout')
 
39
        
 
40
        # Dictionary for signal_autoconnect
 
41
        dic = { "on_button_checkout_checkout_clicked": self.checkout,
 
42
                "on_button_checkout_cancel_clicked": self.close }
 
43
        
 
44
        # Connect the signals to the handlers
 
45
        self.glade.signal_autoconnect(dic)
 
46
        
 
47
        # Save FileChooser state
 
48
        self.filechooser = self.glade.get_widget('filechooserbutton_checkout')
 
49
        if path is not None:
 
50
            self.filechooser.set_filename(path)
 
51
 
 
52
    def display(self):
 
53
        """ Display the Checkout dialog. """
 
54
        self.window.show_all()
 
55
    
 
56
    def checkout(self, widget):
 
57
        entry_location = self.glade.get_widget('entry_checkout_location')
 
58
        location = entry_location.get_text()
152
59
        if location is '':
153
 
            error_dialog(_i18n('Missing branch location'),
154
 
                         _i18n('You must specify a branch location.'))
 
60
            error_dialog(_('Missing branch location'),
 
61
                                     _('You must specify a branch location.'))
155
62
            return
156
 
 
157
 
        destination = self._filechooser.get_filename()
 
63
        
 
64
        destination = self.filechooser.get_filename()
 
65
        
 
66
        spinbutton_revno = self.glade.get_widget('spinbutton_checkout_revno')
 
67
        revno = spinbutton_revno.get_value_as_int()
 
68
        rev_id = source.get_rev_id(revno)
 
69
        
 
70
        checkbutton_lightweight = self.glade.get_widget('checkbutton_checkout_lightweight')
 
71
        lightweight = checkbutton_lightweight.get_active()
 
72
        
158
73
        try:
159
 
            revno = int(self._entry_revision.get_text())
160
 
        except:
161
 
            revno = None
162
 
 
163
 
        nick = self._entry_nick.get_text()
164
 
        if nick is '':
165
 
            nick = os.path.basename(location.rstrip("/\\"))
166
 
 
167
 
        br_from = Branch.open(location)
168
 
 
169
 
        revision_id = br_from.get_rev_id(revno)
170
 
        lightweight = self._check_lightweight.get_active()
171
 
        to_location = destination + os.sep + nick
172
 
 
173
 
        os.mkdir(to_location)
174
 
 
175
 
        br_from.create_checkout(to_location, revision_id, lightweight)
176
 
 
177
 
        self._history.add_entry(location)
178
 
 
179
 
        self.response(Gtk.ResponseType.OK)
180
 
 
181
 
    def _on_combo_changed(self, widget, event):
182
 
        """ We try to get the last revision if focus lost. """
183
 
        rev = self._get_last_revno()
184
 
        if rev is None:
185
 
            self._entry_revision.set_text(_i18n('N/A'))
186
 
            self._button_revision.set_sensitive(False)
187
 
        else:
188
 
            self._entry_revision.set_text(str(rev))
189
 
            self._button_revision.set_sensitive(True)
190
 
            if self._entry_nick.get_text() == '':
191
 
                self._entry_nick.set_text(os.path.basename(self._combo.get_child().get_text().rstrip("/\\")))
 
74
            source = Branch.open(location)
 
75
            
 
76
            # if the source and destination are the same, 
 
77
            # and there is no working tree,
 
78
            # then reconstitute a branch
 
79
            if (bzrlib.osutils.abspath(destination) ==
 
80
                bzrlib.osutils.abspath(location)):
 
81
                try:
 
82
                    source.bzrdir.open_workingtree()
 
83
                except NoWorkingTree:
 
84
                    source.bzrdir.create_workingtree()
 
85
                    return
 
86
 
 
87
            destination = destination + '/' + os.path.basename(location.rstrip("/\\"))
 
88
            
 
89
            os.mkdir(destination)
 
90
 
 
91
            old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
 
92
            bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
 
93
 
 
94
            try:
 
95
                if lightweight:
 
96
                    checkout = bzrdir.BzrDirMetaFormat1().initialize(destination)
 
97
                    bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
 
98
                else:
 
99
                    checkout_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience(
 
100
                        destination, force_new_tree=False)
 
101
                    checkout = checkout_branch.bzrdir
 
102
                    checkout_branch.bind(source)
 
103
                    if rev_id is not None:
 
104
                        rh = checkout_branch.revno_history()
 
105
                        checkout_branch.set_revno_history(rh[:rh.index(rev_id) + 1])
 
106
 
 
107
                checkout.create_workingtree(rev_id)
 
108
            finally:
 
109
                bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
 
110
        except errors.NotBranchError, errmsg:
 
111
            error_dialog(_('Location is not a branch'),
 
112
                                     _('The specified location has to be a branch.'))
 
113
            return
 
114
        except errors.TargetAlreadyExists, errmsg:
 
115
            error_dialog(_('Target already exists'),
 
116
                                     _('Target directory (%s)\nalready exists. Please select another target.') % errmsg)
 
117
            return
 
118
        except errors.NonExistingParent, errmsg:
 
119
            error_dialog(_('Non existing parent directory'),
 
120
                                     _("The parent directory (%s)\ndoesn't exist.") % errmsg)
 
121
            return
 
122
        
 
123
        self.close()
 
124
        self.comm.refresh_right()
 
125
 
 
126
    def close(self, widget=None):
 
127
        self.window.destroy()