38
39
class PushDialog(Gtk.Dialog):
39
40
"""New implementation of the Push dialog."""
41
def __init__(self, repository, revid, branch=None, parent=None):
42
def __init__(self, repository=None, revid=None, branch=None, parent=None):
42
43
"""Initialize the Push dialog. """
43
44
super(PushDialog, self).__init__(
44
45
title="Push", parent=parent, flags=0, border_width=6,
45
46
buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE))
47
if repository is None:
48
repository = branch.repository
46
49
self.branch = branch
49
52
self.repository = repository
54
revid = branch.last_revision()
52
57
# Create the widgets
136
141
:param overwrite: overwrite target location if it diverged
137
142
:return: number of revisions pushed
139
transport = get_transport(location)
140
location_url = transport.base
145
to_transport = get_transport(location)
143
dir_to = BzrDir.open(location_url)
144
br_to = dir_to.open_branch()
147
dir_to = ControlDir.open_from_transport(to_transport)
145
148
except errors.NotBranchError:
147
transport = transport.clone('..')
149
relurl = transport.relpath(location_url)
150
transport.mkdir(relurl)
153
br_to = br_from.create_clone_on_transport(
154
to_transport, revision_id=revision_id)
151
155
except errors.NoSuchFile:
152
156
response = question_dialog(
153
157
_i18n('Non existing parent directory'),
154
158
_i18n("The parent directory (%s)\ndoesn't exist. Create?") %
156
160
if response == Gtk.ResponseType.OK:
157
transport.create_prefix()
161
br_to = br_from.create_clone_on_transport(
162
to_transport, revision_id=revision_id, create_prefix=True)
160
dir_to = br_from.bzrdir.clone(location_url,
161
revision_id=br_from.last_revision())
162
br_to = dir_to.open_branch()
163
count = len(br_to.revision_history())
164
return _i18n("Push aborted.")
165
push_result = create_push_result(br_from, br_to)
165
br_to.revision_history()
167
tree_to = dir_to.open_workingtree()
168
except errors.NotLocalUrl:
169
# FIXME - what to do here? how should we warn the user?
170
count = br_to.pull(br_from, overwrite)
171
except errors.NoWorkingTree:
172
count = br_to.pull(br_from, overwrite)
174
count = tree_to.pull(br_from, overwrite)
176
# The count var is either an int or a PushResult. PushResult is being
177
# coerced into an int, but the method is deprecated.
178
return _i18n("%d revision(s) pushed.") % int(count)
167
push_result = dir_to.push_branch(br_from, revision_id, overwrite)
168
message = create_push_message(br_from, push_result)
172
def create_push_message(br_from, push_result):
173
"""Return a mesage explaining what happened during the push."""
175
rev_count = br_from.revno() - push_result.old_revno
176
messages.append(_i18n("%d revision(s) pushed.") % rev_count)
177
if push_result.stacked_on is not None:
178
messages.append(_i18n("Stacked on %s.") % push_result.stacked_on)
179
if push_result.workingtree_updated is False:
180
messages.append(_i18n(
181
"\nThe working tree was not updated:"
182
"\nSee 'bzr help working-trees' for more information."))
183
return '\n'.join(messages)
186
def create_push_result(br_from, br_to):
187
"""Return a PushResult like one created by ControlDir.push_branch()."""
188
push_result = PushResult()
189
push_result.source_branch = br_from
190
push_result.target_branch = br_to
191
push_result.branch_push_result = None
192
push_result.master_branch = None
193
push_result.old_revno = 0
194
push_result.old_revid = br_to.last_revision()
195
push_result.workingtree_updated = None # Not applicable to this case.
197
push_result.stacked_on = br_to.get_stacked_on_url()
198
except (errors.UnstackableBranchFormat,
199
errors.UnstackableRepositoryFormat,
201
push_result.stacked_on = None