/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
24
import gtk.gdk
25
import gtk.glade
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
26
0.11.1 by Jelmer Vernooij
Eliminate olive.backend.errors.
27
import bzrlib.errors as errors
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
28
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
29
from dialog import error_dialog, info_dialog
93.1.12 by Alexander Belchenko
Names XML files with GUI resources obtained via olive/guifiles.py
30
from guifiles import GLADEFILENAME
93.1.6 by Alexander Belchenko
detecting name of glade file doing in separate module (olive.gladefile)
31
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
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. """
93.1.6 by Alexander Belchenko
detecting name of glade file doing in separate module (olive.gladefile)
37
        self.glade = gtk.glade.XML(GLADEFILENAME, '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.14.8 by Alexander Belchenko
If there is no push location saved then use empty string
69
        self.entry_stored.set_text(branch.get_push_location() or '')
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
            except errors.DivergedBranches:
132 by Jelmer Vernooij
Use decorator for catching and showing bzr-gtk errors graphically. Eventually, this should go away and should be handled by the ui factory.
106
                response = question_dialog(_('Branches have been diverged'),
107
                             _('You cannot push if branches have diverged. \nOverwrite?'))
108
                if response == gtk.RESPONSE_OK:
109
                    revs = do_push(self.branch, overwrite=True)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
110
                return
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
111
        elif self.radio_specific.get_active():
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
112
            location = self.entry_location.get_text()
113
            if location == '':
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
114
                error_dialog(_('No location specified'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
115
                             _('Please specify a location or use the default.'))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
116
                return
117
            
118
            try:
0.13.13 by Jelmer Vernooij
Update TODO
119
                revs = do_push(self.branch, location,
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
120
                               self.check_remember.get_active(),
132 by Jelmer Vernooij
Use decorator for catching and showing bzr-gtk errors graphically. Eventually, this should go away and should be handled by the ui factory.
121
                               False,
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
122
                               self.check_create.get_active())
123
            except errors.DivergedBranches:
132 by Jelmer Vernooij
Use decorator for catching and showing bzr-gtk errors graphically. Eventually, this should go away and should be handled by the ui factory.
124
                response = question_dialog(_('Branches have been diverged'),
125
                             _('You cannot push if branches have diverged. \nOverwrite?'))
126
                if response == gtk.RESPONSE_OK:
127
                    revs = do_push(self.branch, location,
128
                        self.check_remember.get_active(),
129
                            True,
130
                            self.check_create.get_active())
131
                else:
132
                    return
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
133
        
0.8.23 by Szilveszter Farkas (Phanatic)
Visual feedback when Olive is busy; follow bzr API changes; commit dialog update
134
        self.close()
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
135
        info_dialog(_('Push successful'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
136
                    _('%d revision(s) pushed.') % revs)
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
137
    
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
138
    def test(self, widget):
139
        """ Test if write access possible. """
140
        import re
141
        _urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
142
        
143
        if self.radio_stored.get_active():
144
            url = self.entry_stored.get_text()
145
        elif self.radio_specific.get_active():
146
            url = self.entry_location.get_text()
147
        
148
        m = _urlRE.match(url)
149
        if m:
150
            proto = m.groupdict()['proto']
0.8.59 by Szilveszter Farkas (Phanatic)
Added README; some small fixes.
151
            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.
152
                # have write acces (most probably)
153
                self.image_test.set_from_stock(gtk.STOCK_YES, 4)
0.8.71 by Szilveszter Farkas (Phanatic)
Merge from Richard Ferguson's development branch.
154
                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.
155
            else:
156
                # no write access
157
                self.image_test.set_from_stock(gtk.STOCK_NO, 4)
158
                self.label_test.set_markup(_('<b>No write access</b>'))
159
        else:
160
            # couldn't determine
161
            self.image_test.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4)
162
            self.label_test.set_markup(_('<b>Could not determine</b>'))
163
    
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
164
    def close(self, widget=None):
165
        self.window.destroy()
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
166
167
def do_push(branch, location=None, remember=False, overwrite=False,
168
         create_prefix=False):
169
    """ Update a mirror of a branch.
170
    
171
    :param branch: the source branch
172
    
173
    :param location: the location of the branch that you'd like to update
174
    
175
    :param remember: if set, the location will be stored
176
    
177
    :param overwrite: overwrite target location if it diverged
178
    
179
    :param create_prefix: create the path leading up to the branch if it doesn't exist
180
    
181
    :return: number of revisions pushed
182
    """
183
    from bzrlib.branch import Branch
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
184
    from bzrlib.bzrdir import BzrDir
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
185
    from bzrlib.transport import get_transport
186
        
99 by Szilveszter Farkas (Phanatic)
Fixed bug: #66656 (Push doesn't work).
187
    br_from = branch
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
188
    
189
    stored_loc = br_from.get_push_location()
190
    if location is None:
191
        if stored_loc is None:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
192
            error_dialog(_('Push location is unknown'),
99 by Szilveszter Farkas (Phanatic)
Fixed bug: #66656 (Push doesn't work).
193
                         _('Please specify a location manually.'))
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
194
            return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
195
        else:
196
            location = stored_loc
197
198
    transport = get_transport(location)
199
    location_url = transport.base
200
201
    if br_from.get_push_location() is None or remember:
202
        br_from.set_push_location(location_url)
203
204
    old_rh = []
205
206
    try:
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
207
        dir_to = BzrDir.open(location_url)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
208
        br_to = dir_to.open_branch()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
209
    except errors.NotBranchError:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
210
        # create a branch.
211
        transport = transport.clone('..')
212
        if not create_prefix:
213
            try:
214
                relurl = transport.relpath(location_url)
215
                transport.mkdir(relurl)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
216
            except errors.NoSuchFile:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
217
                error_dialog(_('Non existing parent directory'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
218
                             _("The parent directory (%s)\ndoesn't exist.") % location)
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
219
                return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
220
        else:
221
            current = transport.base
222
            needed = [(transport, transport.relpath(location_url))]
223
            while needed:
224
                try:
225
                    transport, relpath = needed[-1]
226
                    transport.mkdir(relpath)
227
                    needed.pop()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
228
                except errors.NoSuchFile:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
229
                    new_transport = transport.clone('..')
230
                    needed.append((new_transport,
231
                                   new_transport.relpath(transport.base)))
232
                    if new_transport.base == transport.base:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
233
                        error_dialog(_('Path prefix not created'),
0.8.98 by Szilveszter Farkas (Phanatic)
Loads of fixes. Pyflakes cleanup.
234
                                     _("The path leading up to the specified location couldn't\nbe created."))
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
235
                        return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
236
        dir_to = br_from.bzrdir.clone(location_url,
237
            revision_id=br_from.last_revision())
238
        br_to = dir_to.open_branch()
239
        count = len(br_to.revision_history())
240
    else:
241
        old_rh = br_to.revision_history()
242
        try:
0.13.13 by Jelmer Vernooij
Update TODO
243
            tree_to = dir_to.open_workingtree()
244
        except errors.NotLocalUrl:
245
            # FIXME - what to do here? how should we warn the user?
246
            #warning('This transport does not update the working '
247
            #        'tree of: %s' % (br_to.base,))
248
            count = br_to.pull(br_from, overwrite)
249
        except errors.NoWorkingTree:
250
            count = br_to.pull(br_from, overwrite)
251
        else:
252
            count = tree_to.pull(br_from, overwrite)
253
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
254
    return count