/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to push.py

  • Committer: Vincent Ladeuil
  • Date: 2008-05-05 18:16:46 UTC
  • mto: (487.1.1 gtk)
  • mto: This revision was merged to the branch mainline in revision 490.
  • Revision ID: v.ladeuil+lp@free.fr-20080505181646-n95l8ltw2u6jtr26
Fix bug #187283 fix replacing _() by _i18n().

* genpot.sh 
Remove duplication. Add the ability to specify the genrated pot
file on command-line for debugging purposes.

* po/olive-gtk.pot:
Regenerated.

* __init__.py, branch.py, branchview/treeview.py, checkout.py,
commit.py, conflicts.py, diff.py, errors.py, initialize.py,
merge.py, nautilus-bzr.py, olive/__init__.py, olive/add.py,
olive/bookmark.py, olive/guifiles.py, olive/info.py,
olive/menu.py, olive/mkdir.py, olive/move.py, olive/remove.py,
olive/rename.py, push.py, revbrowser.py, status.py, tags.py:
Replace all calls to _() by calls to _i18n(), the latter being
defined in __init__.py and imported in the other modules from
there. This fix the problem encountered countless times when
running bzr selftest and getting silly error messages about
boolean not being callables.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
 
2
# Copyright (C) 2007 by Jelmer Vernooij <jelmer@samba.org>
2
3
#
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
14
15
# along with this program; if not, write to the Free Software
15
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
 
17
 
import sys
18
 
 
19
18
try:
20
19
    import pygtk
21
20
    pygtk.require("2.0")
22
21
except:
23
22
    pass
24
 
try:
25
 
    import gtk
26
 
    import gtk.gdk
27
 
    import gtk.glade
28
 
except:
29
 
    sys.exit(1)
30
 
 
 
23
    
 
24
import gtk
 
25
 
 
26
from errors import show_bzr_error
 
27
 
 
28
# FIXME: This needs to be public JRV 20070714
 
29
from bzrlib.builtins import _create_prefix
 
30
from bzrlib.config import LocationConfig
31
31
import bzrlib.errors as errors
32
32
 
33
 
class OlivePush:
34
 
    """ Display Push dialog and perform the needed actions. """
35
 
    def __init__(self, gladefile, comm, dialog):
 
33
from bzrlib.plugins.gtk import _i18n
 
34
from dialog import error_dialog, info_dialog, question_dialog
 
35
 
 
36
from history import UrlHistory
 
37
 
 
38
class PushDialog(gtk.Dialog):
 
39
    """ New implementation of the Push dialog. """
 
40
    def __init__(self, repository, revid, branch=None, parent=None):
36
41
        """ Initialize the Push dialog. """
37
 
        self.gladefile = gladefile
38
 
        self.glade = gtk.glade.XML(self.gladefile, 'window_push')
39
 
        
40
 
        # Communication object
41
 
        self.comm = comm
42
 
        # Dialog object
43
 
        self.dialog = dialog
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,
50
 
                "on_button_push_test_clicked": self.test,
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
58
 
        self.radio_stored = self.glade.get_widget('radiobutton_push_stored')
59
 
        self.radio_specific = self.glade.get_widget('radiobutton_push_specific')
60
 
        self.entry_stored = self.glade.get_widget('entry_push_stored')
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')
65
 
        self.label_test = self.glade.get_widget('label_push_test')
66
 
        self.image_test = self.glade.get_widget('image_push_test')
67
 
        
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
 
                
73
 
        # Get stored location
74
 
        self.notbranch = False
75
 
        try:
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())
81
 
        except errors.NotBranchError:
82
 
            self.notbranch = True
83
 
            return
84
 
    
85
 
    def display(self):
86
 
        """ Display the Push dialog. """
87
 
        if self.notbranch:
88
 
            self.dialog.error_dialog(_('Directory is not a branch'),
89
 
                                     _('You can perform this action only in a branch.'))
90
 
            self.close()
91
 
        else:
92
 
            self.window.show()
93
 
            self.width, self.height = self.window.get_size()
94
 
    
95
 
    def stored_toggled(self, widget):
96
 
        if widget.get_active():
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)
101
 
        else:
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)
106
 
    
107
 
    def specific_toggled(self, widget):
108
 
        if widget.get_active():
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)
113
 
        else:
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)
118
 
    
119
 
    def push(self, widget):
 
