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