/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

Add options to viz treeview to not show the line graph, and to only show the main line.
Set the revision browser to use these options.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic)
2
 
#                       <szilveszter.farkas@gmail.com>
 
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
3
2
# Copyright (C) 2007 by Jelmer Vernooij <jelmer@samba.org>
4
3
#
5
4
# This program is free software; you can redistribute it and/or modify
16
15
# along with this program; if not, write to the Free Software
17
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
17
 
19
 
from gi.repository import Gtk
 
18
try:
 
19
    import pygtk
 
20
    pygtk.require("2.0")
 
21
except:
 
22
    pass
 
23
    
 
24
import gtk
20
25
 
21
26
from errors import show_bzr_error
22
27
 
23
 
from bzrlib import (
24
 
    errors,
25
 
    ui,
26
 
    )
27
 
from bzrlib.controldir import ControlDir
28
 
from bzrlib.push import PushResult
29
 
from bzrlib.transport import get_transport
30
 
 
31
 
from bzrlib.plugins.gtk.dialog import (
32
 
    question_dialog,
33
 
    )
34
 
from bzrlib.plugins.gtk.history import UrlHistory
35
 
from bzrlib.plugins.gtk.i18n import _i18n
36
 
from bzrlib.plugins.gtk.ui import ProgressPanel
37
 
 
38
 
 
39
 
class PushDialog(Gtk.Dialog):
40
 
    """New implementation of the Push dialog."""
41
 
 
42
 
    def __init__(self, repository=None, revid=None, branch=None, parent=None):
43
 
        """Initialize the Push dialog. """
44
 
        super(PushDialog, self).__init__(
45
 
            title="Push", parent=parent, flags=0, border_width=6,
46
 
            buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE))
47
 
        if repository is None:
48
 
            repository = branch.repository
49
 
        self.branch = branch
50
 
 
51
 
        # Unused arguments
 
28
# FIXME: This needs to be public JRV 20070714
 
29
from bzrlib.builtins import _create_prefix
 
30
from bzrlib.config import LocationConfig
 
31
import bzrlib.errors as errors
 
32
 
 
33
from dialog import error_dialog, info_dialog, question_dialog
 
34
 
 
35
from history import UrlHistory
 
36
 
 
37
class PushDialog(gtk.Dialog):
 
38
    """ New implementation of the Push dialog. """
 
39
    def __init__(self, repository, revid, branch=None, parent=None):
 
40
        """ Initialize the Push dialog. """
 
