/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 merge.py

  • Committer: Curtis Hovey
  • Date: 2011-09-03 01:25:04 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110903012504-0jr4diz9033g5df2
Menu fixes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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
import os
 
18
 
 
19
from gi.repository import GObject
 
20
from gi.repository import Gtk
 
21
 
 
22
from bzrlib.branch import Branch
 
23
import bzrlib.errors as errors
 
24
 
 
25
from bzrlib.plugins.gtk import icon_path
 
26
from bzrlib.plugins.gtk.dialog import (
 
27
    error_dialog,
 
28
    info_dialog,
 
29
    warning_dialog,
 
30
    )
 
31
from bzrlib.plugins.gtk.errors import show_bzr_error
 
32
from bzrlib.plugins.gtk.i18n import _i18n
 
33
 
 
34
 
 
35
class MergeDialog(Gtk.Dialog):
 
36
    """ Display the Merge dialog and perform the needed actions. """
 
37
    
 
38
    def __init__(self, wt, wtpath, default_branch_path=None, parent=None):
 
39
        """ Initialize the Merge dialog. """
 
40
        Gtk.Dialog.__init__(self, title="Merge changes",
 
41
                                  parent=parent,
 
42
                                  flags=0,
 
43
                                  buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
 
44
        self.set_icon_from_file(icon_path("bzr-icon-64.png"))
 
45
        # Get arguments
 
46
        self.wt = wt
 
47
        self.wtpath = wtpath
 
48
        self.default_branch_path = default_branch_path
 
49
        self.parent_window = parent
 
50
        
 
51
        # Create widgets
 
52
        self._hbox = Gtk.HBox()
 
53
        self._source = Gtk.HBox()
 
54
        self._label_merge_from = Gtk.Label(label=_i18n("Merge from"))
 
55
        self._combo_source = Gtk.ComboBoxText()
 
56
        for entry in [_i18n("Folder"),_i18n("Custom Location")]:
 
57
            self._combo_source.append_text(entry)
 
58
        self._combo_source.connect("changed", self._on_combo_changed)
 
59
        self._button_merge = Gtk.Button(_i18n("_Merge"))
 
60
        self._button_merge_icon = Gtk.Image()
 
61
        self._button_merge_icon.set_from_stock(Gtk.STOCK_APPLY, Gtk.IconSize.BUTTON)
 
62
        self._button_merge.set_image(self._button_merge_icon)
 
63
        self._button_merge.connect('clicked', self._on_merge_clicked)
 
64
        
 
65
        # Add widgets to dialog
 
66
        self.get_content_area().pack_start(self._hbox, False, False, 0)
 
67
        self._hbox.add(self._label_merge_from)
 
68
        self._hbox.add(self._combo_source)
 
69
        self._hbox.set_spacing(5)
 
70
        self.action_area.pack_end(self._button_merge)
 
71
        
 
72
        if self.default_branch_path and os.path.isdir(
 
73
                            self.default_branch_path.partition('file://')[2]):
 
74
            self.directory = self.default_branch_path.partition('file://')[2]
 
75
            self._combo_source.set_active(0)
 
76
        elif self.default_branch_path:
 
77
            self._combo_source.set_active(1)
 
78
        else:
 
79
            # If no default_branch_path give, default to folder source with current folder
 
80
            self._combo_source.set_active(0)
 
81
        self.get_content_area().show_all()
 
82
    
 
83
    def _on_folder_source(self):
 
84
        """ Merge from folder, create a filechooser dialog and button """
 
85
        self._source = Gtk.HBox()
 
86
        self._filechooser_dialog = Gtk.FileChooserDialog(title="Please select a folder",
 
87
                                    parent=self.parent_window,
 
88
                                    action=Gtk.FileChooserAction.SELECT_FOLDER,
 
89
                                    buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
 
90
                                             Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
 
91
        self._filechooser_dialog.set_default_response(Gtk.ResponseType.OK)
 
92
        self._filechooser = Gtk.FileChooserButton(self._filechooser_dialog)
 
93
        self._filechooser.show()
 
94
        directory = getattr(self, 'directory', None)
 
95
        if not directory:
 
96
            directory = os.path.dirname(self.wt.abspath(self.wtpath))
 
97
        self._filechooser_dialog.set_current_folder(directory)
 
98
        self._source.pack_start(self._filechooser, True, True, 0)
 
99
        self.get_content_area().pack_start(self._source, True, True, 5)
 
100
        self._source.show()
 
101
    
 
102
    def _on_custom_source(self):
 
103
        """ Merge from a custom source (can be folder, remote, etc), create entry """
 
104
        self._source = Gtk.HBox()
 
105
        self._custom_entry = Gtk.Entry()
 
106
        if self.default_branch_path:
 
107
            self._custom_entry.set_text(self.default_branch_path)
 
108
        self._custom_entry.connect("activate", self._on_merge_clicked)
 
109
        self._custom_entry.show()
 
110
        self._source.pack_start(self._custom_entry, True, True, 0)
 
111
        self.get_content_area().pack_start(self._source, True, True, 5)
 
112
        self._source.show()
 
113
    
 
114
    def _on_combo_changed(self, widget):
 
115
        merge_source = self._combo_source.get_active()
 
116
        self._source.destroy()
 
117
        if merge_source == 0:
 
118
            # Merge from folder
 
119
            self._on_folder_source()
 
120
        elif merge_source == 1:
 
121
            # Merge from custom
 
122
            self._on_custom_source()
 
123
    
 
124
    @show_bzr_error
 
125
    def _on_merge_clicked(self, widget):
 
126
        merge_source = self._combo_source.get_active()
 
127
        if merge_source == 0:
 
128
            branch = self._filechooser.get_filename()
 
129
        elif merge_source == 1:
 
130
            branch = self._custom_entry.get_text()
 
131
        if branch == "":
 
132
            error_dialog(_i18n('Branch not given'),
 
133
                         _i18n('Please specify a branch to merge from.'))
 
134
            return
 
135
 
 
136
        other_branch = Branch.open_containing(branch)[0]
 
137
 
 
138
        try:
 
139
            conflicts = self.wt.merge_from_branch(other_branch)
 
140
        except errors.BzrCommandError, errmsg:
 
141
            error_dialog(_i18n('Bazaar command error'), str(errmsg))
 
142
            return
 
143
        
 
144
        if conflicts == 0:
 
145
            # No conflicts found.
 
146
            info_dialog(_i18n('Merge successful'),
 
147
                        _i18n('All changes applied successfully.'))
 
148
        else:
 
149
            # There are conflicts to be resolved.
 
150
            warning_dialog(_i18n('Conflicts encountered'),
 
151
                           _i18n('Please resolve the conflicts manually before committing.'))
 
152
        
 
153
        self.response(Gtk.ResponseType.OK)