136
137
:param overwrite: overwrite target location if it diverged
137
138
:return: number of revisions pushed
139
transport = get_transport(location)
140
location_url = transport.base
141
to_transport = get_transport(location)
143
dir_to = BzrDir.open(location_url)
144
br_to = dir_to.open_branch()
143
dir_to = ControlDir.open_from_transport(to_transport)
145
144
except errors.NotBranchError:
147
transport = transport.clone('..')
149
relurl = transport.relpath(location_url)
150
transport.mkdir(relurl)
149
br_to = br_from.create_clone_on_transport(
150
to_transport, revision_id=revision_id)
151
151
except errors.NoSuchFile:
152
152
response = question_dialog(
153
153
_i18n('Non existing parent directory'),
154
154
_i18n("The parent directory (%s)\ndoesn't exist. Create?") %
156
156
if response == Gtk.ResponseType.OK:
157
transport.create_prefix()
157
br_to = br_from.create_clone_on_transport(
158
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())
160
return _i18n("Push aborted.")
161
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)
163
push_result = dir_to.push_branch(br_from, revision_id, overwrite)
164
message = create_push_message(br_from, push_result)
168
def create_push_message(br_from, push_result):
169
"""Return a mesage explaining what happened during the push."""
171
rev_count = br_from.revno() - push_result.old_revno
172
messages.append(_i18n("%d revision(s) pushed.") % rev_count)
173
if push_result.stacked_on is not None:
174
messages.append(_i18n("Stacked on %s.") % push_result.stacked_on)
175
if push_result.workingtree_updated is False:
176
messages.append(_i18n(
177
"\nThe working tree was not updated:"
178
"\nSee 'bzr help working-trees' for more information."))
179
return '\n'.join(messages)
182
def create_push_result(br_from, br_to):
183
"""Return a PushResult like one created by ControlDir.push_branch()."""
184
push_result = PushResult()
185
push_result.source_branch = br_from
186
push_result.target_branch = br_to
187
push_result.branch_push_result = None
188
push_result.master_branch = None
189
push_result.old_revno = 0
190
push_result.old_revid = br_to.last_revision()
191
push_result.workingtree_updated = None # Not applicable to this case.
193
push_result.stacked_on = br_to.get_stacked_on_url()
194
except (errors.UnstackableBranchFormat,
195
errors.UnstackableRepositoryFormat,
197
push_result.stacked_on = None