Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1.2 and tip

stable backout: add support for backing out merge revisions

When the dialog detects that the revision being backed out is a merge revision,
two radio buttons are added to the dialog, which let the user select the parent
of the merge revision that will be backed out to (i.e. whose changes will be
kept).

Changeset f1af2d40bda8

Parent b05cf15953f3

by Angel Ezquerra

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

 
24
25
26
 
27
28
29
 
146
147
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
150
151
 
302
303
304
 
 
305
306
307
 
451
452
453
454
 
 
 
 
 
455
456
457
 
480
481
482
483
 
 
 
 
 
 
484
485
 
 
 
 
 
 
 
 
 
 
 
 
486
487
488
 
515
516
517
 
 
518
519
520
 
24
25
26
27
28
29
30
 
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
 
346
347
348
349
350
351
352
353
 
497
498
499
 
500
501
502
503
504
505
506
507
 
530
531
532
 
533
534
535
536
537
538
539
 
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
 
581
582
583
584
585
586
587
588
@@ -24,6 +24,7 @@
    self.backoutrev = rev   self.parentbackout = False + self.backoutmergeparentrev = None     self.setWindowTitle(_('Backout - %s') % repo.displayname)   self.setWindowIcon(qtlib.geticon('hg-revert')) @@ -146,6 +147,49 @@
  self.layout().addWidget(localCsInfo)   self.localCsInfo = localCsInfo   + ## Merge revision backout handling + if len(bctx.parents()) > 1: + # Show two radio buttons letting the user which merge revision + # parent to backout to + p1rev = bctx.p1().rev() + p2rev = bctx.p2().rev() + + def setBackoutMergeParentRev(rev): + self.wizard().backoutmergeparentrev = rev + + setBackoutMergeParentRev(p1rev) + + sep = qtlib.LabeledSeparator(_('Merge parent to backout to')) + self.layout().addWidget(sep) + self.layout().addWidget(QLabel( + _('To backout a <b>merge</b> revision you must select which ' + 'parent to backout to ' + '(i.e. whose changes will be <i>kept</i>)'))) + + self.actionFirstParent = QRadioButton( + _('First Parent: revision %s (%s)') \ + % (p1rev, str(bctx.p1())), self) + self.actionFirstParent.setCheckable(True) + self.actionFirstParent.setChecked(True) + self.actionFirstParent.setShortcut('CTRL+1') + self.actionFirstParent.setToolTip( + _('Backout to the first parent of the merge revision')) + self.actionFirstParent.clicked.connect( + lambda: setBackoutMergeParentRev(p1rev)) + + self.actionSecondParent = QRadioButton( + _('Second Parent: revision %s (%s)') + % (p2rev, str(bctx.p2())), self) + self.actionSecondParent.setCheckable(True) + self.actionSecondParent.setShortcut('CTRL+2') + self.actionSecondParent.setToolTip( + _('Backout to the second parent of the merge revision')) + self.actionSecondParent.clicked.connect( + lambda: setBackoutMergeParentRev(p2rev)) + + self.layout().addWidget(self.actionFirstParent) + self.layout().addWidget(self.actionSecondParent) +   ## working directory status   sep = qtlib.LabeledSeparator(_('Working directory status'))   self.layout().addWidget(sep) @@ -302,6 +346,8 @@
  tool = self.field('autoresolve').toBool() and 'merge' or 'fail'   cmdline += ['--tool=internal:' + tool]   cmdline += ['--rev', str(self.wizard().backoutrev)] + if self.wizard().backoutmergeparentrev: + cmdline += ['--parent', str(self.wizard().backoutmergeparentrev)]   self.repo.incrementBusyCount()   self.cmd.core.clearOutput()   self.cmd.run(cmdline) @@ -451,7 +497,11 @@
  def eng_toggled(checked):   if self.isComplete():   oldmsg = self.msgEntry.text() - msgset = i18n.keepgettext()._('Backed out changeset: ') + if self.wizard().backoutmergeparentrev: + msgset = i18n.keepgettext()._( + 'Backed out merge changeset: ') + else: + msgset = i18n.keepgettext()._('Backed out changeset: ')   msg = checked and msgset['id'] or msgset['str']   if oldmsg and oldmsg != msg:   if not qtlib.QuestionMsgBox(_('Confirm Discard Message'), @@ -480,9 +530,25 @@
    def currentPage(self):   engmsg = self.repo.ui.configbool('tortoisehg', 'engmsg', False) - msgset = i18n.keepgettext()._('Backed out changeset: ') + mergeparentrev = self.wizard().backoutmergeparentrev + if mergeparentrev: + msgset = i18n.keepgettext()._( + 'Backed out merge changeset: ') + else: + msgset = i18n.keepgettext()._('Backed out changeset: ')   msg = engmsg and msgset['id'] or msgset['str'] - self.msgEntry.setText(msg + str(self.repo[self.wizard().backoutrev])) + msg += str(self.repo[self.wizard().backoutrev]) + if mergeparentrev: + msg += '\n\n' + bctx = self.repo[self.wizard().backoutrev] + isp1 = (bctx.p1().rev() == mergeparentrev) + if isp1: + msg += _('Backed out merge revision ' + 'to its first parent (%s)') % str(bctx.p1()) + else: + msg += _('Backed out merge revision ' + 'to its second parent (%s)') % str(bctx.p2()) + self.msgEntry.setText(msg)   self.msgEntry.moveCursorToEnd()     @pyqtSlot(QString) @@ -515,6 +581,8 @@
  cmdline = ['backout', '--verbose', '--message', message, '--rev',   str(self.wizard().backoutrev), '--user', user,   '--repository', self.repo.root] + if self.wizard().backoutmergeparentrev: + cmdline += ['--parent', str(self.wizard().backoutmergeparentrev)]   else:   self.setTitle(_('Committing...'))   self.setSubTitle(_('Please wait while committing merged files.'))