1
# bisect.py - Bisect dialog for TortoiseHg
3
# Copyright 2010 Steve Borho <steve@borho.org>
5
# This software may be used and distributed according to the terms of the
6
# GNU General Public License version 2, incorporated herein by reference.
10
from PyQt4.QtCore import *
11
from PyQt4.QtGui import *
13
from mercurial import util, error
15
from tortoisehg.util import hglib
16
from tortoisehg.hgqt.i18n import _
17
from tortoisehg.hgqt import cmdui, qtlib
19
class BisectDialog(QDialog):
20
def __init__(self, repo, opts, parent=None):
21
super(BisectDialog, self).__init__(parent)
22
self.setWindowTitle(_('Bisect - %s') % repo.displayname)
23
self.setWindowIcon(qtlib.geticon('hg-bisect'))
25
self.setWindowFlags(Qt.Window)
34
hbox.addWidget(QLabel(_('Known good revision:')))
36
gle.setText(opts.get('good', ''))
37
hbox.addWidget(gle, 1)
38
gb = QPushButton(_('Accept'))
43
hbox.addWidget(QLabel(_('Known bad revision:')))
45
ble.setText(opts.get('bad', ''))
47
hbox.addWidget(ble, 1)
48
bb = QPushButton(_('Accept'))
54
self.cmd = cmdui.Widget(True, False, self)
55
self.cmd.setShowOutput(True)
56
box.addWidget(self.cmd, 1)
59
goodrev = QPushButton(_('Revision is Good'))
60
hbox.addWidget(goodrev)
61
badrev = QPushButton(_('Revision is Bad'))
62
hbox.addWidget(badrev)
63
skiprev = QPushButton(_('Skip this Revision'))
64
hbox.addWidget(skiprev)
72
closeb = QPushButton(_('Close'))
73
hbox.addWidget(closeb)
74
closeb.clicked.connect(self.reject)
76
self.nextbuttons = (goodrev, badrev, skiprev)
77
for b in self.nextbuttons:
83
lbl.setText(_('Error encountered.'))
85
repo.dirstate.invalidate()
87
if ctx.rev() == self.lastrev:
88
lbl.setText(_('Culprit found.'))
90
self.lastrev = ctx.rev()
91
for b in self.nextbuttons:
93
lbl.setText('%s: %d (%s) -> %s' % (_('Revision'), ctx.rev(), ctx,
94
_('Test this revision and report findings. '
96
self.cmd.commandFinished.connect(cmdFinished)
98
prefix = ['bisect', '--repository', repo.root]
101
good = hglib.fromunicode(gle.text().simplified())
104
self.goodrev = ctx.rev()
106
gle.setEnabled(False)
110
except error.RepoLookupError, e:
111
self.cmd.core.stbar.showMessage(hglib.tounicode(str(e)))
112
except util.Abort, e:
114
err = _('%s (hint: %s)') % (hglib.tounicode(str(e)),
115
hglib.tounicode(e.hint))
117
err = hglib.tounicode(str(e))
118
self.cmd.core.stbar.showMessage(err)
120
bad = hglib.fromunicode(ble.text().simplified())
123
self.badrev = ctx.rev()
124
ble.setEnabled(False)
127
cmds.append(prefix + ['--reset'])
128
cmds.append(prefix + ['--good', str(self.goodrev)])
129
cmds.append(prefix + ['--bad', str(self.badrev)])
131
except error.RepoLookupError, e:
132
self.cmd.core.stbar.showMessage(hglib.tounicode(str(e)))
133
except util.Abort, e:
135
err = _('%s (hint: %s)') % (hglib.tounicode(str(e)),
136
hglib.tounicode(e.hint))
138
err = hglib.tounicode(str(e))
139
self.cmd.core.stbar.showMessage(err)
141
gb.pressed.connect(gverify)
142
bb.pressed.connect(bverify)
143
gle.returnPressed.connect(gverify)
144
ble.returnPressed.connect(bverify)
147
for b in self.nextbuttons:
149
self.cmd.run(prefix + ['--good', '.'])
151
for b in self.nextbuttons:
153
self.cmd.run(prefix + ['--bad', '.'])
155
for b in self.nextbuttons:
157
self.cmd.run(prefix + ['--skip', '.'])
158
goodrev.clicked.connect(goodrevision)
159
badrev.clicked.connect(badrevision)
160
skiprev.clicked.connect(skiprevision)
162
def keyPressEvent(self, event):
163
if event.key() == Qt.Key_Escape:
165
super(BisectDialog, self).keyPressEvent(event)
168
def run(ui, *pats, **opts):
169
from tortoisehg.util import paths
170
from tortoisehg.hgqt import thgrepo
171
repo = thgrepo.repository(ui, path=paths.find_root())
172
return BisectDialog(repo, opts)