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
22
28
from bzrlib.config import GlobalConfig
23
from bzrlib.plugins.gtk.i18n import _i18n
24
from bzrlib.plugins.gtk.dialog import (
30
class ConflictsDialog(Gtk.Dialog):
30
from dialog import error_dialog, warning_dialog
31
from errors import show_bzr_error
33
class ConflictsDialog(gtk.Dialog):
31
34
""" This dialog displays the list of conflicts. """
33
35
def __init__(self, wt, parent=None):
34
36
""" Initialize the Conflicts dialog. """
35
super(ConflictsDialog, self).__init__(
36
title="Conflicts - Olive", parent=parent, flags=0,
37
buttons=(Gtk.STOCK_CLOSE, Gtk.ResponseType.CANCEL))
37
gtk.Dialog.__init__(self, title="Conflicts - Olive",
40
buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL))
42
45
# Create the widgets
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()
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()
52
55
self._button_diff3.connect('clicked', self._on_diff3_clicked)
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)
58
self._scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
60
self._image_diff3.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON)
58
61
self._button_diff3.set_image(self._image_diff3)
59
62
self._entry_diff3.set_text(self._get_diff3())
60
63
self._hbox_diff3.set_spacing(3)
61
content_area = self.get_content_area()
62
content_area.set_spacing(3)
64
self.vbox.set_spacing(3)
63
65
self.set_default_size(400, 300)
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)
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)
69
71
self._scrolledwindow.add(self._treeview)
70
content_area.pack_start(self._scrolledwindow, True, True, 0)
71
content_area.pack_start(self._hbox_diff3, False, False, 0)
72
self.vbox.pack_start(self._scrolledwindow, True, True)
73
self.vbox.pack_start(self._hbox_diff3, False, False)
73
75
# Create the conflict list
74
76
self._create_conflicts()
77
content_area.show_all()
79
81
def _get_diff3(self):
80
82
""" Get the specified diff3 utility. Default is meld. """
81
83
config = GlobalConfig()
87
89
def _set_diff3(self, cmd):
88
90
""" Set the default diff3 utility to cmd. """
89
91
config = GlobalConfig()
90
92
config.set_user_option('gconflicts_diff3', cmd)
92
94
def _create_conflicts(self):
93
95
""" Construct the list of conflicts. """
94
96
if len(self.wt.conflicts()) == 0:
95
self.model = Gtk.ListStore(GObject.TYPE_STRING)
97
self.model = gtk.ListStore(gobject.TYPE_STRING)
96
98
self._treeview.set_model(self.model)
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)
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.") ])
103
self.model = Gtk.ListStore(GObject.TYPE_STRING,
104
self.model = gtk.ListStore(gobject.TYPE_STRING,
106
107
self._treeview.set_model(self.model)
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))
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))
111
112
self._treeview.set_search_column(0)
112
113
for conflict in self.wt.conflicts():
113
114
if conflict.typestring == 'path conflict':
114
t = _i18n("path conflict")
115
t = _("path conflict")
115
116
elif conflict.typestring == 'contents conflict':
116
t = _i18n("contents conflict")
117
t = _("contents conflict")
117
118
elif conflict.typestring == 'text conflict':
118
t = _i18n("text conflict")
119
t = _("text conflict")
119
120
elif conflict.typestring == 'duplicate id':
120
t = _i18n("duplicate id")
121
t = _("duplicate id")
121
122
elif conflict.typestring == 'duplicate':
122
t = _i18n("duplicate")
123
124
elif conflict.typestring == 'parent loop':
124
t = _i18n("parent loop")
125
126
elif conflict.typestring == 'unversioned parent':
126
t = _i18n("unversioned parent")
127
t = _("unversioned parent")
127
128
elif conflict.typestring == 'missing parent':
128
t = _i18n("missing parent")
129
t = _("missing parent")
129
130
elif conflict.typestring == 'deleting parent':
130
t = _i18n("deleting parent")
131
t = _("deleting parent")
132
t = _i18n("unknown type of conflict")
134
self.model.append([ conflict.path, t, conflict.typestring ])
133
t = _("unknown type of conflict")
135
self.model.append([ conflict.path, t, conflict.typestring ])
136
137
def _get_selected_file(self):
137
138
""" Return the selected conflict's filename. """
138
139
treeselection = self._treeview.get_selection()
139
140
(model, iter) = treeselection.get_selected()
144
145
return model.get_value(iter, 0)
146
147
def _get_selected_type(self):
147
148
""" Return the type of the selected conflict. """
148
149
treeselection = self._treeview.get_selection()
149
150
(model, iter) = treeselection.get_selected()
154
155
return model.get_value(iter, 2)
156
157
def _on_diff3_clicked(self, widget):
157
158
""" Launch external utility to resolve conflicts. """
158
159
self._set_diff3(self._entry_diff3.get_text())
159
160
selected = self._get_selected_file()
160
161
if selected is None:
161
error_dialog(_i18n('No file was selected'),
162
_i18n('Please select a file from the list.'))
162
error_dialog(_('No file was selected'),
163
_('Please select a file from the list.'))
164
165
elif self._get_selected_type() == 'text conflict':
165
166
base = self.wt.abspath(selected) + '.BASE'
166
167
this = self.wt.abspath(selected) + '.THIS'
167
168
other = self.wt.abspath(selected) + '.OTHER'
169
p = subprocess.Popen([ self._entry_diff3.get_text(), base, this, other ])
172
warning_dialog(_i18n('Call to external utility failed'), str(e))
169
os.system(self._entry_diff3.get_text() + ' ' + base + ' ' + this + ' ' + other)
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.'))
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.'))