19
from gi.repository import GObject
20
from gi.repository import Gtk
28
22
from bzrlib.branch import Branch
29
import bzrlib.bzrdir as bzrdir
30
import bzrlib.errors as errors
33
from olive import gladefile
34
from dialog import error_dialog
37
""" Display checkout dialog and perform the needed operations. """
38
def __init__(self, path=None):
23
from bzrlib.config import GlobalConfig
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
31
class CheckoutDialog(Gtk.Dialog):
32
""" New implementation of the Checkout dialog. """
34
def __init__(self, path=None, parent=None, remote_path=None):
39
35
""" 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()
36
super(CheckoutDialog, self).__init__(
37
title="Checkout - Olive", parent=parent, flags=0,
38
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
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"),
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)
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)
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)
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)
100
self.get_content_area().show_all()
102
# Build checkout history
103
self._history = UrlHistory(GlobalConfig(), 'branch_history')
104
self._build_history()
106
def _build_history(self):
107
""" Build up the checkout history. """
108
self._combo_model = Gtk.ListStore(str)
110
for item in self._history.get_entries():
111
self._combo_model.append([ item ])
113
self._combo.set_model(self._combo_model)
114
self._combo.set_entry_text_column(0)
116
def _get_last_revno(self):
117
""" Get the revno of the last revision (if any). """
118
location = self._combo.get_child().get_text()
120
br = Branch.open(location)
126
def _on_revision_clicked(self, button):
127
""" Browse for revision button clicked handler. """
128
from revbrowser import RevisionBrowser
130
location = self._combo.get_child().get_text()
133
br = Branch.open(location)
137
revb = RevisionBrowser(br, self)
138
response = revb.run()
139
if response != Gtk.ResponseType.NONE:
142
if response == Gtk.ResponseType.OK:
143
if revb.selected_revno is not None:
144
self._entry_revision.set_text(revb.selected_revno)
149
def _on_checkout_clicked(self, button):
150
""" Checkout button clicked handler. """
151
location = self._combo.get_child().get_text()
63
152
if location is '':
64
error_dialog(_('Missing branch location'),
65
_('You must specify a branch location.'))
153
error_dialog(_i18n('Missing branch location'),
154
_i18n('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()
157
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()
159
revno = int(self._entry_revision.get_text())
163
nick = self._entry_nick.get_text()
165
nick = os.path.basename(location.rstrip("/\\"))
167
br_from = Branch.open(location)
169
revision_id = br_from.get_rev_id(revno)
170
lightweight = self._check_lightweight.get_active()
171
to_location = destination + os.sep + nick
173
os.mkdir(to_location)
175
br_from.create_checkout(to_location, revision_id, lightweight)
177
self._history.add_entry(location)
179
self.response(Gtk.ResponseType.OK)
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()
185
self._entry_revision.set_text(_i18n('N/A'))
186
self._button_revision.set_sensitive(False)
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("/\\")))