mtest: pull detection of ninja into TestHarness

A later commit will add a second invocation of ninja, no point in having the
detection code twice.

This changes the exit code in case ninja isn't found from 125 to 127, which
seems more appropriate given the justification for returning 125 (to make git
bisect run skip that commit). If we can't find ninja we'll not succeed in
other commits either.
pull/10765/head
Andres Freund 2 years ago committed by Eli Schwartz
parent 2096e394fc
commit f501e3b187
  1. 34
      mesonbuild/mtest.py

@ -1509,6 +1509,7 @@ class TestHarness:
self.console_logger = ConsoleLogger()
self.loggers.append(self.console_logger)
self.need_console = False
self.ninja = None # type: T.List[str]
self.logfile_base = None # type: T.Optional[str]
if self.options.logbase and not self.options.gdb:
@ -1523,6 +1524,7 @@ class TestHarness:
if namebase:
self.logfile_base += '-' + namebase.replace(' ', '_')
self.prepare_build()
self.load_metadata()
ss = set()
@ -1535,6 +1537,25 @@ class TestHarness:
assert self.console_logger
return self.console_logger
def prepare_build(self) -> None:
if self.options.no_rebuild:
return
if not (Path(self.options.wd) / 'build.ninja').is_file():
print('Only ninja backend is supported to rebuild tests before running them.')
# Disable, no point in trying to build anything later
self.options.no_rebuild = True
return
self.ninja = environment.detect_ninja()
if not self.ninja:
print("Can't find ninja, can't rebuild test.")
# If ninja can't be found return exit code 127, indicating command
# not found for shell, which seems appropriate here. This works
# nicely for `git bisect run`, telling it to abort - no point in
# continuing if there's no ninja.
sys.exit(127)
def load_metadata(self) -> None:
startdir = os.getcwd()
try:
@ -1692,7 +1713,7 @@ class TestHarness:
tests = self.get_tests()
if not tests:
return 0
if not self.options.no_rebuild and not rebuild_deps(self.options.wd, tests):
if not self.options.no_rebuild and not rebuild_deps(self.ninja, self.options.wd, tests):
# We return 125 here in case the build failed.
# The reason is that exit code 125 tells `git bisect run` that the current
# commit should be skipped. Thus users can directly use `meson test` to
@ -1967,21 +1988,14 @@ def list_tests(th: TestHarness) -> bool:
print(th.get_pretty_suite(t))
return not tests
def rebuild_deps(wd: str, tests: T.List[TestSerialisation]) -> bool:
def rebuild_deps(ninja: T.List[str], wd: str, tests: T.List[TestSerialisation]) -> bool:
def convert_path_to_target(path: str) -> str:
path = os.path.relpath(path, wd)
if os.sep != '/':
path = path.replace(os.sep, '/')
return path
if not (Path(wd) / 'build.ninja').is_file():
print('Only ninja backend is supported to rebuild tests before running them.')
return True
ninja = environment.detect_ninja()
if not ninja:
print("Can't find ninja, can't rebuild test.")
return False
assert len(ninja) > 0
depends = set() # type: T.Set[str]
targets = set() # type: T.Set[str]

Loading…
Cancel
Save