Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.7, 0.7.1, and 0.7.2

status: when merging, show diffs to both parents

* Disable shelving
* Show diffs in simple TextView, no chunk selection
* Hide file selection toggles

Changeset ae4759a7254b

Parent 96dd1d5e55fb

by Steve Borho

Changes to 2 files · Browse files at ae4759a7254b Showing diff from parent 96dd1d5e55fb Diff from another changeset...

Change 1 of 1 Show Entire File hggtk/​commit.py Stacked
 
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
 
213
214
215
 
 
216
217
218
219
220
 
 
 
221
222
223
@@ -213,16 +213,11 @@
  def _check_merge(self):   # disable the checkboxes on the filelist if repo in merging state   merged = len(self.repo.changectx(None).parents()) > 1 - cbcell = self.tree.get_column(0).get_cell_renderers()[0] - cbcell.set_property("activatable", not merged)     self.get_toolbutton('Re_vert').set_sensitive(not merged)   self.get_toolbutton('_Add').set_sensitive(not merged)   self.get_toolbutton('_Remove').set_sensitive(not merged)   self.get_toolbutton('Move').set_sensitive(not merged) - self.tree.set_sensitive(not merged) - # Allow chunk selection for shelving - #self.diff_tree.set_sensitive(not merged)     if merged:   # select all changes if repo is merged
Change 1 of 9 Show Entire File hggtk/​status.py Stacked
 
247
248
249
250
251
252
253
254
255
 
263
264
265
266
 
267
268
269
 
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
333
334
 
662
663
664
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
665
666
667
 
680
681
682
 
683
684
685
 
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
 
796
797
798
 
 
799
800
801
 
814
815
816
817
 
 
 
 
 
 
818
819
820
821
822
 
823
824
825
826
827
 
837
838
839
840
 
841
842
843
 
 
 
 
 
 
844
845
846
847
848
 
247
248
249
 
 
 
250
251
252
 
260
261
262
 
263
264
265
266
 
303
304
305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
 
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
 
743
744
745
746
747
748
749
 
775
776
777
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
778
779
780
 
831
832
833
834
835
836
837
838
 
851
852
853
 
854
855
856
857
858
859
860
861
862
863
 
864
865
 
866
867
868
 
878
879
880
 
881
882
883
 
884
885
886
887
888
889
890
 
