412
412
differences between two revisions on a branch.
415
def __init__(self, parent=None):
415
def __init__(self, parent=None, operations=None):
416
416
Window.__init__(self, parent)
417
417
self.set_border_width(0)
418
418
self.set_title("bzrk diff")
444
444
:return: None, meaning that no button bar will be used.
446
if self.operations is None:
448
hbox = gtk.HButtonBox()
449
hbox.set_layout(gtk.BUTTONBOX_START)
450
for title, method in self.operations:
451
merge_button = gtk.Button(title)
453
merge_button.set_relief(gtk.RELIEF_NONE)
454
merge_button.connect("clicked", method)
455
hbox.pack_start(merge_button, expand=False, fill=True)
459
def _get_merge_target(self):
460
d = gtk.FileChooserDialog('Merge branch', self,
461
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
462
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
464
gtk.RESPONSE_CANCEL,))
467
if result != gtk.RESPONSE_OK:
468
raise SelectCancelled()
469
return d.get_current_folder_uri()
473
def _get_save_path(self, basename):
474
d = gtk.FileChooserDialog('Save As', self,
475
gtk.FILE_CHOOSER_ACTION_SAVE,
476
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
478
gtk.RESPONSE_CANCEL,))
479
d.set_current_name(basename)
482
if result != gtk.RESPONSE_OK:
483
raise SelectCancelled()
484
return urlutils.local_path_from_url(d.get_uri())
448
488
def set_diff_text(self, description, lines):
449
489
"""Set the diff from a text.
467
507
self.diff.set_file(file_path)
470
class MergeDirectiveController(object):
472
def __init__(self, directive, path):
510
class DiffController(object):
512
def __init__(self, path, patch, window=None):
517
window = DiffWindow(operations=self._provide_operations())
518
self.initialize_window(window)
520
def initialize_window(self, window):
522
window.set_diff_text(self.path, self.patch)
524
def perform_save(self, window):
526
save_path = self.window._get_save_path(osutils.basename(self.path))
527
except SelectCancelled:
529
source = open(self.path, 'rb')
531
target = open(save_path, 'wb')
533
osutils.pumpfile(source, target)
539
def _provide_operations(self):
540
return [('Save', self.perform_save)]
543
class MergeDirectiveController(DiffController):
545
def __init__(self, path, directive):
546
DiffController.__init__(self, path, directive.patch.splitlines(True))
473
547
self.directive = directive
475
548
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
550
def _provide_operations(self):
487
551
return [('Merge', self.perform_merge), ('Save', self.perform_save)]
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)
555
def _get_merge_target(self):
556
d = gtk.FileChooserDialog('Merge branch', self,
557
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
558
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
560
gtk.RESPONSE_CANCEL,))
563
if result != gtk.RESPONSE_OK:
564
raise SelectCancelled()
565
return d.get_current_folder_uri()
569
def _get_save_path(self, basename):
570
d = gtk.FileChooserDialog('Save As', self,
571
gtk.FILE_CHOOSER_ACTION_SAVE,
572
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
574
gtk.RESPONSE_CANCEL,))
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())
585
585
def iter_changes_to_status(source, target):
586
586
"""Determine the differences between trees.