140
141
:param overwrite: overwrite target location if it diverged
141
142
:return: number of revisions pushed
143
transport = get_transport(location)
144
location_url = transport.base
145
to_transport = get_transport(location)
147
dir_to = BzrDir.open(location_url)
148
br_to = dir_to.open_branch()
147
dir_to = ControlDir.open_from_transport(to_transport)
149
148
except errors.NotBranchError:
151
transport = transport.clone('..')
153
relurl = transport.relpath(location_url)
154
transport.mkdir(relurl)
153
br_to = br_from.create_clone_on_transport(
154
to_transport, revision_id=revision_id)
155
155
except errors.NoSuchFile:
156
156
response = question_dialog(
157
157
_i18n('Non existing parent directory'),
158
158
_i18n("The parent directory (%s)\ndoesn't exist. Create?") %
160
160
if response == Gtk.ResponseType.OK:
161
transport.create_prefix()
161
br_to = br_from.create_clone_on_transport(
162
to_transport, revision_id=revision_id, create_prefix=True)
164
dir_to = br_from.bzrdir.clone(location_url,
165
revision_id=br_from.last_revision())
166
br_to = dir_to.open_branch()
167
count = len(br_to.revision_history())
164
return _i18n("Push aborted.")
165
push_result = create_push_result(br_from, br_to)
169
br_to.revision_history()
171
tree_to = dir_to.open_workingtree()
172
except errors.NotLocalUrl:
173
# FIXME - what to do here? how should we warn the user?
174
count = br_to.pull(br_from, overwrite)
175
except errors.NoWorkingTree:
176
count = br_to.pull(br_from, overwrite)
178
count = tree_to.pull(br_from, overwrite)
180
# The count var is either an int or a PushResult. PushResult is being
181
# coerced into an int, but the method is deprecated.
182
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