891
892
893
@@ -247,9 +247,6 @@
  self.tree.set_reorderable(False)   self.tree.set_enable_search(True)   self.tree.set_search_column(2) - self.tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) - self.tree.get_selection().connect('changed', - self._tree_selection_changed, False)   if hasattr(self.tree, 'set_rubber_banding'):   self.tree.set_rubber_banding(True)   self.tree.modify_font(pango.FontDescription(self.fontlist)) @@ -263,7 +260,7 @@
  stat_cell = gtk.CellRendererText()     self.selcb = None - if self.count_revs() < 2: + if self.count_revs() < 2 and len(self.repo.changectx(None).parents()) == 1:   col0 = gtk.TreeViewColumn('', toggle_cell)   col0.add_attribute(toggle_cell, 'active', 0)   #col0.set_sort_column_id(0) @@ -306,29 +303,42 @@
  scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   diff_frame.add(scroller)   - # use treeview to diff hunks - self.diff_model = gtk.ListStore(bool, str, bool, bool, int) - self.diff_tree = gtk.TreeView(self.diff_model) - self.diff_tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) - self.diff_tree.modify_font(pango.FontDescription(self.fontlist)) - self.diff_tree.set_property('enable-grid-lines', True) - self.diff_tree.connect('row-activated', - self._diff_tree_row_act) - self.diff_tree.connect('button-press-event', - self._diff_tree_button_press) - self.diff_tree.set_enable_search(False) - - diff_hunk_cell = gtk.CellRendererText() - diff_hunk_cell.set_property('cell-background', '#EEEEEE') - diffcol = gtk.TreeViewColumn('diff', diff_hunk_cell, - strikethrough=DM_REJECTED, - markup=DM_CHUNK_TEXT, - strikethrough_set=DM_NOT_HEADER_CHUNK, - cell_background_set=DM_HEADER_CHUNK) - diffcol.set_resizable(True) - self.diff_tree.append_column(diffcol) - - scroller.add(self.diff_tree) + if self.count_revs() == 2 or len(self.repo.changectx(None).parents()) == 1: + # use treeview to diff hunks + self.diff_model = gtk.ListStore(bool, str, bool, bool, int) + self.diff_tree = gtk.TreeView(self.diff_model) + self.diff_tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.diff_tree.modify_font(pango.FontDescription(self.fontlist)) + self.diff_tree.set_headers_visible(False) + self.diff_tree.set_property('enable-grid-lines', True) + self.diff_tree.connect('row-activated', + self._diff_tree_row_act) + self.diff_tree.set_enable_search(False) + + diff_hunk_cell = gtk.CellRendererText() + diff_hunk_cell.set_property('cell-background', '#EEEEEE') + diffcol = gtk.TreeViewColumn('diff', diff_hunk_cell, + strikethrough=DM_REJECTED, + markup=DM_CHUNK_TEXT, + strikethrough_set=DM_NOT_HEADER_CHUNK, + cell_background_set=DM_HEADER_CHUNK) + diffcol.set_resizable(True) + self.diff_tree.append_column(diffcol) + self.tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.tree.get_selection().connect('changed', + self._tree_selection_changed, False) + scroller.add(self.diff_tree) + else: + # display merge diffs in simple text view + self.merge_diff_text = gtk.TextView() + self.merge_diff_text.set_wrap_mode(gtk.WRAP_NONE) + self.merge_diff_text.set_editable(False) + self.merge_diff_text.modify_font(pango.FontDescription(self.fontdiff)) + self.tree.get_selection().set_mode(gtk.SELECTION_SINGLE) + self.tree.get_selection().connect('changed', + self._merge_tree_selection_changed, False) + self._activate_shelve_buttons(False) + scroller.add(self.merge_diff_text)     if self.diffbottom:   self._diffpane = gtk.VPaned() @@ -662,6 +672,59 @@
  if success:   self.reload_status()   + def _merge_tree_selection_changed(self, selection, force): + ''' Update the diff text with merge diff to both parents''' + def dohgdiff(): + difftext = ['===== Diff to first parent =====\n'] + wfiles = [self.repo.wjoin(file)] + matcher = cmdutil.match(self.repo, wfiles, self.opts) + for s in patch.diff(self.repo, self.repo.dirstate.parents()[0], None, + match=matcher, opts=patch.diffopts(self.ui, self.opts)): + difftext.extend(s.splitlines(True)) + difftext.append('\n===== Diff to second parent =====\n') + for s in patch.diff(self.repo, self.repo.dirstate.parents()[1], None, + match=matcher, opts=patch.diffopts(self.ui, self.opts)): + difftext.extend(s.splitlines(True)) + + buffer = gtk.TextBuffer() + buffer.create_tag('removed', foreground='#900000') + buffer.create_tag('added', foreground='#006400') + buffer.create_tag('position', foreground='#FF8000') + buffer.create_tag('header', foreground='#000090') + + iter = buffer.get_start_iter() + for line in difftext: + line = toutf(line) + if line.startswith('---') or line.startswith('+++'): + buffer.insert_with_tags_by_name(iter, line, 'header') + elif line.startswith('-'): + if self.tabwidth: + line = line[0] + line[1:].expandtabs(self.tabwidth) + buffer.insert_with_tags_by_name(iter, line, 'removed') + elif line.startswith('+'): + if self.tabwidth: + line = line[0] + line[1:].expandtabs(self.tabwidth) + buffer.insert_with_tags_by_name(iter, line, 'added') + elif line.startswith('@@'): + buffer.insert_with_tags_by_name(iter, line, 'position') + else: + if self.tabwidth: + line = line[0] + line[1:].expandtabs(self.tabwidth) + buffer.insert(iter, line) + + self.merge_diff_text.set_buffer(buffer) + + if self.showdiff_toggle.get_active(): + sel = self.tree.get_selection().get_selected_rows()[1] + if not sel: + self._last_file = None + return False + file = self.model[sel[0]][2] + if force or file != self._last_file: + self._last_file = file + self._hg_call_wrapper('Diff', dohgdiff) + return False +     def _tree_selection_changed(self, selection, force):   if self.showdiff_toggle.get_active(): @@ -680,6 +743,7 @@
  selection.select_path((row,))   return False   +   def _diff_tree_row_act(self, tree, path, column):   row = self.diff_model[path]   chunk = self._shelve_chunks[row[DM_CHUNK_ID]] @@ -711,35 +775,6 @@
  self._update_check_count()   return   - def _diff_tree_button_press(self, widget, event): - # Used to select all of file patch, will be no longer necessary - # activating rows in file list will set/clear all patch parts - #if event.button == 1: - # tup = widget.get_path_at_pos(int(event.x), int(event.y)) - # if tup is None: - # return False - # path = tup[0] - # - # def get_hunk_pos(filename): - # l = [] - # for n, hunk in enumerate(self._shelve_chunks): - # if hunk.filename() == filename: - # l.append(n) - # return l - # - # # cliked on header hunk to select/unselect all hunks in file - # hunk = self._shelve_chunks[path[0]] - # if isinstance(hunk, hgshelve.header): - # l = get_hunk_pos(hunk.filename()) - # selection = self.diff_tree.get_selection() - # selected = selection.path_is_selected(path) - # for i in l: - # if selected: - # selection.unselect_path((i,)) - # else: - # selection.select_path((i,)) - # return True # stop further event handling - return False # try next handler     def _show_diff_hunks(self, files):   ''' Update the diff text ''' @@ -796,6 +831,8 @@
  finally:   difftext.close()   + if hasattr(self, 'merge_diff_text'): + return   self._hg_call_wrapper('Diff', dohgdiff)     def _has_shelve_file(self): @@ -814,14 +851,18 @@
  self._diffpane.handler_block(self._diffpane_moved_id)     if togglebutton.get_active(): - self._tree_selection_changed(self.tree.get_selection(), True) + if hasattr(self, 'merge_diff_text'): + self._merge_tree_selection_changed(self.tree.get_selection(), True) + self._activate_shelve_buttons(False) + else: + self._activate_shelve_buttons(True) + self._tree_selection_changed(self.tree.get_selection(), True)   self._diffpane.set_position(self._setting_lastpos)   else:   self._setting_lastpos = self._diffpane.get_position()   self._diffpane.set_position(64000) - #self.diff_text.set_buffer(gtk.TextBuffer()) + self._activate_shelve_buttons(False)   - self._activate_shelve_buttons(togglebutton.get_active())   self._diffpane.handler_unblock(self._diffpane_moved_id)   return True   @@ -837,12 +878,16 @@
  if self.showdiff_toggle.get_active():   if paned.get_position() >= sizemax - 55:   self.showdiff_toggle.set_active(False) - #self.diff_text.set_buffer(gtk.TextBuffer()) + self._activate_shelve_buttons(self.showdiff_toggle.get_active())   elif paned.get_position() < sizemax - 55:   self.showdiff_toggle.set_active(True) - self._tree_selection_changed(self.tree.get_selection(), True) + if hasattr(self, 'merge_diff_text'): + self._merge_tree_selection_changed(self.tree.get_selection(), True) + self._activate_shelve_buttons(False) + else: + self._tree_selection_changed(self.tree.get_selection(), True) + self._activate_shelve_buttons(True)   - self._activate_shelve_buttons(self.showdiff_toggle.get_active())   self.showdiff_toggle.handler_unblock(self._showdiff_toggled_id)   return False