/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>
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
2
# Copyright (C) 2007 by Jelmer Vernooij <jelmer@samba.org>
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
3
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
8
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
13
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
try:
19
    import pygtk
20
    pygtk.require("2.0")
21
except:
22
    pass
0.13.13 by Jelmer Vernooij
Update TODO
23
    
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
24
import gtk
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
25
26
from errors import show_bzr_error
27
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
28
# FIXME: This needs to be public JRV 20070714
29
from bzrlib.builtins import _create_prefix
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
30
from bzrlib.config import LocationConfig
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
153 by Jelmer Vernooij
Fix references to dialog.
33
from dialog import error_dialog, info_dialog, question_dialog
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
34
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
35
from history import UrlHistory
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
36
37
class PushDialog(gtk.Dialog):
38
    """ New implementation of the Push dialog. """
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
39
    def __init__(self, repository, revid, branch=None, parent=None):
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
40
        """ Initialize the Push dialog. """
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
41
        gtk.Dialog.__init__(self, title="Push - Olive",
42
                                  parent=parent,
43
                                  flags=0,
44
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
45
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
46
        # Get arguments
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
47
        self.repository = repository
48
        self.revid = revid
0.13.13 by Jelmer Vernooij
Update TODO
49
        self.branch = branch
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
50
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
51
        # Create the widgets
52
        self._label_location = gtk.Label(_("Location:"))
53
        self._label_test = gtk.Label(_("(click the Test button to check write access)"))
54
        self._combo = gtk.ComboBoxEntry()
55
        self._button_test = gtk.Button(_("_Test"), use_underline=True)
56
        self._button_push = gtk.Button(_("_Push"), use_underline=True)
57
        self._hbox_location = gtk.HBox()
58
        self._hbox_test = gtk.HBox()
59
        self._image_test = gtk.Image()
60
        
61
        # Set callbacks
62
        self._button_test.connect('clicked', self._on_test_clicked)
63
        self._button_push.connect('clicked', self._on_push_clicked)
64
        
65
        # Set properties
66
        self._image_test.set_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_BUTTON)
67
        self._label_location.set_alignment(0, 0.5)
68
        self._label_test.set_alignment(0, 0.5)
69
        self._hbox_location.set_spacing(3)
70
        self._hbox_test.set_spacing(3)
71
        self.vbox.set_spacing(3)
72
        
73
        # Pack widgets
74
        self._hbox_location.pack_start(self._label_location, False, False)
75
        self._hbox_location.pack_start(self._combo, True, True)
76
        self._hbox_test.pack_start(self._image_test, False, False)
77
        self._hbox_test.pack_start(self._label_test, True, True)
78
        self.vbox.pack_start(self._hbox_location)
79
        self.vbox.pack_start(self._hbox_test)
80
        self.action_area.pack_start(self._button_test)
81
        self.action_area.pack_end(self._button_push)
82
        
83
        # Show the dialog
84
        self.vbox.show_all()
85
        
86
        # Build location history
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
87
        self._history = UrlHistory(self.branch.get_config(), 'push_history')
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
88
        self._build_history()
89
        
90
    def _build_history(self):
91
        """ Build up the location history. """
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
92
        self._combo_model = gtk.ListStore(str)
93
        for item in self._history.get_entries():
94
            self._combo_model.append([ item ])
95
        self._combo.set_model(self._combo_model)
96
        self._combo.set_text_column(0)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
97
        
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
98
        if self.branch is not None:
99
            location = self.branch.get_push_location()
100
            if location is not None:
101
                self._combo.get_child().set_text(location)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
102
    
103
    def _on_test_clicked(self, widget):
104
        """ Test button clicked handler. """
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
105
        import re
106
        _urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
107
        
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
108
        url = self._combo.get_child().get_text()
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
109
        
110
        m = _urlRE.match(url)
111
        if m:
112
            proto = m.groupdict()['proto']
222 by Jelmer Vernooij
Fix whitespace, add comment.
113
            # FIXME: This should ask the transport or branch rather than 
