~ubuntu-branches/debian/sid/tortoisehg/sid

« back to all changes in this revision

Viewing changes to tortoisehg/hgqt/bisect.py

  • Committer: Bazaar Package Importer
  • Author(s): Ludovico Cavedon
  • Date: 2011-03-18 19:57:13 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20110318195713-nh62nv9y26rrdtmh
Tags: 2.0.2-1
* New upstream release.
* Update copyright file.
* Depend on PyQt4 libraries rather than on PyGtk.
* Rename manpage from hgtk to thg.
* No longer include _hgtk zsh completion file.
* Install wrapper script hgtk and add manpage link for it (LP: #732328).
* Update manpage with new options and commands.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# bisect.py - Bisect dialog for TortoiseHg
 
2
#
 
3
# Copyright 2010 Steve Borho <steve@borho.org>
 
4
#
 
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.
 
7
 
 
8
import os
 
9
 
 
10
from PyQt4.QtCore import *
 
11
from PyQt4.QtGui import *
 
12
 
 
13
from mercurial import util, error
 
14
 
 
15
from tortoisehg.util import hglib
 
16
from tortoisehg.hgqt.i18n import _
 
17
from tortoisehg.hgqt import cmdui, qtlib
 
18
 
 
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'))
 
24
 
 
25
        self.setWindowFlags(Qt.Window)
 
26
        self.repo = repo
 
27
 
 
28
        # base layout box
 
29
        box = QVBoxLayout()
 
30
        box.setSpacing(6)
 
31
        self.setLayout(box)
 
32
 
 
33
        hbox = QHBoxLayout()
 
34
        hbox.addWidget(QLabel(_('Known good revision:')))
 
35
        gle = QLineEdit()
 
36
        gle.setText(opts.get('good', ''))
 
37
        hbox.addWidget(gle, 1)
 
38
        gb = QPushButton(_('Accept'))
 
39
        hbox.addWidget(gb)
 
40
        box.addLayout(hbox)
 
41
 
 
42
        hbox = QHBoxLayout()
 
43
        hbox.addWidget(QLabel(_('Known bad revision:')))
 
44
        ble = QLineEdit()
 
45
        ble.setText(opts.get('bad', ''))
 
46
        ble.setEnabled(False)
 
47
        hbox.addWidget(ble, 1)
 
48
        bb = QPushButton(_('Accept'))
 
49
        bb.setEnabled(False)
 
50
        hbox.addWidget(bb)
 
51
        box.addLayout(hbox)
 
52
 
 
53
        ## command widget
 
54
        self.cmd = cmdui.Widget(True, False, self)
 
55
        self.cmd.setShowOutput(True)
 
56
        box.addWidget(self.cmd, 1)
 
57
 
 
58
        hbox = QHBoxLayout()
 
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)
 
65
        box.addLayout(hbox)
 
66
 
 
67
        hbox = QHBoxLayout()
 
68
        box.addLayout(hbox)
 
69
        lbl = QLabel()
 
70
        hbox.addWidget(lbl)
 
71
        hbox.addStretch(1)
 
72
        closeb = QPushButton(_('Close'))
 
73
        hbox.addWidget(closeb)
 
74
        closeb.clicked.connect(self.reject)
 
75
 
 
76
        self.nextbuttons = (goodrev, badrev, skiprev)
 
77
        for b in self.nextbuttons:
 
78
            b.setEnabled(False)
 
79
        self.lastrev = None
 
80
 
 
81
        def cmdFinished(ret):
 
82
            if ret != 0:
 
83
                lbl.setText(_('Error encountered.'))
 
84
                return
 
85
            repo.dirstate.invalidate()
 
86
            ctx = repo['.']
 
87
            if ctx.rev() == self.lastrev:
 
88
                lbl.setText(_('Culprit found.'))
 
89
                return
 
90
            self.lastrev = ctx.rev()
 
91
            for b in self.nextbuttons:
 
92
                b.setEnabled(True)
 
93
            lbl.setText('%s: %d (%s) -> %s' % (_('Revision'), ctx.rev(), ctx,
 
94
                        _('Test this revision and report findings. '
 
95
                          '(good/bad/skip)')))
 
96
        self.cmd.commandFinished.connect(cmdFinished)
 
97
 
 
98
        prefix = ['bisect', '--repository', repo.root]
 
99
 
 
100
        def gverify():
 
101
            good = hglib.fromunicode(gle.text().simplified())
 
102
            try:
 
103
                ctx = repo[good]
 
104
                self.goodrev = ctx.rev()
 
105
                gb.setEnabled(False)
 
106
                gle.setEnabled(False)
 
107
                bb.setEnabled(True)
 
108
                ble.setEnabled(True)
 
109
                ble.setFocus()
 
110
            except error.RepoLookupError, e:
 
111
                self.cmd.core.stbar.showMessage(hglib.tounicode(str(e)))
 
112
            except util.Abort, e:
 
113
                if e.hint:
 
114
                    err = _('%s (hint: %s)') % (hglib.tounicode(str(e)),
 
115
                                                hglib.tounicode(e.hint))
 
116
                else:
 
117
                    err = hglib.tounicode(str(e))
 
118
                self.cmd.core.stbar.showMessage(err)
 
119
        def bverify():
 
120
            bad = hglib.fromunicode(ble.text().simplified())
 
121
            try:
 
122
                ctx = repo[bad]
 
123
                self.badrev = ctx.rev()
 
124
                ble.setEnabled(False)
 
125
                bb.setEnabled(False)
 
126
                cmds = []
 
127
                cmds.append(prefix + ['--reset'])
 
128
                cmds.append(prefix + ['--good', str(self.goodrev)])
 
129
                cmds.append(prefix + ['--bad', str(self.badrev)])
 
130
                self.cmd.run(*cmds)
 
131
            except error.RepoLookupError, e:
 
132
                self.cmd.core.stbar.showMessage(hglib.tounicode(str(e)))
 
133
            except util.Abort, e:
 
134
                if e.hint:
 
135
                    err = _('%s (hint: %s)') % (hglib.tounicode(str(e)),
 
136
                                                hglib.tounicode(e.hint))
 
137
                else:
 
138
                    err = hglib.tounicode(str(e))
 
139
                self.cmd.core.stbar.showMessage(err)
 
140
 
 
141
        gb.pressed.connect(gverify)
 
142
        bb.pressed.connect(bverify)
 
143
        gle.returnPressed.connect(gverify)
 
144
        ble.returnPressed.connect(bverify)
 
145
 
 
146
        def goodrevision():
 
147
            for b in self.nextbuttons:
 
148
                b.setEnabled(False)
 
149
            self.cmd.run(prefix + ['--good', '.'])
 
150
        def badrevision():
 
151
            for b in self.nextbuttons:
 
152
                b.setEnabled(False)
 
153
            self.cmd.run(prefix + ['--bad', '.'])
 
154
        def skiprevision():
 
155
            for b in self.nextbuttons:
 
156
                b.setEnabled(False)
 
157
            self.cmd.run(prefix + ['--skip', '.'])
 
158
        goodrev.clicked.connect(goodrevision)
 
159
        badrev.clicked.connect(badrevision)
 
160
        skiprev.clicked.connect(skiprevision)
 
161
 
 
162
    def keyPressEvent(self, event):
 
163
        if event.key() == Qt.Key_Escape:
 
164
            self.reject()
 
165
        super(BisectDialog, self).keyPressEvent(event)
 
166
 
 
167
 
 
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)