Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.9.2, 1.9.3, and 2.0

hgemail: add minimal support for outgoing bundle

Currently email bundle is enabled only by sync widget.

Sync widget invokes email dialog with revs, outgoing and outgoingrevs.
Here revs are list of changesets to be sent, and outgoingrevs are list of
target outgoing revisions. outgoing flag and outgoingrevs are used only
if bundle radio is checked.

If bundle radio is checked, preview tab becomes disabled due to performance
reason. It also makes changesets view readonly, because we cannot pick out
changesets to be bundled.

Changeset 19dde97588bf

Parent 90dffcb22fde

by Yuya Nishihara

Changes to 2 files · Browse files at 19dde97588bf Showing diff from parent 90dffcb22fde Diff from another changeset...

 
19
20
21
22
 
 
 
 
 
 
 
 
 
 
23
24
 
 
25
26
27
28
29
30
31
32
 
33
34
35
 
163
164
165
166
 
 
 
 
 
 
 
167
168
169
 
216
217
218
 
 
 
 
 
 
 
 
 
219
220
221
 
261
262
263
264
 
265
266
267
 
345
346
347
 
348
349
350
 
355
356
357
 
 
 
358
359
360
 
369
370
371
372
 
373
374
375
 
387
388
389
 
 
 
390
391
392
 
393
394
395
 
421
422
423
424
 
 
425
426
427
 
19
20
21
 
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
39
40
41
42
43
44
45
46
 
174
175
176
 
177
178
179
180
181
182
183
184
185
186
 
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
 
287
288
289
 
290
291
292
293
 
371
372
373
374
375
376
377
 
382
383
384
385
386
387
388
389
390
 
399
400
401
 
402
403
404
405
 
417
418
419
420
421
422
423
424
 
425
426
427
428
 
454
455
456
 
457
458
459
460
461
@@ -19,17 +19,28 @@
   class EmailDialog(QDialog):   """Dialog for sending patches via email""" - def __init__(self, repo, revs, parent=None): + def __init__(self, repo, revs, parent=None, outgoing=False, + outgoingrevs=None): + """Create EmailDialog for the given repo and revs + + :revs: List of revisions to be sent. + :outgoing: Enable outgoing bundle support. You also need to set + outgoing revisions to `revs`. + :outgoingrevs: Target revision of outgoing bundle. + (Passed as `hg email --bundle --rev {rev}`) + """   super(EmailDialog, self).__init__(parent)   self._repo = repo + self._outgoing = outgoing + self._outgoingrevs = outgoingrevs or []     self._qui = Ui_EmailDialog()   self._qui.setupUi(self) - self._qui.bundle_radio.setEnabled(False) # TODO: bundle support     self._initchangesets(revs)   self._initpreviewtab()   self._initenvelopebox() + self._qui.bundle_radio.toggled.connect(self._updateforms)   self._initintrobox()   self._readhistory()   self._filldefaults() @@ -163,7 +174,13 @@
  opts['from'] = headertext(self._qui.from_edit.currentText())   opts['in_reply_to'] = headertext(self._qui.inreplyto_edit.text())   opts['flag'] = [headertext(self._qui.flag_edit.currentText())] - opts['rev'] = map(str, self._revs) + + if self._qui.bundle_radio.isChecked(): + assert self._outgoing # only outgoing bundle is supported + opts['rev'] = map(str, self._outgoingrevs) + opts['bundle'] = True + else: + opts['rev'] = map(str, self._revs)     def diffformat():   n = self.getdiffformat() @@ -216,6 +233,15 @@
  self._qui.send_button.setEnabled(valid)   self._qui.main_tabs.setTabEnabled(self._previewtabindex(), valid)   self._qui.writeintro_check.setEnabled(not self._introrequired()) + + self._qui.bundle_radio.setEnabled( + self._outgoing and self._changesets.isselectedall()) + self._changesets.setReadOnly(self._qui.bundle_radio.isChecked()) + if self._qui.bundle_radio.isChecked(): + # workaround to disable preview for outgoing bundle because it + # may freeze main thread + self._qui.main_tabs.setTabEnabled(self._previewtabindex(), False) +   if self._introrequired():   self._qui.writeintro_check.setChecked(True)   @@ -261,7 +287,7 @@
    def _introrequired(self):   """Is intro message required?""" - return len(self._revs) > 1 + return len(self._revs) > 1 or self._qui.bundle_radio.isChecked()     def _initpreviewtab(self):   def initqsci(w): @@ -345,6 +371,7 @@
  self._repo = repo   self._revs = list(reversed(sorted(revs)))   self._selectedrevs = set(selectedrevs) + self._readonly = False     @property   def revs(self): @@ -355,6 +382,9 @@
  """Return the list of selected revisions"""   return list(sorted(self._selectedrevs))   + def isselectedall(self): + return len(self._revs) == len(self._selectedrevs) +   def data(self, index, role):   if not index.isValid():   return QVariant() @@ -369,7 +399,7 @@
  return QVariant()     def setData(self, index, value, role=Qt.EditRole): - if not index.isValid(): + if not index.isValid() or self._readonly:   return False     rev = self._revs[index.row()] @@ -387,9 +417,12 @@
    return False   + def setReadOnly(self, readonly): + self._readonly = readonly +   def flags(self, index):   v = super(_ChangesetsModel, self).flags(index) - if index.column() == 0: + if index.column() == 0 and not self._readonly:   return Qt.ItemIsUserCheckable | v   else:   return v @@ -421,7 +454,8 @@
  repo = opts.get('repo') or thgrepo.repository(ui, paths.find_root())     try: - return EmailDialog(repo, revs) + return EmailDialog(repo, revs, outgoing=opts.get('outgoing', False), + outgoingrevs=opts.get('outgoingrevs', None))   except error.RepoLookupError, e:   qtlib.ErrorMsgBox(_('Failed to open Email dialog'),   hglib.tounicode(e.message))
 
743
744
745
 
 
 
 
746
747
 
 
748
749
750
 
743
744
745
746
747
748
749
750
 
751
752
753
754
755
@@ -743,8 +743,13 @@
  nodes = [n for n in data.splitlines() if len(n) == 40]   self.showMessage.emit(_('%d outgoing changesets') %   len(nodes)) + try: + outgoingrevs = [cmdline[cmdline.index('--rev') + 1]] + except ValueError: + outgoingrevs = None   from tortoisehg.hgqt import run as _run - _run.email(ui.ui(), repo=self.repo, rev=nodes) + _run.email(ui.ui(), repo=self.repo, rev=nodes, + outgoing=True, outgoingrevs=outgoingrevs)   elif ret == 1:   self.showMessage.emit(_('No outgoing changesets'))   else: