14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
from gi.repository import Gtk
20
from gi.repository import GObject
28
22
from bzrlib.config import GlobalConfig
30
from dialog import error_dialog, warning_dialog
31
from errors import show_bzr_error
33
class ConflictsDialog(gtk.Dialog):
23
from bzrlib.plugins.gtk.i18n import _i18n
24
from bzrlib.plugins.gtk.dialog import (
30
class ConflictsDialog(Gtk.Dialog):
34
31
""" This dialog displays the list of conflicts. """
35
33
def __init__(self, wt, parent=None):
36
34
""" Initialize the Conflicts dialog. """
37
gtk.Dialog.__init__(self, title="Conflicts - Olive",
40
buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL))
35
super(ConflictsDialog, self).__init__(
36
title="Conflicts - Olive", parent=parent, flags=0,
37
buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CANCEL))
45
42
# Create the widgets
46
self._scrolledwindow = gtk.ScrolledWindow()
47
self._treeview = gtk.TreeView()
48
self._label_diff3 = gtk.Label(_("External utility:"))
49
self._entry_diff3 = gtk.Entry()
50
self._image_diff3 = gtk.Image()
51
self._button_diff3 = gtk.Button()
52
self._hbox_diff3 = gtk.HBox()
43
self._scrolledwindow = Gtk.ScrolledWindow()
44
self._treeview = Gtk.TreeView()
45
self._label_diff3 = Gtk.Label(label=_i18n("External utility:"))
46
self._entry_diff3 = Gtk.Entry()
47
self._image_diff3 = Gtk.Image()
48
self._button_diff3 = Gtk.Button()
49
self._hbox_diff3 = Gtk.HBox()
55
52
self._button_diff3.connect('clicked', self._on_diff3_clicked)
58
self._scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
60
self._image_diff3.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON)
55
self._scrolledwindow.set_policy(Gtk.PolicyType.AUTOMATIC,
56
Gtk.PolicyType.AUTOMATIC)
57
self._image_diff3.set_from_stock(Gtk.STOCK_APPLY, Gtk.IconSize.BUTTON)
61
58
self._button_diff3.set_image(self._image_diff3)
62
59
self._entry_diff3.set_text(self._get_diff3())
63
60
self._hbox_diff3.set_spacing(3)
64
self.vbox.set_spacing(3)
61
content_area = self.get_content_area()
62
content_area.set_spacing(3)
65
63
self.set_default_size(400, 300)
68
self._hbox_diff3.pack_start(self._label_diff3, False, False)
69
self._hbox_diff3.pack_start(self._entry_diff3, True, True)
70
self._hbox_diff3.pack_start(self._button_diff3, False, False)
66
self._hbox_diff3.pack_start(self._label_diff3, False, False, 0)
67
self._hbox_diff3.pack_start(self._entry_diff3, True, True, 0)
68
self._hbox_diff3.pack_start(self._button_diff3, False, False, 0)
71
69
self._scrolledwindow.add(self._treeview)
72
self.vbox.pack_start(self._scrolledwindow, True, True)
73
self.vbox.pack_start(self._hbox_diff3, False, False)
70
content_area.pack_start(self._scrolledwindow, True, True, 0)
71
content_area.pack_start(self._hbox_diff3, False, False, 0)
75
73
# Create the conflict list
76
74
self._create_conflicts()
77
content_area.show_all()
81
79
def _get_diff3(self):
82
80
""" Get the specified diff3 utility. Default is meld. """
83
81
config = GlobalConfig()
89
87
def _set_diff3(self, cmd):
90
88
""" Set the default diff3 utility to cmd. """
91
89
config = GlobalConfig()
92
90
config.set_user_option('gconflicts_diff3', cmd)
94
92
def _create_conflicts(self):
95
93
""" Construct the list of conflicts. """
96
94
if len(self.wt.conflicts()) == 0:
97
self.model = gtk.ListStore(gobject.TYPE_STRING)
95
self.model = Gtk.ListStore(GObject.TYPE_STRING)
98
96
self._treeview.set_model(self.model)
99
self._treeview.append_column(gtk.TreeViewColumn(_('Conflicts'),
100
gtk.CellRendererText(), text=0))
101
self._treeview.set_headers_visible(False)
102
self.model.append([ _("No conflicts in working tree.") ])
97
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Conflicts'),
98
Gtk.CellRendererText(), text=0))
99
self._treeview.set_headers_visible(False)
100
self.model.append([ _i18n("No conflicts in working tree.") ])
101
self._button_diff3.set_sensitive(False)
104
self.model = gtk.ListStore(gobject.TYPE_STRING,
103
self.model = Gtk.ListStore(GObject.TYPE_STRING,
107
106
self._treeview.set_model(self.model)
108
self._treeview.append_column(gtk.TreeViewColumn(_('Path'),
109
gtk.CellRendererText(), text=0))
110
self._treeview.append_column(gtk.TreeViewColumn(_('Type'),
111
gtk.CellRendererText(), text=1))
107
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Path'),
108
Gtk.CellRendererText(), text=0))
109
self._treeview.append_column(Gtk.TreeViewColumn(_i18n('Type'),
110
Gtk.CellRendererText(), text=1))
112
111
self._treeview.set_search_column(0)
113
112
for conflict in self.wt.conflicts():
114
113
if conflict.typestring == 'path conflict':
115
t = _("path conflict")
114
t = _i18n("path conflict")
116
115
elif conflict.typestring == 'contents conflict':
117
t = _("contents conflict")
116
t = _i18n("contents conflict")
118
117
elif conflict.typestring == 'text conflict':
119
t = _("text conflict")
118
t = _i18n("text conflict")
120
119
elif conflict.typestring == 'duplicate id':
121
t = _("duplicate id")
120
t = _i18n("duplicate id")
122
121
elif conflict.typestring == 'duplicate':
122
t = _i18n("duplicate")
124
123
elif conflict.typestring == 'parent loop':
124
t = _i18n("parent loop")
126
125
elif conflict.typestring == 'unversioned parent':
127
t = _("unversioned parent")
126
t = _i18n("unversioned parent")
128
127
elif conflict.typestring == 'missing parent':
129
t = _("missing parent")
128
t = _i18n("missing parent")
130
129
elif conflict.typestring == 'deleting parent':
131
t = _("deleting parent")
130
t = _i18n("deleting parent")
133
t = _("unknown type of conflict")
135
self.model.append([ conflict.path, t, conflict.typestring ])
132
t = _i18n("unknown type of conflict")
134
self.model.append([ conflict.path, t, conflict.typestring ])
137
136
def _get_selected_file(self):
138
137
""" Return the selected conflict's filename. """
139
138
treeselection = self._treeview.get_selection()
140
139
(model, iter) = treeselection.get_selected()
145
144
return model.get_value(iter, 0)
147
146
def _get_selected_type(self):
148
147
""" Return the type of the selected conflict. """
149
148
treeselection = self._treeview.get_selection()
150
149
(model, iter) = treeselection.get_selected()
155
154
return model.get_value(iter, 2)
157
156
def _on_diff3_clicked(self, widget):
158
157
""" Launch external utility to resolve conflicts. """
159
158
self._set_diff3(self._entry_diff3.get_text())
160
159
selected = self._get_selected_file()
161
160
if selected is None:
162
error_dialog(_('No file was selected'),
163
_('Please select a file from the list.'))
161
error_dialog(_i18n('No file was selected'),
162
_i18n('Please select a file from the list.'))
165
164
elif self._get_selected_type() == 'text conflict':
166
165
base = self.wt.abspath(selected) + '.BASE'
167
166
this = self.wt.abspath(selected) + '.THIS'
168
167
other = self.wt.abspath(selected) + '.OTHER'
169
os.system(self._entry_diff3.get_text() + ' ' + base + ' ' + this + ' ' + other)
169
p = subprocess.Popen([ self._entry_diff3.get_text(), base, this, other ])
172
warning_dialog(_i18n('Call to external utility failed'), str(e))
171
warning_dialog(_('Cannot resolve conflict'),
172
_('Only conflicts on the text of files can be resolved with Olive at the moment. Content conflicts, on the structure of the tree, need to be resolved using the command line.'))
174
warning_dialog(_i18n('Cannot resolve conflict'),
175
_i18n('Only conflicts on the text of files can be resolved with Olive at the moment. Content conflicts, on the structure of the tree, need to be resolved using the command line.'))