/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
import sys
18
19
try:
20
    import pygtk
21
    pygtk.require("2.0")
22
except:
23
    pass
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
24
	
25
import gtk
26
import gtk.gdk
27
import gtk.glade
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
28
0.11.1 by Jelmer Vernooij
Eliminate olive.backend.errors.
29
import bzrlib.errors as errors
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
30
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
31
from olive import gladefile
32
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
33
class OlivePush:
34
    """ Display Push dialog and perform the needed actions. """
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
35
    def __init__(self, comm):
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
36
        """ Initialize the Push dialog. """
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
37
        self.glade = gtk.glade.XML(gladefile, 'window_push')
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
38
        
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
39
        # Communication object
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
40
        self.comm = comm
41
        
42
        self.window = self.glade.get_widget('window_push')
43
        
44
        # Dictionary for signal_autoconnect
45
        dic = { "on_button_push_push_clicked": self.push,
46
                "on_button_push_cancel_clicked": self.close,
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
47
                "on_button_push_test_clicked": self.test,
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
48
                "on_radiobutton_push_stored_toggled": self.stored_toggled,
49
                "on_radiobutton_push_specific_toggled": self.specific_toggled, }
50
        
51
        # Connect the signals to the handlers
52
        self.glade.signal_autoconnect(dic)
53
        
54
        # Get some useful widgets
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
55
        self.radio_stored = self.glade.get_widget('radiobutton_push_stored')
56
        self.radio_specific = self.glade.get_widget('radiobutton_push_specific')
0.8.27 by Szilveszter Farkas (Phanatic)
Push dialog now displays stored location
57
        self.entry_stored = self.glade.get_widget('entry_push_stored')
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
58
        self.entry_location = self.glade.get_widget('entry_push_location')
59
        self.check_remember = self.glade.get_widget('checkbutton_push_remember')
60
        self.check_overwrite = self.glade.get_widget('checkbutton_push_overwrite')
61
        self.check_create = self.glade.get_widget('checkbutton_push_create')
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
62
        self.label_test = self.glade.get_widget('label_push_test')
63
        self.image_test = self.glade.get_widget('image_push_test')
0.8.27 by Szilveszter Farkas (Phanatic)
Push dialog now displays stored location
64
        
0.10.2 by Richard Ferguson
Fixed push dialog to not hide/show widgets
65
        # Set initial state
66
        self.entry_location.set_sensitive(0)
67
        self.check_remember.set_sensitive(0)
68
        self.check_create.set_sensitive(0)
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
69
        
0.8.27 by Szilveszter Farkas (Phanatic)
Push dialog now displays stored location
70
        # Get stored location
0.8.45 by Szilveszter Farkas (Phanatic)
Some bugs fixed in the Push dialog; added TODO items.
71
        self.notbranch = False
72
        try:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
73
            from bzrlib.branch import Branch
74
    
75
            branch = Branch.open_containing(self.comm.get_path())[0]
76
    
77
            self.entry_stored.set_text(branch.get_push_location())
0.8.45 by Szilveszter Farkas (Phanatic)
Some bugs fixed in the Push dialog; added TODO items.
78
        except errors.NotBranchError:
79
            self.notbranch = True
80
            return
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
81
    
82
    def display(self):
83
        """ Display the Push dialog. """
0.8.45 by Szilveszter Farkas (Phanatic)
Some bugs fixed in the Push dialog; added TODO items.
84
        if self.notbranch:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
