467
467
self.diff.set_file(file_path)
470
class MergeDirectiveWindow(DiffWindow):
470
class MergeDirectiveController(object):
472
472
def __init__(self, directive, path):
473
DiffWindow.__init__(self, None)
474
self._merge_target = None
475
473
self.directive = directive
478
def _get_button_bar(self):
479
"""The button bar has only the Merge button"""
480
merge_button = gtk.Button('Merge')
482
merge_button.set_relief(gtk.RELIEF_NONE)
483
merge_button.connect("clicked", self.perform_merge)
485
save_button = gtk.Button('Save')
487
save_button.set_relief(gtk.RELIEF_NONE)
488
save_button.connect("clicked", self.perform_save)
490
hbox = gtk.HButtonBox()
491
hbox.set_layout(gtk.BUTTONBOX_START)
492
hbox.pack_start(merge_button, expand=False, fill=True)
493
hbox.pack_start(save_button, expand=False, fill=True)
475
self.merge_target = None
479
def for_gtk(directive, path):
480
controller = MergeDirectiveController(directive, path)
481
window = MergeDirectiveWindow(controller._provide_operations())
482
controller.window = window
483
window.set_diff_text(path, directive.patch.splitlines(True))
486
def _provide_operations(self):
487
return [('Merge', self.perform_merge), ('Save', self.perform_save)]
497
489
def perform_merge(self, window):
499
tree = self._get_merge_target()
500
except SelectCancelled:
490
if self.merge_target is None:
492
self.merge_target = self.window._get_merge_target()
493
except SelectCancelled:
495
tree = workingtree.WorkingTree.open(self.merge_target)
502
496
tree.lock_write()
517
511
warning_dialog(_('Conflicts encountered'),
518
512
_('Please resolve the conflicts manually'
519
513
' before committing.'))
514
self.window.destroy()
521
515
except Exception, e:
522
516
error_dialog('Error', str(e))
520
def perform_save(self, window):
522
save_path = self.window._get_save_path(osutils.basename(self.path))
523
except SelectCancelled:
525
source = open(self.path, 'rb')
527
target = open(save_path, 'wb')
529
osutils.pumpfile(source, target)
536
class MergeDirectiveWindow(DiffWindow):
538
def __init__(self, operations):
539
self.operations = operations
540
DiffWindow.__init__(self, None)
542
def _get_button_bar(self):
543
"""The button bar has only the Merge button"""
544
hbox = gtk.HButtonBox()
545
hbox.set_layout(gtk.BUTTONBOX_START)
546
for title, method in self.operations:
547
merge_button = gtk.Button(title)
549
merge_button.set_relief(gtk.RELIEF_NONE)
550
merge_button.connect("clicked", method)
551
hbox.pack_start(merge_button, expand=False, fill=True)
526
555
def _get_merge_target(self):
527
if self._merge_target is not None:
528
return self._merge_target
529
556
d = gtk.FileChooserDialog('Merge branch', self,
530
557
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
531
558
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
536
563
if result != gtk.RESPONSE_OK:
537
564
raise SelectCancelled()
538
uri = d.get_current_folder_uri()
565
return d.get_current_folder_uri()
541
return workingtree.WorkingTree.open(uri)
543
def perform_save(self, window):
569
def _get_save_path(self, basename):
544
570
d = gtk.FileChooserDialog('Save As', self,
545
571
gtk.FILE_CHOOSER_ACTION_SAVE,
546
572
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
547
573
gtk.STOCK_CANCEL,
548
574
gtk.RESPONSE_CANCEL,))
549
d.set_current_name(osutils.basename(self.path))
553
if result != gtk.RESPONSE_OK:
554
raise SelectCancelled()
558
except SelectCancelled:
560
source = open(self.path, 'rb')
562
target = open(urlutils.local_path_from_url(uri), 'wb')
564
target.write(source.read())
575
d.set_current_name(basename)
578
if result != gtk.RESPONSE_OK:
579
raise SelectCancelled()
580
return urlutils.local_path_from_url(d.get_uri())
571
585
def iter_changes_to_status(source, target):