/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic)
2
#                       <szilveszter.farkas@gmail.com>
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
3
# Copyright (C) 2007 by Jelmer Vernooij <jelmer@samba.org>
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
4
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
9
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
14
#
0.8.19 by Szilveszter Farkas (Phanatic)
2006-07-21 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
19
from gi.repository import Gtk
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
20
21
from errors import show_bzr_error
22
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
23
from bzrlib import (
24
    errors,
25
    ui,
26
    )
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
27
from bzrlib.controldir import ControlDir
28
from bzrlib.push import PushResult
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
29
from bzrlib.transport import get_transport
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
30
31
from bzrlib.plugins.gtk.dialog import (
32
    question_dialog,
33
    )
724 by Jelmer Vernooij
Fix formatting, imports.
34
from bzrlib.plugins.gtk.history import UrlHistory
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
35
from bzrlib.plugins.gtk.i18n import _i18n
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
36
from bzrlib.plugins.gtk.ui import ProgressPanel
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
37
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
38
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
39
class PushDialog(Gtk.Dialog):
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
40
    """New implementation of the Push dialog."""
724 by Jelmer Vernooij
Fix formatting, imports.
41
783 by Jelmer Vernooij
Support opening push dialog from nautilus.
42
    def __init__(self, repository=None, revid=None, branch=None, parent=None):
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
43
        """Initialize the Push dialog. """
734.1.51 by Curtis Hovey
Fix the initializer for many classes.
44
        super(PushDialog, self).__init__(
776.3.15 by Curtis Hovey
Follow GNOME HIG.
45
            title="Push", parent=parent, flags=0, border_width=6,
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
46
            buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE))
783 by Jelmer Vernooij
Support opening push dialog from nautilus.
47
        if repository is None:
48
            repository = branch.repository
776.3.6 by Curtis Hovey
Added tests for push __init__.
49
        self.branch = branch
724 by Jelmer Vernooij
Fix formatting, imports.
50
776.3.6 by Curtis Hovey
Added tests for push __init__.
51
        # Unused arguments
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
52
        self.repository = repository
783 by Jelmer Vernooij
Support opening push dialog from nautilus.
53
        if revid is None:
54
            revid = branch.last_revision()
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
55
        self.revid = revid
724 by Jelmer Vernooij
Fix formatting, imports.
56
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
57
        # Create the widgets
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
58
        self._label_location = Gtk.Label(label=_i18n("Location:"))
734.1.14 by Curtis Hovey
Updated gpush to gtk3.
59
        self._combo = Gtk.ComboBox.new_with_entry()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
60
        self._button_push = Gtk.Button(_i18n("_Push"), use_underline=True)
776.3.15 by Curtis Hovey
Follow GNOME HIG.
61
        self._hbox_location = Gtk.Box(Gtk.Orientation.HORIZONTAL, 6)
62
        self._push_message = Gtk.Label(xalign=0)
776.3.14 by Curtis Hovey
revise init for clarity.
63
        self._progress_widget = ProgressPanel()
724 by Jelmer Vernooij
Fix formatting, imports.
64
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
65
        # Set callbacks
776.3.14 by Curtis Hovey
revise init for clarity.
66
        ui.ui_factory.set_progress_bar_widget(self._progress_widget)
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
67
        self.connect('close', self._on_close_clicked)
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
68
        self._button_push.connect('clicked', self._on_push_clicked)
724 by Jelmer Vernooij
Fix formatting, imports.
69
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
70
        # Set properties
776.3.15 by Curtis Hovey
Follow GNOME HIG.
71
        content_area = self.get_content_area()
72
        content_area.set_spacing(6)
724 by Jelmer Vernooij
Fix formatting, imports.
73
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
74
        # Pack widgets
776.3.14 by Curtis Hovey
revise init for clarity.
75
        self._hbox_location.pack_start(self._label_location, False, False, 0)
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
76
        self._hbox_location.pack_start(self._combo, False, False, 0)
776.3.15 by Curtis Hovey
Follow GNOME HIG.
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)
776.3.14 by Curtis Hovey
revise init for clarity.
80
        self.get_action_area().pack_end(self._button_push, True, True, 0)
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
81
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
82
        # Show the dialog
776.3.15 by Curtis Hovey
Follow GNOME HIG.
83
        content_area.show_all()
776.3.6 by Curtis Hovey
Added tests for push __init__.
84
        self._progress_widget.hide()
85
        self._push_message.hide()
