14
15
# along with this program; if not, write to the Free Software
15
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
20
pygtk.require("2.0")
31
import olive.backend.commit as commit
32
import olive.backend.errors as errors
33
import olive.backend.info as info
36
""" Display Push dialog and perform the needed actions. """
37
def __init__(self, gladefile, comm, dialog):
26
from errors import show_bzr_error
28
from bzrlib.config import LocationConfig
29
import bzrlib.errors as errors
31
from bzrlib.plugins.gtk import _i18n
32
from dialog import error_dialog, info_dialog, question_dialog
34
from history import UrlHistory
36
class PushDialog(gtk.Dialog):
37
""" New implementation of the Push dialog. """
38
def __init__(self, repository, revid, branch=None, parent=None):
38
39
""" Initialize the Push dialog. """
39
self.gladefile = gladefile
40
self.glade = gtk.glade.XML(self.gladefile, 'window_push')
42
# Communication object
47
self.window = self.glade.get_widget('window_push')
49
# Dictionary for signal_autoconnect
50
dic = { "on_button_push_push_clicked": self.push,
51
"on_button_push_cancel_clicked": self.close,
52
"on_radiobutton_push_stored_toggled": self.stored_toggled,
53
"on_radiobutton_push_specific_toggled": self.specific_toggled, }
55
# Connect the signals to the handlers
56
self.glade.signal_autoconnect(dic)
58
# Get some useful widgets
59
self.entry_stored = self.glade.get_widget('entry_push_stored')
60
self.entry_location = self.glade.get_widget('entry_push_location')
61
self.check_remember = self.glade.get_widget('checkbutton_push_remember')
62
self.check_overwrite = self.glade.get_widget('checkbutton_push_overwrite')
63
self.check_create = self.glade.get_widget('checkbutton_push_create')
66
self.notbranch = False
68
loc = info.get_push_location(self.comm.get_path())
69
except errors.NotBranchError:
74
self.entry_stored.set_text(loc)
77
""" Display the Push dialog. """
79
self.dialog.error_dialog(_('Directory is not a branch'),
80
_('You can perform this action only in a branch.'))
84
self.width, self.height = self.window.get_size()
86
def stored_toggled(self, widget):
87
if widget.get_active():
88
self.entry_stored.show()
89
self.entry_location.hide()
90
self.check_remember.hide()
91
self.check_create.hide()
92
self.window.resize(self.width, self.height)
94
self.entry_stored.hide()
95
self.entry_location.show()
96
self.check_remember.show()
97
self.check_create.show()
99
def specific_toggled(self, widget):
100
if widget.get_active():
101
self.entry_stored.hide()
102
self.entry_location.show()
103
self.check_remember.show()
104
self.check_create.show()
106
self.entry_stored.show()
107
self.entry_location.hide()
108
self.check_remember.hide()
109
self.check_create.hide()
111
def push(self, widget):
112
radio_stored = self.glade.get_widget('radiobutton_push_stored')
113
radio_specific = self.glade.get_widget('radiobutton_push_specific')
40
gtk.Dialog.__init__(self, title="Push - Olive",
43
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
46
self.repository = repository
51
self._label_location = gtk.Label(_i18n("Location:"))
52
self._combo = gtk.ComboBoxEntry()
53
self._button_push = gtk.Button(_i18n("_Push"), use_underline=True)
54
self._hbox_location = gtk.HBox()
57
self._button_push.connect('clicked', self._on_push_clicked)
60
self._label_location.set_alignment(0, 0.5)
61
self._hbox_location.set_spacing(3)
62
self.vbox.set_spacing(3)
65
self._hbox_location.pack_start(self._label_location, False, False)
66
self._hbox_location.pack_start(self._combo, True, True)
67
self.vbox.pack_start(self._hbox_location)
68
self.action_area.pack_end(self._button_push)
73
# Build location history
74
self._history = UrlHistory(self.branch.get_config(), 'push_history')
77
def _build_history(self):
78
""" Build up the location history. """
79
self._combo_model = gtk.ListStore(str)
80
for item in self._history.get_entries():
81
self._combo_model.append([ item ])
82
self._combo.set_model(self._combo_model)
83
self._combo.set_text_column(0)
85
if self.branch is not None:
86
location = self.branch.get_push_location()
87
if location is not None:
88
self._combo.get_child().set_text(location)
91
def _on_push_clicked(self, widget):
92
""" Push button clicked handler. """
93
location = self._combo.get_child().get_text()
116
self.comm.set_busy(self.window)
117
if radio_stored.get_active():
119
revs = commit.push(self.comm.get_path(),
120
overwrite=self.check_overwrite.get_active())
121
except errors.NotBranchError:
122
self.dialog.error_dialog(_('Directory is not a branch'),
123
_('You can perform this action only in a branch.'))
125
except errors.NoLocationKnown:
126
self.dialog.error_dialog(_('Push location is unknown'),
127
_('Please specify a location manually.'))
129
except errors.NonExistingParent, errmsg:
130
self.dialog.error_dialog(_('Non existing parent directory'),
131
_("The parent directory (%s)\ndoesn't exist.") % errmsg)
133
except errors.DivergedBranchesError:
134
self.dialog.error_dialog(_('Branches have been diverged'),
135
_('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
139
elif radio_specific.get_active():
140
location = self.entry_location.get_text()
142
self.dialog.error_dialog(_('No location specified'),
143
_('Please specify a location or use the default.'))
147
revs = commit.push(self.comm.get_path(), location,
148
self.check_remember.get_active(),
149
self.check_overwrite.get_active(),
150
self.check_create.get_active())
151
except errors.NotBranchError:
152
self.dialog.error_dialog(_('Directory is not a branch'),
153
_('You can perform this action only in a branch.'))
154
self.comm.set_busy(self.window, False)
156
except errors.NonExistingParent, errmsg:
157
self.dialog.error_dialog(_('Non existing parent directory'),
158
_("The parent directory (%s)\ndoesn't exist.") % errmsg)
159
self.comm.set_busy(self.window, False)
161
except errors.DivergedBranchesError:
162
self.dialog.error_dialog(_('Branches have been diverged'),
163
_('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
164
self.comm.set_busy(self.window, False)
166
except errors.PathPrefixNotCreated:
167
self.dialog.error_dialog(_('Path prefix not created'),
168
_("The path leading up to the specified location couldn't\nbe created."))
169
self.comm.set_busy(self.window, False)
97
revs = do_push(self.branch, location=location, overwrite=False)
98
except errors.DivergedBranches:
99
response = question_dialog(_i18n('Branches have been diverged'),
100
_i18n('You cannot push if branches have diverged.\nOverwrite?'))
101
if response == gtk.RESPONSE_YES:
102
revs = do_push(self.branch, location=location, overwrite=True)
104
if self.branch is not None and self.branch.get_push_location() is None:
105
self.branch.set_push_location(location)
107
self._history.add_entry(location)
108
info_dialog(_i18n('Push successful'),
109
_i18n("%d revision(s) pushed.") % revs)
111
self.response(gtk.RESPONSE_OK)
113
def do_push(br_from, location, overwrite):
114
""" Update a mirror of a branch.
116
:param br_from: the source branch
118
:param location: the location of the branch that you'd like to update
120
:param overwrite: overwrite target location if it diverged
122
:return: number of revisions pushed
124
from bzrlib.bzrdir import BzrDir
125
from bzrlib.transport import get_transport
127
transport = get_transport(location)
128
location_url = transport.base
133
dir_to = BzrDir.open(location_url)
134
br_to = dir_to.open_branch()
135
except errors.NotBranchError:
137
transport = transport.clone('..')
139
relurl = transport.relpath(location_url)
140
transport.mkdir(relurl)
141
except errors.NoSuchFile:
142
response = question_dialog(_i18n('Non existing parent directory'),
143
_i18n("The parent directory (%s)\ndoesn't exist. Create?") % location)
144
if response == gtk.RESPONSE_OK:
145
transport.create_prefix()
148
dir_to = br_from.bzrdir.clone(location_url,
149
revision_id=br_from.last_revision())
150
br_to = dir_to.open_branch()
151
count = len(br_to.revision_history())
153
old_rh = br_to.revision_history()
155
tree_to = dir_to.open_workingtree()
156
except errors.NotLocalUrl:
157
# FIXME - what to do here? how should we warn the user?
158
count = br_to.pull(br_from, overwrite)
159
except errors.NoWorkingTree:
160
count = br_to.pull(br_from, overwrite)
174
# This should really never happen
178
self.dialog.info_dialog(_('Push successful'),
179
_('%d revision(s) pushed.') % revs)
181
def close(self, widget=None):
182
self.window.destroy()
162
count = tree_to.pull(br_from, overwrite)