27
from errors import show_bzr_error
28
29
from bzrlib.branch import Branch
29
import bzrlib.bzrdir as bzrdir
30
import bzrlib.errors as errors
30
from bzrlib.config import GlobalConfig
33
from olive import gladefile
34
32
from dialog import error_dialog
37
""" Display checkout dialog and perform the needed operations. """
38
def __init__(self, path=None):
34
from history import UrlHistory
36
class CheckoutDialog(gtk.Dialog):
37
""" New implementation of the Checkout dialog. """
38
def __init__(self, path=None, parent=None):
39
39
""" Initialize the Checkout dialog. """
40
self.glade = gtk.glade.XML(gladefile, 'window_checkout', 'olive-gtk')
42
self.window = self.glade.get_widget('window_checkout')
44
# Dictionary for signal_autoconnect
45
dic = { "on_button_checkout_checkout_clicked": self.checkout,
46
"on_button_checkout_cancel_clicked": self.close }
48
# Connect the signals to the handlers
49
self.glade.signal_autoconnect(dic)
51
# Save FileChooser state
52
self.filechooser = self.glade.get_widget('filechooserbutton_checkout')
54
self.filechooser.set_filename(path)
57
""" Display the Checkout dialog. """
58
self.window.show_all()
60
def checkout(self, widget):
61
entry_location = self.glade.get_widget('entry_checkout_location')
62
location = entry_location.get_text()
40
gtk.Dialog.__init__(self, title="Checkout - Olive",
43
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
49
self._button_checkout = gtk.Button(_("Check_out"), use_underline=True)
50
self._button_revision = gtk.Button('')
51
self._image_browse = gtk.Image()
52
self._filechooser = gtk.FileChooserButton(_("Please select a folder"))
53
self._combo = gtk.ComboBoxEntry()
54
self._label_location = gtk.Label(_("Branch location:"))
55
self._label_destination = gtk.Label(_("Destination:"))
56
self._label_nick = gtk.Label(_("Branck nick:"))
57
self._label_revision = gtk.Label(_("Revision:"))
58
self._hbox_revision = gtk.HBox()
59
self._entry_revision = gtk.Entry()
60
self._entry_nick = gtk.Entry()
61
self._check_lightweight = gtk.CheckButton(_("_Lightweight checkout"),
65
self._button_checkout.connect('clicked', self._on_checkout_clicked)
66
self._button_revision.connect('clicked', self._on_revision_clicked)
67
self._combo.connect('changed', self._on_combo_changed)
69
# Create the table and pack the widgets into it
70
self._table = gtk.Table(rows=3, columns=2)
71
self._table.attach(self._label_location, 0, 1, 0, 1)
72
self._table.attach(self._label_destination, 0, 1, 1, 2)
73
self._table.attach(self._label_nick, 0, 1, 2, 3)
74
self._table.attach(self._label_revision, 0, 1, 3, 4)
75
self._table.attach(self._combo, 1, 2, 0, 1)
76
self._table.attach(self._filechooser, 1, 2, 1, 2)
77
self._table.attach(self._entry_nick, 1, 2, 2, 3)
78
self._table.attach(self._hbox_revision, 1, 2, 3, 4)
79
self._table.attach(self._check_lightweight, 1, 2, 4, 5)
82
self._image_browse.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)
83
self._button_revision.set_image(self._image_browse)
84
self._button_revision.set_sensitive(False)
85
self._filechooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
86
self._label_location.set_alignment(0, 0.5)
87
self._label_destination.set_alignment(0, 0.5)
88
self._label_nick.set_alignment(0, 0.5)
89
self._label_revision.set_alignment(0, 0.5)
90
self._table.set_row_spacings(3)
91
self._table.set_col_spacings(3)
92
self.vbox.set_spacing(3)
93
if self.path is not None:
94
self._filechooser.set_filename(self.path)
97
self._hbox_revision.pack_start(self._entry_revision, True, True)
98
self._hbox_revision.pack_start(self._button_revision, False, False)
99
self.vbox.add(self._table)
100
self.action_area.pack_end(self._button_checkout)
105
# Build checkout history
106
self._history = UrlHistory(GlobalConfig(), 'branch_history')
107
self._build_history()
109
def _build_history(self):
110
""" Build up the checkout history. """
111
self._combo_model = gtk.ListStore(str)
112
for item in self._history.get_entries():
113
self._combo_model.append([ item ])
114
self._combo.set_model(self._combo_model)
115
self._combo.set_text_column(0)
117
def _get_last_revno(self):
118
""" Get the revno of the last revision (if any). """
119
location = self._combo.get_child().get_text()
121
br = Branch.open(location)
127
def _on_revision_clicked(self, button):
128
""" Browse for revision button clicked handler. """
129
from revbrowser import RevisionBrowser
131
location = self._combo.get_child().get_text()
134
br = Branch.open(location)
138
revb = RevisionBrowser(br, self)
139
response = revb.run()
140
if response != gtk.RESPONSE_NONE:
143
if response == gtk.RESPONSE_OK:
144
if revb.selected_revno is not None:
145
self._entry_revision.set_text(revb.selected_revno)
150
def _on_checkout_clicked(self, button):
151
""" Checkout button clicked handler. """
152
location = self._combo.get_child().get_text()
63
153
if location is '':
64
154
error_dialog(_('Missing branch location'),
65
155
_('You must specify a branch location.'))
68
destination = self.filechooser.get_filename()
70
spinbutton_revno = self.glade.get_widget('spinbutton_checkout_revno')
71
revno = spinbutton_revno.get_value_as_int()
73
checkbutton_lightweight = self.glade.get_widget('checkbutton_checkout_lightweight')
74
lightweight = checkbutton_lightweight.get_active()
158
destination = self._filechooser.get_filename()
77
source = Branch.open(location)
78
rev_id = source.get_rev_id(revno)
80
# if the source and destination are the same,
81
# and there is no working tree,
82
# then reconstitute a branch
83
if (bzrlib.osutils.abspath(destination) ==
84
bzrlib.osutils.abspath(location)):
86
source.bzrdir.open_workingtree()
87
except errors.NoWorkingTree:
88
source.bzrdir.create_workingtree()
91
destination = destination + '/' + os.path.basename(location.rstrip("/\\"))
95
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
96
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
100
checkout = bzrdir.BzrDirMetaFormat1().initialize(destination)
101
bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
103
checkout_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience(
104
destination, force_new_tree=False)
105
checkout = checkout_branch.bzrdir
106
checkout_branch.bind(source)
107
if rev_id is not None:
108
rh = checkout_branch.revno_history()
109
checkout_branch.set_revno_history(rh[:rh.index(rev_id) + 1])
111
checkout.create_workingtree(rev_id)
113
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
114
except errors.NotBranchError, errmsg:
115
error_dialog(_('Location is not a branch'),
116
_('The specified location has to be a branch.'))
118
except errors.TargetAlreadyExists, errmsg:
119
error_dialog(_('Target already exists'),
120
_('Target directory (%s)\nalready exists. Please select another target.') % errmsg)
122
except errors.NonExistingParent, errmsg:
123
error_dialog(_('Non existing parent directory'),
124
_("The parent directory (%s)\ndoesn't exist.") % errmsg)
128
self.comm.refresh_right()
130
def close(self, widget=None):
131
self.window.destroy()
160
revno = int(self._entry_revision.get_text())
164
nick = self._entry_nick.get_text()
166
nick = os.path.basename(location.rstrip("/\\"))
168
br_from = Branch.open(location)
170
revision_id = br_from.get_rev_id(revno)
171
lightweight = self._check_lightweight.get_active()
172
to_location = destination + os.sep + nick
174
os.mkdir(to_location)
176
br_from.create_checkout(to_location, revision_id, lightweight)
178
self._history.add_entry(location)
180
self.response(gtk.RESPONSE_OK)
182
def _on_combo_changed(self, widget):
183
""" We try to get the last revision if focus lost. """
184
rev = self._get_last_revno()
186
self._entry_revision.set_text(_('N/A'))
187
self._button_revision.set_sensitive(False)
189
self._entry_revision.set_text(str(rev))
190
self._button_revision.set_sensitive(True)
191
if self._entry_nick.get_text() == '':
192
self._entry_nick.set_text(os.path.basename(self._combo.get_child().get_text().rstrip("/\\")))