21
21
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
29
import bzrlib.errors as errors
31
from olive import gladefile
36
34
""" Display Push dialog and perform the needed actions. """
37
def __init__(self, gladefile, comm, dialog):
35
def __init__(self, branch):
38
36
""" Initialize the Push dialog. """
39
self.gladefile = gladefile
40
self.glade = gtk.glade.XML(self.gladefile, 'window_push')
42
# Communication object
37
self.glade = gtk.glade.XML(gladefile, 'window_push')
47
39
self.window = self.glade.get_widget('window_push')
49
43
# Dictionary for signal_autoconnect
50
44
dic = { "on_button_push_push_clicked": self.push,
71
65
self.entry_location.set_sensitive(0)
72
66
self.check_remember.set_sensitive(0)
73
67
self.check_create.set_sensitive(0)
76
self.notbranch = False
78
loc = info.get_push_location(self.comm.get_path())
79
except errors.NotBranchError:
84
self.entry_stored.set_text(loc)
69
self.entry_stored.set_text(branch.get_push_location())
87
72
""" Display the Push dialog. """
89
self.dialog.error_dialog(_('Directory is not a branch'),
90
_('You can perform this action only in a branch.'))
94
self.width, self.height = self.window.get_size()
74
self.width, self.height = self.window.get_size()
96
76
def stored_toggled(self, widget):
97
77
if widget.get_active():
120
100
def push(self, widget):
122
self.comm.set_busy(self.window)
123
102
if self.radio_stored.get_active():
125
revs = commit.push(self.comm.get_path(),
126
overwrite=self.check_overwrite.get_active())
104
revs = do_push(self.branch,
105
overwrite=self.check_overwrite.get_active())
127
106
except errors.NotBranchError:
128
self.dialog.error_dialog(_('Directory is not a branch'),
107
error_dialog(_('Directory is not a branch'),
129
108
_('You can perform this action only in a branch.'))
131
except errors.NoLocationKnown:
132
self.dialog.error_dialog(_('Push location is unknown'),
133
_('Please specify a location manually.'))
135
except errors.NonExistingParent, errmsg:
136
self.dialog.error_dialog(_('Non existing parent directory'),
137
_("The parent directory (%s)\ndoesn't exist.") % errmsg)
139
except errors.DivergedBranchesError:
140
self.dialog.error_dialog(_('Branches have been diverged'),
110
except errors.DivergedBranches:
111
error_dialog(_('Branches have been diverged'),
141
112
_('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
145
114
elif self.radio_specific.get_active():
146
115
location = self.entry_location.get_text()
147
116
if location == '':
148
self.dialog.error_dialog(_('No location specified'),
117
error_dialog(_('No location specified'),
149
118
_('Please specify a location or use the default.'))
153
revs = commit.push(self.comm.get_path(), location,
154
self.check_remember.get_active(),
155
self.check_overwrite.get_active(),
156
self.check_create.get_active())
122
revs = do_push(self.branch, location,
123
self.check_remember.get_active(),
124
self.check_overwrite.get_active(),
125
self.check_create.get_active())
157
126
except errors.NotBranchError:
158
self.dialog.error_dialog(_('Directory is not a branch'),
127
error_dialog(_('Directory is not a branch'),
159
128
_('You can perform this action only in a branch.'))
160
self.comm.set_busy(self.window, False)
162
except errors.NonExistingParent, errmsg:
163
self.dialog.error_dialog(_('Non existing parent directory'),
164
_("The parent directory (%s)\ndoesn't exist.") % errmsg)
165
self.comm.set_busy(self.window, False)
167
except errors.DivergedBranchesError:
168
self.dialog.error_dialog(_('Branches have been diverged'),
130
except errors.DivergedBranches:
131
error_dialog(_('Branches have been diverged'),
169
132
_('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
170
self.comm.set_busy(self.window, False)
172
except errors.PathPrefixNotCreated:
173
self.dialog.error_dialog(_('Path prefix not created'),
174
_("The path leading up to the specified location couldn't\nbe created."))
175
self.comm.set_busy(self.window, False)
180
# This should really never happen
184
self.dialog.info_dialog(_('Push successful'),
136
info_dialog(_('Push successful'),
185
137
_('%d revision(s) pushed.') % revs)
187
139
def test(self, widget):
213
165
def close(self, widget=None):
214
166
self.window.destroy()
168
def do_push(branch, location=None, remember=False, overwrite=False,
169
create_prefix=False):
170
""" Update a mirror of a branch.
172
:param branch: the source branch
174
:param location: the location of the branch that you'd like to update
176
:param remember: if set, the location will be stored
178
:param overwrite: overwrite target location if it diverged
180
:param create_prefix: create the path leading up to the branch if it doesn't exist
182
:return: number of revisions pushed
184
from bzrlib.branch import Branch
185
from bzrlib.bzrdir import BzrDir
186
from bzrlib.transport import get_transport
188
br_from = Branch.open_containing(branch)[0]
190
stored_loc = br_from.get_push_location()
192
if stored_loc is None:
193
error_dialog(_('Push location is unknown'),
194
_('Please specify a location manually.'))
197
location = stored_loc
199
transport = get_transport(location)
200
location_url = transport.base
202
if br_from.get_push_location() is None or remember:
203
br_from.set_push_location(location_url)
208
dir_to = BzrDir.open(location_url)
209
br_to = dir_to.open_branch()
210
except errors.NotBranchError:
212
transport = transport.clone('..')
213
if not create_prefix:
215
relurl = transport.relpath(location_url)
216
transport.mkdir(relurl)
217
except errors.NoSuchFile:
218
error_dialog(_('Non existing parent directory'),
219
_("The parent directory (%s)\ndoesn't exist.") % location)
222
current = transport.base
223
needed = [(transport, transport.relpath(location_url))]
226
transport, relpath = needed[-1]
227
transport.mkdir(relpath)
229
except errors.NoSuchFile:
230
new_transport = transport.clone('..')
231
needed.append((new_transport,
232
new_transport.relpath(transport.base)))
233
if new_transport.base == transport.base:
234
error_dialog(_('Path prefix not created'),
235
_("The path leading up to the specified location couldn't\nbe created."))
237
dir_to = br_from.bzrdir.clone(location_url,
238
revision_id=br_from.last_revision())
239
br_to = dir_to.open_branch()
240
count = len(br_to.revision_history())
242
old_rh = br_to.revision_history()
244
tree_to = dir_to.open_workingtree()
245
except errors.NotLocalUrl:
246
# FIXME - what to do here? how should we warn the user?
247
#warning('This transport does not update the working '
248
# 'tree of: %s' % (br_to.base,))
249
count = br_to.pull(br_from, overwrite)
250
except errors.NoWorkingTree:
251
count = br_to.pull(br_from, overwrite)
253
count = tree_to.pull(br_from, overwrite)