/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
2
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
7
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
12
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
try:
18
    import pygtk
19
    pygtk.require("2.0")
20
except:
21
    pass
0.13.13 by Jelmer Vernooij
Update TODO
22
    
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
23
import gtk
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
24
25
from errors import show_bzr_error
26
27
from bzrlib.config import LocationConfig
0.11.1 by Jelmer Vernooij
Eliminate olive.backend.errors.
28
import bzrlib.errors as errors
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
29
153 by Jelmer Vernooij
Fix references to dialog.
30
from dialog import error_dialog, info_dialog, question_dialog
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
31
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
32
from history import UrlHistory
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
33
34
class PushDialog(gtk.Dialog):
35
    """ New implementation of the Push dialog. """
36
    def __init__(self, branch, parent=None):
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
37
        """ Initialize the Push dialog. """
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
38
        gtk.Dialog.__init__(self, title="Push - Olive",
39
                                  parent=parent,
40
                                  flags=0,
41
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
42
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
43
        # Get arguments
0.13.13 by Jelmer Vernooij
Update TODO
44
        self.branch = branch
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
45
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
46
        # Create the widgets
47
        self._label_location = gtk.Label(_("Location:"))
48
        self._label_test = gtk.Label(_("(click the Test button to check write access)"))
49
        self._check_remember = gtk.CheckButton(_("_Remember as default location"),
50
                                               use_underline=True)
51
        self._check_prefix = gtk.CheckButton(_("Create the path _leading up to the location"),
52
                                             use_underline=True)
53
        self._check_overwrite = gtk.CheckButton(_("_Overwrite target if diverged"),
54
                                                use_underline=True)
55
        self._combo = gtk.ComboBoxEntry()
56
        self._button_test = gtk.Button(_("_Test"), use_underline=True)
57
        self._button_push = gtk.Button(_("_Push"), use_underline=True)
58
        self._hbox_location = gtk.HBox()
59
        self._hbox_test = gtk.HBox()
60
        self._image_test = gtk.Image()
61
        
62
        # Set callbacks
63
        self._button_test.connect('clicked', self._on_test_clicked)
64
        self._button_push.connect('clicked', self._on_push_clicked)
65
        
66
        # Set properties
67
        self._image_test.set_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_BUTTON)
68
        self._label_location.set_alignment(0, 0.5)
69
        self._label_test.set_alignment(0, 0.5)
70
        self._hbox_location.set_spacing(3)
71
        self._hbox_test.set_spacing(3)
72
        self.vbox.set_spacing(3)
73
        
74
        # Pack widgets
75
        self._hbox_location.pack_start(self._label_location, False, False)
76
        self._hbox_location.pack_start(self._combo, True, True)
77
        self._hbox_test.pack_start(self._image_test, False, False)
78
        self._hbox_test.pack_start(self._label_test, True, True)
79
        self.vbox.pack_start(self._hbox_location)
80
        self.vbox.pack_start(self._check_remember)
81
        self.vbox.pack_start(self._check_prefix)
82
        self.vbox.pack_start(self._check_overwrite)
83
        self.vbox.pack_start(self._hbox_test)
84
        self.action_area.pack_start(self._button_test)
85
        self.action_area.pack_end(self._button_push)
86
        
87
        # Show the dialog
88
        self.vbox.show_all()
89
        
90
        # Build location history
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
91
        self._history = UrlHistory(self.branch.get_config(), 'push_history')
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
92
        self._build_history()
93
        
94
    def _build_history(self):
95
        """ Build up the location history. """
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
96
        self._combo_model = gtk.ListStore(str)
97
        for item in self._history.get_entries():
98
            self._combo_model.append([ item ])
99
        self._combo.set_model(self._combo_model)
100
        self._combo.set_text_column(0)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
101
        
102
        location = self.branch.get_push_location()
103
        if location:
104
            self._combo.get_child().set_text(location)
105
    
106
    def _on_test_clicked(self, widget):
107
        """ Test button clicked handler. """
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
108
        import re
109
        _urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
110
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
111
        url = self._combo.get_child().get_text()
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
112
        
113
        m = _urlRE.match(url)
114
        if m:
115
            proto = m.groupdict()['proto']
0.8.59 by Szilveszter Farkas (Phanatic)
Added README; some small fixes.
116
            if (proto == 'sftp') or (proto == 'file') or (proto == 'ftp'):
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
117
                # have write acces (most probably)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
118
                self._image_test.set_from_stock(gtk.STOCK_YES, 4)
119
                self._label_test.set_markup(_('<b>Write access is probably available</b>'))
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
120
            else:
121
                # no write access
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
122
                self._image_test.set_from_stock(gtk.STOCK_NO, 4)