41
        gtk.Dialog.__init__(self, title="Push - Olive",
 
42
                                  parent=parent,
 
43
                                  flags=0,
 
44
                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
 
45
        
 
46
        # Get arguments
52
47
        self.repository = repository
53
 
        if revid is None:
54
 
            revid = branch.last_revision()
55
48
        self.revid = revid
56
 
 
 
49
        self.branch = branch
 
50
        
57
51
        # Create the widgets
58
 
        self._label_location = Gtk.Label(label=_i18n("Location:"))
59
 
        self._combo = Gtk.ComboBox.new_with_entry()
60
 
        self._button_push = Gtk.Button(_i18n("_Push"), use_underline=True)
61
 
        self._hbox_location = Gtk.Box(Gtk.Orientation.HORIZONTAL, 6)
62
 
        self._push_message = Gtk.Label(xalign=0)
63
 
        self._progress_widget = ProgressPanel()
64
 
 
 
52
        self._label_location = gtk.Label(_("Location:"))
 
53
        self._combo = gtk.ComboBoxEntry()
 
54
        self._button_push = gtk.Button(_("_Push"), use_underline=True)
 
55
        self._hbox_location = gtk.HBox()
 
56
        
65
57
        # Set callbacks
66
 
        ui.ui_factory.set_progress_bar_widget(self._progress_widget)
67
 
        self.connect('close', self._on_close_clicked)
68
58
        self._button_push.connect('clicked', self._on_push_clicked)
69
 
 
 
59
        
70
60
        # Set properties
71
 
        content_area = self.get_content_area()
72
 
        content_area.set_spacing(6)
73
 
 
 
61
        self._label_location.set_alignment(0, 0.5)
 
62
        self._hbox_location.set_spacing(3)
 
63
        self.vbox.set_spacing(3)
 
64
        
74
65
        # Pack widgets
75
 
        self._hbox_location.pack_start(self._label_location, False, False, 0)
76
 
        self._hbox_location.pack_start(self._combo, False, False, 0)
77
 
        content_area.pack_start(self._hbox_location, True, True, 0)
78
 
        content_area.pack_start(self._progress_widget, True, True, 0)
79
 
        content_area.pack_start(self._push_message, True, True, 0)
80
 
        self.get_action_area().pack_end(self._button_push, True, True, 0)
81
 
 
 
66
        self._hbox_location.pack_start(self._label_location, False, False)
 
67
        self._hbox_location.pack_start(self._combo, True, True)
 
68
        self.vbox.pack_start(self._hbox_location)
 
69
        self.action_area.pack_end(self._button_push)
 
70
        
82
71
        # Show the dialog
83
 
        content_area.show_all()
84
 
        self._progress_widget.hide()
85
 
        self._push_message.hide()
86
 
 
 
72
        self.vbox.show_all()
 
73
        
87
74
        # Build location history
88
75
        self._history = UrlHistory(self.branch.get_config(), 'push_history')
89
76
        self._build_history()
90
 
 
 
77
        
91
78
    def _build_history(self):
92
 
        """Build up the location history. """
93
 
        self._combo_model = Gtk.ListStore(str)
 
79
        """ Build up the location history. """
 
80
        self._combo_model = gtk.ListStore(str)
94
81
        for item in self._history.get_entries():
95
 
            self._combo_model.append([item])
 
82
            self._combo_model.append([ item ])
96
83
        self._combo.set_model(self._combo_model)
97
 
        self._combo.set_entry_text_column(0)
98
 
 
 
84
        self._combo.set_text_column(0)
 
85
        
99
86
        if self.branch is not None:
100
87
            location = self.branch.get_push_location()
101
88
            if location is not None:
102
89
                self._combo.get_child().set_text(location)
103
 
 
104
 
    def _on_close_clicked(self, widget):
105
 
        """Close dialog handler."""
106
 
        ui.ui_factory.set_progress_bar_widget(None)
107
 
 
 
90
    
108
91
    @show_bzr_error
109
92
    def _on_push_clicked(self, widget):
110
 
        """Push button clicked handler. """
111
 
        self._push_message.hide()
112
 
        self._progress_widget.tick()
 
93
        """ Push button clicked handler. """
113
94
        location = self._combo.get_child().get_text()
 
95
        revs = 0
 
96
        if self.branch is not None and self.branch.get_push_location() is None:
 
97
            response = question_dialog(_('Set default push location'),
 
98
                                       _('There is no default push location set.\nSet %r as default now?') % location)
 
99
            if response == gtk.RESPONSE_OK:
 
100
                self.branch.set_push_location(location)
114
101
 
115
102
        try:
116
 
            message = do_push(self.branch, location, overwrite=False)
 
103
            revs = do_push(self.branch, location=location, overwrite=False)
117
104
        except errors.DivergedBranches:
118
 
            response = question_dialog(
119
 
                _i18n('Branches have been diverged'),
120
 
                _i18n('You cannot push if branches have diverged.\n'
121
 
                      'Overwrite?'))
122
 
            if response == Gtk.ResponseType.YES:
123
 
                message = do_push(self.branch, location, overwrite=True)
124
 
            else:
125
 
                return
 
105
            response = question_dialog(_('Branches have been diverged'),
 
106
                                       _('You cannot push if branches have diverged.\nOverwrite?'))
 
107
            if response == gtk.RESPONSE_YES:
 
108
                revs = do_push(self.branch, location=location, overwrite=True)
 
109
        
126
110
        self._history.add_entry(location)
127
 
        if (self.branch is not None
128
 
            and self.branch.get_push_location() is None):
129
 
            self.branch.set_push_location(location)
130
 
        if message:
131
 
            self._progress_widget.finished()
132
 
            self._push_message.props.label = message
133
 
            self._push_message.show()
134
 
 
 
111
        info_dialog(_('Push successful'),
 
112
                    _("%d revision(s) pushed.") % revs)
 
113
        
 
114
        self.response(gtk.RESPONSE_OK)
135
115
 
136
116
def do_push(br_from, location, overwrite):
137
 
    """Update a mirror of a branch.
138
 
 
 
117
    """ Update a mirror of a branch.
 
118
    
139
119
    :param br_from: the source branch
 
120
    
140
121
    :param location: the location of the branch that you'd like to update
 
122
    
141
123
    :param overwrite: overwrite target location if it diverged
 
124
    
142
125
    :return: number of revisions pushed
143
126
    """
144
 
    revision_id = None
145
 
    to_transport = get_transport(location)
 
127
    from bzrlib.bzrdir import BzrDir
 
128
    from bzrlib.transport import get_transport
 
129
        
 
130
    transport = get_transport(location)
 
131
    location_url = transport.base
 
132
 
 
133
    old_rh = []
 
134
 
146
135
    try:
147
 
        dir_to = ControlDir.open_from_transport(to_transport)
 
136
        dir_to = BzrDir.open(location_url)
 
137
        br_to = dir_to.open_branch()
148
138
    except errors.NotBranchError:
149
 
        dir_to = None
150
 
 
151
 
    if dir_to is None:
 
139
        # create a branch.
 
140
        transport = transport.clone('..')
152
141
        try:
153
 
            br_to = br_from.create_clone_on_transport(
154
 
                to_transport, revision_id=revision_id)
 
142
            relurl = transport.relpath(location_url)
 
143
            transport.mkdir(relurl)
155
144
        except errors.NoSuchFile:
156
 
            response = question_dialog(
157
 
                _i18n('Non existing parent directory'),
158
 
                _i18n("The parent directory (%s)\ndoesn't exist. Create?") %
159
 
                    location)
160
 
            if response == Gtk.ResponseType.OK:
161
 
                br_to = br_from.create_clone_on_transport(
162
 
                    to_transport, revision_id=revision_id, create_prefix=True)
 
145
            response = question_dialog(_('Non existing parent directory'),
 
146
                         _("The parent directory (%s)\ndoesn't exist. Create?") % location)
 
147
            if response == gtk.RESPONSE_OK:
 
148
                _create_prefix(transport)
163
149
            else:
164
 
                return _i18n("Push aborted.")
165
 
        push_result = create_push_result(br_from, br_to)
 
150
                return
 
151
        dir_to = br_from.bzrdir.clone(location_url,
 
152
            revision_id=br_from.last_revision())
 
153
        br_to = dir_to.open_branch()
 
154
        count = len(br_to.revision_history())
166
155
    else:
167
 
        push_result = dir_to.push_branch(br_from, revision_id, overwrite)
168
 
    message = create_push_message(br_from, push_result)
169
 
    return message
170
 
 
171
 
 
172
 
def create_push_message(br_from, push_result):
173
 
    """Return a mesage explaining what happened during the push."""
174
 
    messages = []
175
 
    rev_count = br_from.revno() - push_result.old_revno
176
 
    messages.append(_i18n("%d revision(s) pushed.") % rev_count)
177
 
    if push_result.stacked_on is not None:
178
 
        messages.append(_i18n("Stacked on %s.") % push_result.stacked_on)
179
 
    if push_result.workingtree_updated is False:
180
 
        messages.append(_i18n(
181
 
            "\nThe working tree was not updated:"
182
 
            "\nSee 'bzr help working-trees' for more information."))
183
 
    return '\n'.join(messages)
184
 
 
185
 
 
186
 
def create_push_result(br_from, br_to):
187
 
    """Return a PushResult like one created by ControlDir.push_branch()."""
188
 
    push_result = PushResult()
189
 
    push_result.source_branch = br_from
190
 
    push_result.target_branch = br_to
191
 
    push_result.branch_push_result = None
192
 
    push_result.master_branch = None
193
 
    push_result.old_revno = 0
194
 
    push_result.old_revid = br_to.last_revision()
195
 
    push_result.workingtree_updated = None  # Not applicable to this case.
196
 
    try:
197
 
        push_result.stacked_on = br_to.get_stacked_on_url()
198
 
    except (errors.UnstackableBranchFormat,
199
 
            errors.UnstackableRepositoryFormat,
200
 
            errors.NotStacked):
201
 
        push_result.stacked_on = None
202
 
    return push_result
 
156
        old_rh = br_to.revision_history()
 
157
        try:
 
158
            tree_to = dir_to.open_workingtree()
 
159
        except errors.NotLocalUrl:
 
160
            # FIXME - what to do here? how should we warn the user?
 
161
            count = br_to.pull(br_from, overwrite)
 
162
        except errors.NoWorkingTree:
 
163
            count = br_to.pull(br_from, overwrite)
 
164
        else:
 
165
            count = tree_to.pull(br_from, overwrite)
 
166
 
 
167
    return count