1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
2
# Copyright (C) 2007 by Jelmer Vernooij <jelmer@samba.org>
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
from errors import show_bzr_error
28
import bzrlib.errors as errors
30
from bzrlib.plugins.gtk import _i18n
31
from bzrlib.plugins.gtk.dialog import (
36
from bzrlib.plugins.gtk.history import UrlHistory
38
class PushDialog(gtk.Dialog):
39
""" New implementation of the Push dialog. """
41
def __init__(self, repository, revid, branch=None, parent=None):
42
""" Initialize the Push dialog. """
43
gtk.Dialog.__init__(self, title="Push - Olive",
46
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
49
self.repository = repository
54
self._label_location = gtk.Label(_i18n("Location:"))
55
self._combo = gtk.ComboBoxEntry()
56
self._button_push = gtk.Button(_i18n("_Push"), use_underline=True)
57
self._hbox_location = gtk.HBox()
60
self._button_push.connect('clicked', self._on_push_clicked)
63
self._label_location.set_alignment(0, 0.5)
64
self._hbox_location.set_spacing(3)
65
self.vbox.set_spacing(3)
68
self._hbox_location.pack_start(self._label_location, False, False)
69
self._hbox_location.pack_start(self._combo, True, True)
70
self.vbox.pack_start(self._hbox_location)
71
self.action_area.pack_end(self._button_push)
76
# Build location history
77
self._history = UrlHistory(self.branch.get_config(), 'push_history')
80
def _build_history(self):
81
""" Build up the location history. """
82
self._combo_model = gtk.ListStore(str)
83
for item in self._history.get_entries():
84
self._combo_model.append([ item ])
85
self._combo.set_model(self._combo_model)
86
self._combo.set_text_column(0)
88
if self.branch is not None:
89
location = self.branch.get_push_location()
90
if location is not None:
91
self._combo.get_child().set_text(location)
94
def _on_push_clicked(self, widget):
95
""" Push button clicked handler. """
96
location = self._combo.get_child().get_text()
100
revs = do_push(self.branch, location=location, overwrite=False)
101
except errors.DivergedBranches:
102
response = question_dialog(_i18n('Branches have been diverged'),
103
_i18n('You cannot push if branches have diverged.\nOverwrite?'))
104
if response == gtk.RESPONSE_YES:
105
revs = do_push(self.branch, location=location, overwrite=True)
107
if self.branch is not None and self.branch.get_push_location() is None:
108
self.branch.set_push_location(location)
110
self._history.add_entry(location)
111
info_dialog(_i18n('Push successful'),
112
_i18n("%d revision(s) pushed.") % revs)
114
self.response(gtk.RESPONSE_OK)
117
def do_push(br_from, location, overwrite):
118
""" Update a mirror of a branch.
120
:param br_from: the source branch
121
:param location: the location of the branch that you'd like to update
122
:param overwrite: overwrite target location if it diverged
123
:return: number of revisions pushed
125
from bzrlib.bzrdir import BzrDir
126
from bzrlib.transport import get_transport
128
transport = get_transport(location)
129
location_url = transport.base
134
dir_to = BzrDir.open(location_url)
135
br_to = dir_to.open_branch()
136
except errors.NotBranchError:
138
transport = transport.clone('..')
140
relurl = transport.relpath(location_url)
141
transport.mkdir(relurl)
142
except errors.NoSuchFile:
143
response = question_dialog(_i18n('Non existing parent directory'),
144
_i18n("The parent directory (%s)\ndoesn't exist. Create?") % location)
145
if response == gtk.RESPONSE_OK:
146
transport.create_prefix()
149
dir_to = br_from.bzrdir.clone(location_url,
150
revision_id=br_from.last_revision())
151
br_to = dir_to.open_branch()
152
count = len(br_to.revision_history())
154
old_rh = br_to.revision_history()
156
tree_to = dir_to.open_workingtree()
157
except errors.NotLocalUrl:
158
# FIXME - what to do here? how should we warn the user?
159
count = br_to.pull(br_from, overwrite)
160
except errors.NoWorkingTree:
161
count = br_to.pull(br_from, overwrite)
163
count = tree_to.pull(br_from, overwrite)