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

status: allow cherry picking of patches from history

select source revision in changelog browser, right-click
on target revision, select view diffs. Select changes to
include in patch, hit save and give it a filename.

Changeset ebc65c6aabc1

Parent be3e3054caf0

by Steve Borho

Changes to one file · Browse files at ebc65c6aabc1 Showing diff from parent be3e3054caf0 Diff from another changeset...

Change 1 of 5 Show Entire File hggtk/​status.py Stacked
 
169
170
171
172
 
 
 
 
 
173
174
175
 
270
271
272
273
274
 
275
276
277
 
501
502
503
 
 
 
 
 
 
504
505
506
 
531
532
533
534
535
536
537
538
539
 
995
996
997
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
998
999
1000
 
169
170
171
 
172
173
174
175
176
177
178
179
 
274
275
276
 
 
277
278
279
280
 
504
505
506
507
508
509
510
511
512
513
514
515
 
540
541
542
 
 
 
543
544
545
 
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
@@ -169,7 +169,11 @@
  self._refresh_clicked, tip='refresh'),   gtk.SeparatorToolItem()]   - if self.count_revs() < 2: + if self.count_revs() == 2: + tbuttons += [ + self.make_toolbutton(gtk.STOCK_SAVE_AS, 'Save As', + self._save_clicked, tip='Save selected changes')] + else:   tbuttons += [   self.make_toolbutton(gtk.STOCK_MEDIA_REWIND, 'Re_vert',   self._revert_clicked, tip='revert'), @@ -270,8 +274,7 @@
  stat_cell = gtk.CellRendererText()     self.selcb = None - ismerge = len(self.repo.changectx(None).parents()) == 2 - if self.count_revs() < 2 and not ismerge: + if len(self.repo.changectx(None).parents()) != 2:   # show file selection checkboxes only when applicable   col0 = gtk.TreeViewColumn('', toggle_cell)   col0.add_attribute(toggle_cell, 'active', FM_CHECKED) @@ -501,6 +504,12 @@
  self._diffpane_moved(self._diffpane)   return False   + def auto_check(self): + if self.opts.get('rev'): + for entry in self.filemodel: + entry[FM_CHECKED] = True + self._update_check_count() +   ### End of overrides ###     def _do_reload_status(self): @@ -531,9 +540,6 @@
  (modified, added, removed, deleted, unknown, ignored, clean) = status   self.modified = modified   - if not self.opts.get('rev') and deleted and unknown: - print "Suggest to detect copies or renames" -   changetypes = (('modified', 'M', modified),   ('added', 'A', added),   ('removed', 'R', removed), @@ -995,6 +1001,33 @@
  self.reload_status()   return True   + def _save_clicked(self, toolbutton, data=None): + 'Write selected diff hunks to a patch file' + revrange = self.opts.get('rev')[0] + filename = "%s.patch" % revrange.replace(':', '_to_') + fd = NativeSaveFileDialogWrapper(Title = "Save patch to", + InitialDir=self.repo.root, + FileName=filename) + result = fd.run() + if not result: + return + + cids = [] + dmodel = self.diff_model + for row in self.filemodel: + if row[FM_CHECKED]: + wfile = util.pconvert(row[FM_PATH]) + fc = self._filechunks[wfile] + cids.append(fc[0]) + cids += [dmodel[r][DM_CHUNK_ID] for r in fc[1:] if not dmodel[r][DM_REJECTED]] + try: + fp = open(result, "w") + for cid in cids: + self._shelve_chunks[cid].write(fp) + except OSError: + pass + finally: + fp.close()     def _revert_clicked(self, toolbutton, data=None):   revert_list = self._relevant_files('MAR!')