有没有推荐的命令用于“hg bisect --command”?

8 投票
3 回答
1236 浏览
提问于 2025-04-15 20:49

我遇到了一个紧急的bug,明天必须找到它的原因。我知道之前有一个好的版本,所以我想用hg bisect这个工具来帮助我。

不过,我在Windows系统上,不想去写那些复杂的DOS脚本。

理想情况下,我希望能写一个Python的单元测试,然后让hg bisect来使用这个测试。这是我第一次尝试。

bisector.py

#!/usr/bin/env python

import sys
import unittest

class TestCase(unittest.TestCase):

    def test(self):
        #raise Exception('Exception for testing.')
        #self.fail("Failure for testing.")
        pass


def main():
    suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestCase)
    result = unittest.TestResult()
    suite.run(result)

    if result.errors:
        # Skip the revision
        return 125

    if result.wasSuccessful():
        return 0
    else:
        return 1


if '__main__' == __name__:
    sys.exit(main())

也许我可以这样运行:

hg bisect --reset
hg bisect --bad
hg bisect --good -r 1
hg bisect --command=bisector.py

有没有更好的方法呢?谢谢大家的建议。

3 个回答

1

如果你手头有一些Unix工具,可以注意到'grep'这个命令的退出状态是很有用的。也就是说,如果你的单元测试在通过时打印“PASS”,你可以这样做:

hg bisect -c './unittest | grep PASS'

这样做效果会非常好。

4

我觉得你可以把你的 main() 函数去掉,改用下面这个代码块来运行测试:

if __name__ == '__main__':
   unittest.main()

调用 unittest.main() 这个函数会自动运行这个文件里找到的所有测试,并根据测试结果是通过还是失败,给出一个合适的状态码来结束程序。

10

感谢大家,特别是Will McCutchen。

下面是最有效的解决方案。

bisector.py

#!/usr/bin/env python

import unittest

class TestCase(unittest.TestCase):

    def test(self):
        # Raise an assertion error to mark the revision as bad
        pass


if '__main__' == __name__:
    unittest.main()

最难的部分是正确使用hg bisect命令:

hg update tip
hg bisect --reset
hg bisect --bad
hg bisect --good 0
hg bisect --command ./bisector.py

在Windows上,最后一个命令是:

hg bisect --command bisector.py

撰写回答