114
            # guessing using regular expressions. JRV 20070714
115
            if proto in ('sftp', 'file', 'ftp'):
116
                # have write access (most probably)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
117
                self._image_test.set_from_stock(gtk.STOCK_YES, 4)
118
                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.
119
            else:
120
                # no write access
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
121
                self._image_test.set_from_stock(gtk.STOCK_NO, 4)
122
                self._label_test.set_markup(_('<b>No write access</b>'))
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
123
        else:
124
            # couldn't determine
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
125
            self._image_test.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4)
126
            self._label_test.set_markup(_('<b>Could not determine</b>'))
0.8.58 by Szilveszter Farkas (Phanatic)
Added Test write access functionality to the Push dialog.
127
    
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
128
    @show_bzr_error
129
    def _on_push_clicked(self, widget):
130
        """ Push button clicked handler. """
131
        location = self._combo.get_child().get_text()
132
        revs = 0
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
133
        if self.branch is not None and self.branch.get_push_location() is None:
134
            response = question_dialog(_('Set default push location'),
135
                                       _('There is no default push location set.\nSet %r as default now?') % location)
136
            if response == gtk.REPONSE_OK:
137
                self.branch.set_push_location(location)
138
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
139
        try:
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
140
            revs = do_push(self.branch, location=location, overwrite=False)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
141
        except errors.DivergedBranches:
142
            response = question_dialog(_('Branches have been diverged'),
143
                                       _('You cannot push if branches have diverged.\nOverwrite?'))
144
            if response == gtk.RESPONSE_OK:
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
145
                revs = do_push(self.branch, location=location, overwrite=True)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
146
            return
147
        
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
148
        self._history.add_entry(location)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
149
        info_dialog(_('Push successful'),
150
                    _("%d revision(s) pushed.") % revs)
151
        
152
        self.response(gtk.RESPONSE_OK)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
153
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
154
def do_push(br_from, location, overwrite):
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
155
    """ Update a mirror of a branch.
156
    
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
157
    :param br_from: the source branch
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
158
    
159
    :param location: the location of the branch that you'd like to update
160
    
161
    :param overwrite: overwrite target location if it diverged
162
    
163
    :return: number of revisions pushed
164
    """
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
165
    from bzrlib.bzrdir import BzrDir
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
166
    from bzrlib.transport import get_transport
167
        
168
    transport = get_transport(location)
169
    location_url = transport.base
170
171
    old_rh = []
172
173
    try:
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
174
        dir_to = BzrDir.open(location_url)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
175
        br_to = dir_to.open_branch()
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
176
    except errors.NotBranchError:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
177
        # create a branch.
178
        transport = transport.clone('..')
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
179
        try:
180
            relurl = transport.relpath(location_url)
181
            transport.mkdir(relurl)
182
        except errors.NoSuchFile:
183
            response = question_dialog(_('Non existing parent directory'),
184
                         _("The parent directory (%s)\ndoesn't exist. Create?") % location)
185
            if response == gtk.RESPONSE_OK:
186
                _create_prefix(transport)
187
            else:
0.8.85 by Szilveszter Farkas (Phanatic)
Fix Push functionality.
188
                return
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
189
        dir_to = br_from.bzrdir.clone(location_url,
190
            revision_id=br_from.last_revision())
191
        br_to = dir_to.open_branch()
192
        count = len(br_to.revision_history())
193
    else:
194
        old_rh = br_to.revision_history()
195
        try:
0.13.13 by Jelmer Vernooij
Update TODO
196
            tree_to = dir_to.open_workingtree()
197
        except errors.NotLocalUrl:
198
            # FIXME - what to do here? how should we warn the user?
199
            count = br_to.pull(br_from, overwrite)
200
        except errors.NoWorkingTree:
201
            count = br_to.pull(br_from, overwrite)
202
        else:
203
            count = tree_to.pull(br_from, overwrite)
204
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
205
    return count