39
38
class PushDialog(Gtk.Dialog):
40
39
"""New implementation of the Push dialog."""
42
def __init__(self, repository=None, revid=None, branch=None, parent=None):
41
def __init__(self, repository, revid, branch=None, parent=None):
43
42
"""Initialize the Push dialog. """
44
43
super(PushDialog, self).__init__(
45
title="Push", parent=parent, flags=0, border_width=6,
44
title="Push", parent=parent, flags=0,
46
45
buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE))
47
if repository is None:
48
repository = branch.repository
49
46
self.branch = branch
52
49
self.repository = repository
54
revid = branch.last_revision()
57
52
# Create the widgets
58
53
self._label_location = Gtk.Label(label=_i18n("Location:"))
59
54
self._combo = Gtk.ComboBox.new_with_entry()
60
55
self._button_push = Gtk.Button(_i18n("_Push"), use_underline=True)
61
self._hbox_location = Gtk.Box(Gtk.Orientation.HORIZONTAL, 6)
62
self._push_message = Gtk.Label(xalign=0)
63
self._progress_widget = ProgressPanel()
56
self._hbox_location = Gtk.Box(Gtk.Orientation.HORIZONTAL, 3)
66
ui.ui_factory.set_progress_bar_widget(self._progress_widget)
67
59
self.connect('close', self._on_close_clicked)
68
60
self._button_push.connect('clicked', self._on_push_clicked)
71
content_area = self.get_content_area()
72
content_area.set_spacing(6)
63
self._label_location.set_alignment(0, 0.5)
64
self.get_content_area().set_spacing(3)
75
self._hbox_location.pack_start(self._label_location, False, False, 0)
67
self._hbox_location.pack_start(
68
self._label_location, False, False, 0)
76
69
self._hbox_location.pack_start(self._combo, False, False, 0)
77
content_area.pack_start(self._hbox_location, True, True, 0)
78
content_area.pack_start(self._progress_widget, True, True, 0)
79
content_area.pack_start(self._push_message, True, True, 0)
70
self.get_content_area().pack_start(
71
self._hbox_location, False, False, 0)
80
72
self.get_action_area().pack_end(self._button_push, True, True, 0)
75
self._progress_widget = ProgressPanel()
76
ui.ui_factory.set_progress_bar_widget(self._progress_widget)
77
self.get_content_area().pack_start(
78
self._progress_widget, False, False, 0)
79
self._push_message = Gtk.Label()
80
alignment = Gtk.Alignment.new(0.0, 0.5, 0.0, 0.0)
81
alignment.add(self._push_message)
82
self.get_content_area().pack_start(alignment, False, False, 0)
83
content_area.show_all()
85
self.get_content_area().show_all()
84
86
self._progress_widget.hide()
85
87
self._push_message.hide()
141
143
:param overwrite: overwrite target location if it diverged
142
144
:return: number of revisions pushed
145
to_transport = get_transport(location)
146
transport = get_transport(location)
147
location_url = transport.base
147
dir_to = ControlDir.open_from_transport(to_transport)
150
dir_to = BzrDir.open(location_url)
151
br_to = dir_to.open_branch()
148
152
except errors.NotBranchError:
154
transport = transport.clone('..')
153
br_to = br_from.create_clone_on_transport(
154
to_transport, revision_id=revision_id)
156
relurl = transport.relpath(location_url)
157
transport.mkdir(relurl)
155
158
except errors.NoSuchFile:
156
159
response = question_dialog(
157
160
_i18n('Non existing parent directory'),
158
161
_i18n("The parent directory (%s)\ndoesn't exist. Create?") %
160
163
if response == Gtk.ResponseType.OK:
161
br_to = br_from.create_clone_on_transport(
162
to_transport, revision_id=revision_id, create_prefix=True)
164
transport.create_prefix()
164
return _i18n("Push aborted.")
165
push_result = create_push_result(br_from, br_to)
167
dir_to = br_from.bzrdir.clone(location_url,
168
revision_id=br_from.last_revision())
169
br_to = dir_to.open_branch()
170
count = len(br_to.revision_history())
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
172
br_to.revision_history()
174
tree_to = dir_to.open_workingtree()
175
except errors.NotLocalUrl:
176
# FIXME - what to do here? how should we warn the user?
177
count = br_to.pull(br_from, overwrite)
178
except errors.NoWorkingTree:
179
count = br_to.pull(br_from, overwrite)
181
count = tree_to.pull(br_from, overwrite)
183
return "Pushed %s revisions." % count