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