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