@@ -60,11 +60,11 @@ class DDSWrapper: | |||
if pkg_db and self.pkg_db_path.exists(): | |||
self.pkg_db_path.unlink() | |||
def run(self, args: proc.CommandLine, *, cwd: Optional[Pathish] = None) -> None: | |||
def run(self, args: proc.CommandLine, *, cwd: Optional[Pathish] = None, timeout: Optional[int] = None) -> None: | |||
"""Execute the 'dds' executable with the given arguments""" | |||
env = os.environ.copy() | |||
env['DDS_NO_ADD_INITIAL_REPO'] = '1' | |||
proc.check_run([self.path, args], cwd=cwd or self.default_cwd, env=env) | |||
proc.check_run([self.path, args], cwd=cwd or self.default_cwd, env=env, timeout=timeout) | |||
def catalog_json_import(self, path: Path) -> None: | |||
"""Run 'catalog import' to import the given JSON. Only applicable to older 'dds'""" | |||
@@ -94,7 +94,8 @@ class DDSWrapper: | |||
toolchain: Optional[Path] = None, | |||
build_root: Optional[Path] = None, | |||
jobs: Optional[int] = None, | |||
more_args: Optional[proc.CommandLine] = None) -> None: | |||
more_args: Optional[proc.CommandLine] = None, | |||
timeout: Optional[int] = None) -> None: | |||
""" | |||
Run 'dds build' with the given arguments. | |||
@@ -105,16 +106,19 @@ class DDSWrapper: | |||
""" | |||
toolchain = toolchain or tc_mod.get_default_audit_toolchain() | |||
jobs = jobs or multiprocessing.cpu_count() + 2 | |||
self.run([ | |||
'build', | |||
f'--toolchain={toolchain}', | |||
self.repo_dir_arg, | |||
self.catalog_path_arg, | |||
f'--jobs={jobs}', | |||
f'{self.project_dir_flag}={root}', | |||
f'--out={build_root}', | |||
more_args or (), | |||
]) | |||
self.run( | |||
[ | |||
'build', | |||
f'--toolchain={toolchain}', | |||
self.repo_dir_arg, | |||
self.catalog_path_arg, | |||
f'--jobs={jobs}', | |||
f'{self.project_dir_flag}={root}', | |||
f'--out={build_root}', | |||
more_args or (), | |||
], | |||
timeout=timeout, | |||
) | |||
def compile_file(self, | |||
paths: Iterable[Pathish], |
@@ -81,7 +81,7 @@ def test_build(dds: DDSWrapper, args: CommandArguments) -> DDSWrapper: | |||
test_tc = args.test_toolchain or toolchain.get_default_audit_toolchain() | |||
build_dir = paths.BUILD_DIR | |||
with toolchain.fixup_toolchain(test_tc) as new_tc: | |||
dds.build(toolchain=new_tc, root=paths.PROJECT_ROOT, build_root=build_dir, jobs=args.jobs) | |||
dds.build(toolchain=new_tc, root=paths.PROJECT_ROOT, build_root=build_dir, jobs=args.jobs, timeout=60 * 15) | |||
return DDSWrapper(build_dir / ('dds' + paths.EXE_SUFFIX)) | |||
@@ -113,7 +113,11 @@ def main_build(dds: DDSWrapper, args: CommandArguments) -> int: | |||
toolchain.get_default_toolchain() if not args.rapid else toolchain.get_default_audit_toolchain()) | |||
with toolchain.fixup_toolchain(main_tc) as new_tc: | |||
try: | |||
dds.build(toolchain=new_tc, root=paths.PROJECT_ROOT, build_root=paths.BUILD_DIR, jobs=args.jobs) | |||
dds.build(toolchain=new_tc, | |||
root=paths.PROJECT_ROOT, | |||
build_root=paths.BUILD_DIR, | |||
jobs=args.jobs, | |||
timeout=60 * 15) | |||
except subprocess.CalledProcessError as e: | |||
if args.rapid: | |||
return e.returncode |
@@ -43,9 +43,11 @@ def flatten_cmd(cmd: CommandLine) -> Iterable[str]: | |||
def run(*cmd: CommandLine, | |||
cwd: Optional[Pathish] = None, | |||
check: bool = False, | |||
env: Optional[Mapping[str, str]] = None) -> ProcessResult: | |||
env: Optional[Mapping[str, str]] = None, | |||
timeout: Optional[int] = None) -> ProcessResult: | |||
timeout = timeout or 60 * 5 | |||
command = list(flatten_cmd(cmd)) | |||
res = subprocess.run(command, cwd=cwd, check=False, env=env) | |||
res = subprocess.run(command, cwd=cwd, check=False, env=env, timeout=timeout) | |||
if res.returncode and check: | |||
raise_error(res) | |||
return res | |||
@@ -57,5 +59,6 @@ def raise_error(proc: ProcessResult) -> NoReturn: | |||
def check_run(*cmd: CommandLine, | |||
cwd: Optional[Pathish] = None, | |||
env: Optional[Mapping[str, str]] = None) -> ProcessResult: | |||
return run(cmd, cwd=cwd, check=True, env=env) | |||
env: Optional[Mapping[str, str]] = None, | |||
timeout: Optional[int] = None) -> ProcessResult: | |||
return run(cmd, cwd=cwd, check=True, env=env, timeout=timeout) |