123
                self._label_test.set_markup(_('<b>No write access</b>'))
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
124
        else:
125
            # couldn't determine
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
126
            self._image_test.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4)
127
            self._label_test.set_markup(_('<b>Could not determine</b>'))
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
128
    
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
129
    @show_bzr_error
130
    def _on_push_clicked(self, widget):
131
        """ Push button clicked handler. """
132
        location = self._combo.get_child().get_text()
133
        revs = 0
134
        try:
135
            revs = do_push(self.branch,
136
                           location=location,
137
                           overwrite=self._check_overwrite.get_active(),
138
                           remember=self._check_remember.get_active(),
139
                           create_prefix=self._check_prefix.get_active())
140
        except errors.DivergedBranches:
141
            response = question_dialog(_('Branches have been diverged'),
142
                                       _('You cannot push if branches have diverged.\nOverwrite?'))
143
            if response == gtk.RESPONSE_OK:
144
                revs = do_push(self.branch, overwrite=True)
145
            return
146
        
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
147
        self._history.add_entry(location)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
148
        info_dialog(_('Push successful'),
149
                    _("%d revision(s) pushed.") % revs)
150
        
151
        self.response(gtk.RESPONSE_OK)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
152
153
def do_push(branch, location=None, remember=False, overwrite=False,
154
         create_prefix=False):
155
    """ Update a mirror of a branch.
156
    
157
    :param branch: the source branch
158
    
159
    :param location: the location of the branch that you'd like to update
160
    
161
    :param remember: if set, the location will be stored
162
    
163
    :param overwrite: overwrite target location if it diverged
164
    
165
    :param create_prefix: create the path leading up to the branch if it doesn't exist
166
    
167
    :return: number of revisions pushed
168
    """
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
169
    from bzrlib.bzrdir import BzrDir
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
170
    from bzrlib.transport import get_transport
171
        
99 by Szilveszter Farkas (Phanatic)
Fixed bug: #66656 (Push doesn't work).
172
    br_from = branch
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
173
    
174
    stored_loc = br_from.get_push_location()
175
    if location is None:
176
        if stored_loc is None:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
177
            error_dialog(_('Push location is unknown'),
99 by Szilveszter Farkas (Phanatic)
Fixed bug: #66656 (Push doesn't work).
178
                         _('Please specify a location manually.'))
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
179
            return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
180
        else:
181
            location = stored_loc
182
183
    transport = get_transport(location)
184
    location_url = transport.base
185
186
    if br_from.get_push_location() is None or remember:
187
        br_from.set_push_location(location_url)
188
189
    old_rh = []
190
191
    try:
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
192
        dir_to = BzrDir.open(location_url)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
193
        br_to = dir_to.open_branch()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
194
    except errors.NotBranchError:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
195
        # create a branch.
196
        transport = transport.clone('..')
197
        if not create_prefix:
198
            try:
199
                relurl = transport.relpath(location_url)
200
                transport.mkdir(relurl)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
201
            except errors.NoSuchFile:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
202
                error_dialog(_('Non existing parent directory'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
203
                             _("The parent directory (%s)\ndoesn't exist.") % location)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
204
                return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
205
        else:
206
            current = transport.base
207
            needed = [(transport, transport.relpath(location_url))]
208
            while needed:
209
                try:
210
                    transport, relpath = needed[-1]
211
                    transport.mkdir(relpath)
212
                    needed.pop()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
213
                except errors.NoSuchFile:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
214
                    new_transport = transport.clone('..')
215
                    needed.append((new_transport,
216
                                   new_transport.relpath(transport.base)))
217
                    if new_transport.base == transport.base:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
218
                        error_dialog(_('Path prefix not created'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
219
                                     _("The path leading up to the specified location couldn't\nbe created."))
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
220
                        return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
221
        dir_to = br_from.bzrdir.clone(location_url,
222
            revision_id=br_from.last_revision())
223
        br_to = dir_to.open_branch()
224
        count = len(br_to.revision_history())
225
    else:
226
        old_rh = br_to.revision_history()
227
        try:
0.13.13 by Jelmer Vernooij
Update TODO
228
            tree_to = dir_to.open_workingtree()
229
        except errors.NotLocalUrl:
230
            # FIXME - what to do here? how should we warn the user?
231
            #warning('This transport does not update the working '
232
            #        'tree of: %s' % (br_to.base,))
233
            count = br_to.pull(br_from, overwrite)
234
        except errors.NoWorkingTree:
235
            count = br_to.pull(br_from, overwrite)
236
        else:
237
            count = tree_to.pull(br_from, overwrite)
238
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
239
    return count