724 by Jelmer Vernooij
Fix formatting, imports.
86
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
87
        # Build location history
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
88
        self._history = UrlHistory(self.branch.get_config(), 'push_history')
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
89
        self._build_history()
724 by Jelmer Vernooij
Fix formatting, imports.
90
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
91
    def _build_history(self):
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
92
        """Build up the location history. """
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
93
        self._combo_model = Gtk.ListStore(str)
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
94
        for item in self._history.get_entries():
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
95
            self._combo_model.append([item])
154 by Jelmer Vernooij
Add trivial generic class for storing URL history.
96
        self._combo.set_model(self._combo_model)
734.1.14 by Curtis Hovey
Updated gpush to gtk3.
97
        self._combo.set_entry_text_column(0)
724 by Jelmer Vernooij
Fix formatting, imports.
98
227 by Jelmer Vernooij
Add push item in revision menu, clean up push code.
99
        if self.branch is not None:
100
            location = self.branch.get_push_location()
101
            if location is not None:
102
                self._combo.get_child().set_text(location)
724 by Jelmer Vernooij
Fix formatting, imports.
103
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
104
    def _on_close_clicked(self, widget):
105
        """Close dialog handler."""
106
        ui.ui_factory.set_progress_bar_widget(None)
107
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
108
    @show_bzr_error
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
109
    def _on_push_clicked(self, widget):
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
110
        """Push button clicked handler. """
776.3.6 by Curtis Hovey
Added tests for push __init__.
111
        self._push_message.hide()
112
        self._progress_widget.tick()
126.1.19 by Szilveszter Farkas (Phanatic)
Refactored the Push dialog. Add 'gpush' command.
113
        location = self._combo.get_child().get_text()
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
114
115
        try:
776.3.9 by Curtis Hovey
Added a simple test for _on_push_clicked.
116
            message = do_push(self.branch, location, overwrite=False)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
117
        except errors.DivergedBranches:
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
118
            response = question_dialog(
119
                _i18n('Branches have been diverged'),
120
                _i18n('You cannot push if branches have diverged.\n'
121
                      'Overwrite?'))
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
122
            if response == Gtk.ResponseType.YES:
776.3.9 by Curtis Hovey
Added a simple test for _on_push_clicked.
123
                message = do_push(self.branch, location, overwrite=True)
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
124
            else:
125
                return
126
        self._history.add_entry(location)
127
        if (self.branch is not None
128
            and self.branch.get_push_location() is None):
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
129
            self.branch.set_push_location(location)
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
130
        if message:
776.3.6 by Curtis Hovey
Added tests for push __init__.
131
            self._progress_widget.finished()
132
            self._push_message.props.label = message
133
            self._push_message.show()
776.3.9 by Curtis Hovey
Added a simple test for _on_push_clicked.
134
135
776.3.14 by Curtis Hovey
revise init for clarity.
136
def do_push(br_from, location, overwrite):
729.1.1 by Jelmer Vernooij
Move i18n support to a separate file, so gettext files aren't loaded unless bzr-gtk is used.
137
    """Update a mirror of a branch.
724 by Jelmer Vernooij
Fix formatting, imports.
138
228 by Jelmer Vernooij
Remove unused code, prefer questions to check boxes.
139
    :param br_from: the source branch
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
140
    :param location: the location of the branch that you'd like to update
141
    :param overwrite: overwrite target location if it diverged
142
    :return: number of revisions pushed
143
    """
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
144
    revision_id = None
145
    to_transport = get_transport(location)
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
146
    try:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
147
        dir_to = ControlDir.open_from_transport(to_transport)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
148
    except errors.NotBranchError:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
149
        dir_to = None
150
151
    if dir_to is None:
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
152
        try:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
153
            br_to = br_from.create_clone_on_transport(
154
                to_transport, revision_id=revision_id)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
155
        except errors.NoSuchFile:
776.3.2 by Curtis Hovey
Merged previous UI work from progressbar.
156
            response = question_dialog(
157
                _i18n('Non existing parent directory'),
158
                _i18n("The parent directory (%s)\ndoesn't exist. Create?") %
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
159
                    location)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
160
            if response == Gtk.ResponseType.OK:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
161
                br_to = br_from.create_clone_on_transport(
162
                    to_transport, revision_id=revision_id, create_prefix=True)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
163
            else:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
164
                return _i18n("Push aborted.")
165
        push_result = create_push_result(br_from, br_to)
776.2.1 by Curtis Hovey
Merged UI work from progressbar branch.
166
    else:
776.3.21 by Curtis Hovey
Replace do_push with a method based on bzrlib.push.
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