85
            error_dialog(_('Directory is not a branch'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
86
                                     _('You can perform this action only in a branch.'))
0.8.45 by Szilveszter Farkas (Phanatic)
Some bugs fixed in the Push dialog; added TODO items.
87
            self.close()
88
        else:
89
            self.window.show()
90
            self.width, self.height = self.window.get_size()
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
91
    
92
    def stored_toggled(self, widget):
93
        if widget.get_active():
0.10.2 by Richard Ferguson
Fixed push dialog to not hide/show widgets
94
            self.entry_stored.set_sensitive(1)
95
            self.entry_location.set_sensitive(0)
96
            self.check_remember.set_sensitive(0)
97
            self.check_create.set_sensitive(0)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
98
        else:
0.10.2 by Richard Ferguson
Fixed push dialog to not hide/show widgets
99
            self.entry_stored.set_sensitive(0)
100
            self.entry_location.set_sensitive(1)
101
            self.check_remember.set_sensitive(1)
102
            self.check_create.set_sensitive(1)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
103
    
104
    def specific_toggled(self, widget):
105
        if widget.get_active():
0.10.2 by Richard Ferguson
Fixed push dialog to not hide/show widgets
106
            self.entry_stored.set_sensitive(0)
107
            self.entry_location.set_sensitive(1)
108
            self.check_remember.set_sensitive(1)
109
            self.check_create.set_sensitive(1)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
110
        else:
0.10.2 by Richard Ferguson
Fixed push dialog to not hide/show widgets
111
            self.entry_stored.set_sensitive(1)
112
            self.entry_location.set_sensitive(0)
113
            self.check_remember.set_sensitive(0)
114
            self.check_create.set_sensitive(0)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
115
    
116
    def push(self, widget):
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
117
        revs = 0
118
        self.comm.set_busy(self.window)
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
119
        if self.radio_stored.get_active():
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
120
            try:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
121
                revs = do_push(self.comm.get_path(),
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
122
                               overwrite=self.check_overwrite.get_active())
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
123
            except errors.NotBranchError:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
124
                error_dialog(_('Directory is not a branch'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
125
                                         _('You can perform this action only in a branch.'))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
126
                return
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
127
            except errors.DivergedBranches:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
128
                error_dialog(_('Branches have been diverged'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
129
                                         _('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
130
                return
131
            except:
132
                raise
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
133
        elif self.radio_specific.get_active():
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
134
            location = self.entry_location.get_text()
135
            if location == '':
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
136
                error_dialog(_('No location specified'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
137
                                         _('Please specify a location or use the default.'))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
138
                return
139
            
140
            try:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
141
                revs = do_push(self.comm.get_path(), location,
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
142
                               self.check_remember.get_active(),
143
                               self.check_overwrite.get_active(),
144
                               self.check_create.get_active())
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
145
            except errors.NotBranchError:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
146
                error_dialog(_('Directory is not a branch'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
147
                                         _('You can perform this action only in a branch.'))
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
148
                self.comm.set_busy(self.window, False)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
149
                return
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
150
            except errors.DivergedBranches:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
151
                error_dialog(_('Branches have been diverged'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
152
                                         _('You cannot push if branches have diverged. Use the\noverwrite option if you want to push anyway.'))
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
153
                self.comm.set_busy(self.window, False)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
154
                return
155
            except:
156
                raise
157
        else:
158
            # This should really never happen
159
            pass
160
        
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
161
        self.close()
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
162
        info_dialog(_('Push successful'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
163
                                _('%d revision(s) pushed.') % revs)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
164
    
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
165
    def test(self, widget):
166
        """ Test if write access possible. """
167
        import re
168
        _urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
169
        
170
        if self.radio_stored.get_active():
171
            url = self.entry_stored.get_text()
172
        elif self.radio_specific.get_active():
173
            url = self.entry_location.get_text()
174
        
175
        m = _urlRE.match(url)
176
        if m:
177
            proto = m.groupdict()['proto']
0.8.59 by Szilveszter Farkas (Phanatic)
Added README; some small fixes.
178
            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.
179
                # have write acces (most probably)
180
                self.image_test.set_from_stock(gtk.STOCK_YES, 4)
0.8.71 by Szilveszter Farkas (Phanatic)
Merge from Richard Ferguson's development branch.
181
                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.
182
            else:
183
                # no write access
184
                self.image_test.set_from_stock(gtk.STOCK_NO, 4)
185
                self.label_test.set_markup(_('<b>No write access</b>'))
186
        else:
187
            # couldn't determine
188
            self.image_test.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4)
189
            self.label_test.set_markup(_('<b>Could not determine</b>'))
190
    
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
191
    def close(self, widget=None):
192
        self.window.destroy()
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
193
194
def do_push(branch, location=None, remember=False, overwrite=False,
195
         create_prefix=False):
196
    """ Update a mirror of a branch.
197
    
198
    :param branch: the source branch
199
    
200
    :param location: the location of the branch that you'd like to update
201
    
202
    :param remember: if set, the location will be stored
203
    
204
    :param overwrite: overwrite target location if it diverged
205
    
206
    :param create_prefix: create the path leading up to the branch if it doesn't exist
207
    
208
    :return: number of revisions pushed
209
    """
210
    from bzrlib.branch import Branch
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
211
    from bzrlib.bzrdir import BzrDir
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
212
    from bzrlib.transport import get_transport
213
        
214
    br_from = Branch.open_containing(branch)[0]
215
    
216
    stored_loc = br_from.get_push_location()
217
    if location is None:
218
        if stored_loc is None:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
219
            error_dialog(_('Push location is unknown'),
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
220
                                     _('Please specify a location manually.'))
221
            return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
222
        else:
223
            location = stored_loc
224
225
    transport = get_transport(location)
226
    location_url = transport.base
227
228
    if br_from.get_push_location() is None or remember:
229
        br_from.set_push_location(location_url)
230
231
    old_rh = []
232
233
    try:
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
234
        dir_to = BzrDir.open(location_url)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
235
        br_to = dir_to.open_branch()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
236
    except errors.NotBranchError:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
237
        # create a branch.
238
        transport = transport.clone('..')
239
        if not create_prefix:
240
            try:
241
                relurl = transport.relpath(location_url)
242
                transport.mkdir(relurl)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
243
            except errors.NoSuchFile:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
244
                error_dialog(_('Non existing parent directory'),
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
245
                                         _("The parent directory (%s)\ndoesn't exist.") % location)
246
                return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
247
        else:
248
            current = transport.base
249
            needed = [(transport, transport.relpath(location_url))]
250
            while needed:
251
                try:
252
                    transport, relpath = needed[-1]
253
                    transport.mkdir(relpath)
254
                    needed.pop()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
255
                except errors.NoSuchFile:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
256
                    new_transport = transport.clone('..')
257
                    needed.append((new_transport,
258
                                   new_transport.relpath(transport.base)))
259
                    if new_transport.base == transport.base:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
260
                        error_dialog(_('Path prefix not created'),
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
261
                                                 _("The path leading up to the specified location couldn't\nbe created."))
262
                        return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
263
        dir_to = br_from.bzrdir.clone(location_url,
264
            revision_id=br_from.last_revision())
265
        br_to = dir_to.open_branch()
266
        count = len(br_to.revision_history())
267
    else:
268
        old_rh = br_to.revision_history()
269
        try:
270
            try:
271
                tree_to = dir_to.open_workingtree()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
272
            except errors.NotLocalUrl:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
273
                # FIXME - what to do here? how should we warn the user?
274
                #warning('This transport does not update the working '
275
                #        'tree of: %s' % (br_to.base,))
276
                count = br_to.pull(br_from, overwrite)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
277
            except errors.NoWorkingTree:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
278
                count = br_to.pull(br_from, overwrite)
279
            else:
280
                count = tree_to.pull(br_from, overwrite)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
281
        except errors.DivergedBranches:
282
            raise
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
283
    
284
    return count