42
        gtk.Dialog.__init__(self, title="Push - Olive",
 
43
                                  parent=parent,
 
44
                                  flags=0,
 
45
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
 
46
        
 
47
        # Get arguments
 
48
        self.repository = repository
 
49
        self.revid = revid
 
50
        self.branch = branch
 
51
        
 
52
        # Create the widgets
 
53
        self._label_location = gtk.Label(_i18n("Location:"))
 
54
        self._combo = gtk.ComboBoxEntry()
 
55
        self._button_push = gtk.Button(_i18n("_Push"), use_underline=True)
 
56
        self._hbox_location = gtk.HBox()
 
57
        
 
58
        # Set callbacks
 
59
        self._button_push.connect('clicked', self._on_push_clicked)
 
60
        
 
61
        # Set properties
 
62
        self._label_location.set_alignment(0, 0.5)
 
63
        self._hbox_location.set_spacing(3)
 
64
        self.vbox.set_spacing(3)
 
65
        
 
66
        # Pack widgets
 
67
        self._hbox_location.pack_start(self._label_location, False, False)
 
68
        self._hbox_location.pack_start(self._combo, True, True)
 
69
        self.vbox.pack_start(self._hbox_location)
 
70
        self.action_area.pack_end(self._button_push)
 
71
        
 
72
        # Show the dialog
 
73
        self.vbox.show_all()
 
74
        
 
75
        # Build location history
 
76
        self._history = UrlHistory(self.branch.get_config(), 'push_history')
 
77
        self._build_history()
 
78
        
 
79
    def _build_history(self):
 
80
        """ Build up the location history. """
 
81
        self._combo_model = gtk.ListStore(str)
 
82
        for item in self._history.get_entries():
 
83
            self._combo_model.append([ item ])
 
84
        self._combo.set_model(self._combo_model)
 
85
        self._combo.set_text_column(0)
 
86
        
 
87
        if self.branch is not None:
 
88
            location = self.branch.get_push_location()
 
89
            if location is not None:
 
90
                self._combo.get_child().set_text(location)
 
91
    
 
92
    @show_bzr_error
 
93
    def _on_push_clicked(self, widget):
 
94
        """ Push button clicked handler. """
 
95
        location = self._combo.get_child().get_text()
120
96
        revs = 0
121
 
        self.comm.set_busy(self.window)
122
 
        if self.radio_stored.get_active():
123
 
            try:
124
 
                revs = do_push(self.comm.get_path(),
125
 
                               overwrite=self.check_overwrite.get_active())
126
 
            except errors.NotBranchError:
127
 
                self.dialog.error_dialog(_('Directory is not a branch'),
128
 
                                         _('You can perform this action only in a branch.'))
129
 
                return
130
 
            except errors.DivergedBranches:
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.'))
133
 
                return
134
 
            except:
135
 
                raise
136
 
        elif self.radio_specific.get_active():
137
 
            location = self.entry_location.get_text()
138
 
            if location == '':
139
 
                self.dialog.error_dialog(_('No location specified'),
140
 
                                         _('Please specify a location or use the default.'))
141
 
                return
142
 
            
143
 
            try:
144
 
                revs = do_push(self.comm.get_path(), location,
145
 
                               self.check_remember.get_active(),
146
 
                               self.check_overwrite.get_active(),
147
 
                               self.check_create.get_active())
148
 
            except errors.NotBranchError:
149
 
                self.dialog.error_dialog(_('Directory is not a branch'),
150
 
                                         _('You can perform this action only in a branch.'))
151
 
                self.comm.set_busy(self.window, False)
152
 
                return
153
 
            except errors.DivergedBranches:
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.'))
156
 
                self.comm.set_busy(self.window, False)
157
 
                return
158
 
            except:
159
 
                raise
160
 
        else:
161
 
            # This should really never happen
162
 
            pass
163
 
        
164
 
        self.close()
165
 
        self.dialog.info_dialog(_('Push successful'),
166
 
                                _('%d revision(s) pushed.') % revs)
167
 
    
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']
181
 
            if (proto == 'sftp') or (proto == 'file') or (proto == 'ftp'):
182
 
                # have write acces (most probably)
183
 
                self.image_test.set_from_stock(gtk.STOCK_YES, 4)
184
 
                self.label_test.set_markup(_('<b>Write access is probably available</b>'))
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
 
    
194
 
    def close(self, widget=None):
195
 
        self.window.destroy()
196
 
 
197
 
def do_push(branch, location=None, remember=False, overwrite=False,
198
 
         create_prefix=False):
 
97
        if self.branch is not None and self.branch.get_push_location() is None:
 
98
            response = question_dialog(_i18n('Set default push location'),
 
99
                                       _i18n('There is no default push location set.\nSet %r as default now?') % location)
 
100
            if response == gtk.RESPONSE_OK:
 
101
                self.branch.set_push_location(location)
 
102
 
 
103
        try:
 
104
            revs = do_push(self.branch, location=location, overwrite=False)
 
105
        except errors.DivergedBranches:
 
106
            response = question_dialog(_i18n('Branches have been diverged'),
 
107
                                       _i18n('You cannot push if branches have diverged.\nOverwrite?'))
 
108
            if response == gtk.RESPONSE_YES:
 
109
                revs = do_push(self.branch, location=location, overwrite=True)
 
110
        
 
111
        self._history.add_entry(location)
 
112
        info_dialog(_i18n('Push successful'),
 
113
                    _i18n("%d revision(s) pushed.") % revs)
 
114
        
 
115
        self.response(gtk.RESPONSE_OK)
 
116
 
 
117
def do_push(br_from, location, overwrite):
199
118
    """ Update a mirror of a branch.
200
119
    
201
 
    :param branch: the source branch
 
120
    :param br_from: the source branch
202
121
    
203
122
    :param location: the location of the branch that you'd like to update
204
123
    
205
 
    :param remember: if set, the location will be stored
206
 
    
207
124
    :param overwrite: overwrite target location if it diverged
208
125
    
209
 
    :param create_prefix: create the path leading up to the branch if it doesn't exist
210
 
    
211
126
    :return: number of revisions pushed
212
127
    """
213
 
    from bzrlib.branch import Branch
214
128
    from bzrlib.bzrdir import BzrDir
215
129
    from bzrlib.transport import get_transport
216
130
        
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:
222
 
            self.dialog.error_dialog(_('Push location is unknown'),
223
 
                                     _('Please specify a location manually.'))
224
 
            return
225
 
        else:
226
 
            location = stored_loc
227
 
 
228
131
    transport = get_transport(location)
229
132
    location_url = transport.base
230
133
 
231
 
    if br_from.get_push_location() is None or remember:
232
 
        br_from.set_push_location(location_url)
233
 
 
234
134
    old_rh = []
235
135
 
236
136
    try:
239
139
    except errors.NotBranchError:
240
140
        # create a branch.
241
141
        transport = transport.clone('..')
242
 
        if not create_prefix:
243
 
            try:
244
 
                relurl = transport.relpath(location_url)
245
 
                transport.mkdir(relurl)
246
 
            except errors.NoSuchFile:
247
 
                self.dialog.error_dialog(_('Non existing parent directory'),
248
 
                                         _("The parent directory (%s)\ndoesn't exist.") % location)
 
142
        try:
 
143
            relurl = transport.relpath(location_url)
 
144
            transport.mkdir(relurl)
 
145
        except errors.NoSuchFile:
 
146
            response = question_dialog(_i18n('Non existing parent directory'),
 
147
                         _i18n("The parent directory (%s)\ndoesn't exist. Create?") % location)
 
148
            if response == gtk.RESPONSE_OK:
 
149
                _create_prefix(transport)
 
150
            else:
249
151
                return
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()
258
 
                except errors.NoSuchFile:
259
 
                    new_transport = transport.clone('..')
260
 
                    needed.append((new_transport,
261
 
                                   new_transport.relpath(transport.base)))
262
 
                    if new_transport.base == transport.base:
263
 
                        self.dialog.error_dialog(_('Path prefix not created'),
264
 
                                                 _("The path leading up to the specified location couldn't\nbe created."))
265
 
                        return
266
152
        dir_to = br_from.bzrdir.clone(location_url,
267
153
            revision_id=br_from.last_revision())
268
154
        br_to = dir_to.open_branch()
270
156
    else:
271
157
        old_rh = br_to.revision_history()
272
158
        try:
273
 
            try:
274
 
                tree_to = dir_to.open_workingtree()
275
 
            except errors.NotLocalUrl:
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)
280
 
            except errors.NoWorkingTree:
281
 
                count = br_to.pull(br_from, overwrite)
282
 
            else:
283
 
                count = tree_to.pull(br_from, overwrite)
284
 
        except errors.DivergedBranches:
285
 
            raise
286
 
    
 
159
            tree_to = dir_to.open_workingtree()
 
160
        except errors.NotLocalUrl:
 
161
            # FIXME - what to do here? how should we warn the user?
 
162
            count = br_to.pull(br_from, overwrite)
 
163
        except errors.NoWorkingTree:
 
164
            count = br_to.pull(br_from, overwrite)
 
165
        else:
 
166
            count = tree_to.pull(br_from, overwrite)
 
167
 
287
168
    return count