comparison tests/run-tests.py @ 34802:9c7548eb7d1c

run-tests: move bisect logic to a separate method This removes 8 space indentation and makes upcoming changes easier. Differential Revision: https://phab.mercurial-scm.org/D947
author Jun Wu <quark@fb.com>
date Wed, 04 Oct 2017 18:42:24 -0700
parents df78b1a24094
children d817bf1fc675
comparison
equal deleted inserted replaced
34801:1f4249c764f1 34802:9c7548eb7d1c
2083 self._runner._checkhglib('Tested') 2083 self._runner._checkhglib('Tested')
2084 2084
2085 savetimes(self._runner._outputdir, result) 2085 savetimes(self._runner._outputdir, result)
2086 2086
2087 if failed and self._runner.options.known_good_rev: 2087 if failed and self._runner.options.known_good_rev:
2088 bisectcmd = ['hg', 'bisect'] 2088 self._bisecttests(t for t, m in result.failures)
2089 bisectrepo = self._runner.options.bisect_repo
2090 if bisectrepo:
2091 bisectcmd.extend(['-R', os.path.abspath(bisectrepo)])
2092 def nooutput(args):
2093 p = subprocess.Popen(args, stderr=subprocess.STDOUT,
2094 stdout=subprocess.PIPE)
2095 p.stdout.read()
2096 p.wait()
2097 for test, msg in result.failures:
2098 nooutput(bisectcmd + ['--reset']),
2099 nooutput(bisectcmd + ['--bad', '.'])
2100 nooutput(bisectcmd + ['--good',
2101 self._runner.options.known_good_rev])
2102 # TODO: we probably need to forward more options
2103 # that alter hg's behavior inside the tests.
2104 opts = ''
2105 withhg = self._runner.options.with_hg
2106 if withhg:
2107 opts += ' --with-hg=%s ' % shellquote(_strpath(withhg))
2108 rtc = '%s %s %s %s' % (sys.executable, sys.argv[0], opts,
2109 test)
2110 sub = subprocess.Popen(bisectcmd + ['--command', rtc],
2111 stderr=subprocess.STDOUT,
2112 stdout=subprocess.PIPE)
2113 data = sub.stdout.read()
2114 sub.wait()
2115 m = re.search(
2116 (br'\nThe first (?P<goodbad>bad|good) revision '
2117 br'is:\nchangeset: +\d+:(?P<node>[a-f0-9]+)\n.*\n'
2118 br'summary: +(?P<summary>[^\n]+)\n'),
2119 data, (re.MULTILINE | re.DOTALL))
2120 if m is None:
2121 self.stream.writeln(
2122 'Failed to identify failure point for %s' % test)
2123 continue
2124 dat = m.groupdict()
2125 verb = 'broken' if dat['goodbad'] == 'bad' else 'fixed'
2126 self.stream.writeln(
2127 '%s %s by %s (%s)' % (
2128 test, verb, dat['node'], dat['summary']))
2129 self.stream.writeln( 2089 self.stream.writeln(
2130 '# Ran %d tests, %d skipped, %d failed.' 2090 '# Ran %d tests, %d skipped, %d failed.'
2131 % (result.testsRun, skipped + ignored, failed)) 2091 % (result.testsRun, skipped + ignored, failed))
2132 if failed: 2092 if failed:
2133 self.stream.writeln('python hash seed: %s' % 2093 self.stream.writeln('python hash seed: %s' %
2135 if self._runner.options.time: 2095 if self._runner.options.time:
2136 self.printtimes(result.times) 2096 self.printtimes(result.times)
2137 self.stream.flush() 2097 self.stream.flush()
2138 2098
2139 return result 2099 return result
2100
2101 def _bisecttests(self, tests):
2102 bisectcmd = ['hg', 'bisect']
2103 bisectrepo = self._runner.options.bisect_repo
2104 if bisectrepo:
2105 bisectcmd.extend(['-R', os.path.abspath(bisectrepo)])
2106 def nooutput(args):
2107 p = subprocess.Popen(args, stderr=subprocess.STDOUT,
2108 stdout=subprocess.PIPE)
2109 p.stdout.read()
2110 p.wait()
2111 for test in tests:
2112 nooutput(bisectcmd + ['--reset']),
2113 nooutput(bisectcmd + ['--bad', '.'])
2114 nooutput(bisectcmd + ['--good',
2115 self._runner.options.known_good_rev])
2116 # TODO: we probably need to forward more options
2117 # that alter hg's behavior inside the tests.
2118 opts = ''
2119 withhg = self._runner.options.with_hg
2120 if withhg:
2121 opts += ' --with-hg=%s ' % shellquote(_strpath(withhg))
2122 rtc = '%s %s %s %s' % (sys.executable, sys.argv[0], opts,
2123 test)
2124 sub = subprocess.Popen(bisectcmd + ['--command', rtc],
2125 stderr=subprocess.STDOUT,
2126 stdout=subprocess.PIPE)
2127 data = sub.stdout.read()
2128 sub.wait()
2129 m = re.search(
2130 (br'\nThe first (?P<goodbad>bad|good) revision '
2131 br'is:\nchangeset: +\d+:(?P<node>[a-f0-9]+)\n.*\n'
2132 br'summary: +(?P<summary>[^\n]+)\n'),
2133 data, (re.MULTILINE | re.DOTALL))
2134 if m is None:
2135 self.stream.writeln(
2136 'Failed to identify failure point for %s' % test)
2137 continue
2138 dat = m.groupdict()
2139 verb = 'broken' if dat['goodbad'] == 'bad' else 'fixed'
2140 self.stream.writeln(
2141 '%s %s by %s (%s)' % (
2142 test, verb, dat['node'], dat['summary']))
2140 2143
2141 def printtimes(self, times): 2144 def printtimes(self, times):
2142 # iolock held by run 2145 # iolock held by run
2143 self.stream.writeln('# Producing time report') 2146 self.stream.writeln('# Producing time report')
2144 times.sort(key=lambda t: (t[3])) 2147 times.sort(key=lambda t: (t[3]))