是否有“hg bisect --command”的推荐命令?

时间:2010-03-24 21:56:12

标签: python mercurial

我有一个紧急的错误,我明天要跟踪。我知道之前的hg版本很好,所以我正在考虑使用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 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我认为您可以删除main()函数并使用以下块来运行测试:

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

unittest.main()的调用将运行它在此文件中找到的测试,并使用适当的状态代码退出,具体取决于所有测试是通过还是失败。

答案 2 :(得分:1)

如果您有一些unix工具可供使用,请注意'grep'以有用的方式设置其退出状态。因此,如果您的单元测试在通过时打印“PASS”,您可以执行以下操作:

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

这样做非常好。