30
30
except ImportError:
33
from bzrlib import osutils
33
from bzrlib import merge as _mod_merge, osutils, progress, workingtree
34
34
from bzrlib.diff import show_diff_trees, internal_diff
35
35
from bzrlib.errors import NoSuchFile
36
36
from bzrlib.patches import parse_patches
37
37
from bzrlib.trace import warning
38
38
from bzrlib.plugins.gtk.window import Window
39
from dialog import error_dialog
42
class SelectCancelled(Exception):
41
47
class DiffFileView(gtk.ScrolledWindow):
425
431
class MergeDirectiveWindow(DiffWindow):
433
def __init__(self, directive, parent=None):
434
DiffWindow.__init__(self, parent)
435
self._merge_target = None
436
self.directive = directive
427
438
def _get_button_bar(self):
428
439
merge_button = gtk.Button('Merge')
429
440
merge_button.show()
430
441
merge_button.set_relief(gtk.RELIEF_NONE)
442
merge_button.connect("clicked", self.perform_merge)
431
444
hbox = gtk.HButtonBox()
432
445
hbox.set_layout(gtk.BUTTONBOX_START)
433
446
hbox.pack_start(merge_button, expand=False, fill=True)
450
def perform_merge(self, window):
452
tree = self._get_merge_target()
453
except SelectCancelled:
458
merger, verified = _mod_merge.Merger.from_mergeable(tree,
459
self.directive, progress.DummyProgress())
460
merger.check_basis(True)
461
merger.merge_type = _mod_merge.Merge3Merger
463
conflict_count = merger.do_merge()
466
error_dialog('Error', str(e))
470
def _get_merge_target(self):
471
if self._merge_target is not None:
472
return self._merge_target
473
d = gtk.FileChooserDialog('Merge branch', self,
474
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
475
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
477
gtk.RESPONSE_CANCEL,))
480
if result == gtk.RESPONSE_OK:
481
uri = d.get_current_folder_uri()
482
return workingtree.WorkingTree.open(uri)
484
raise SelectCancelled()
438
489
def _iter_changes_to_status(source, target):
439
490
"""Determine the differences between trees.