|
| 1 | +"""Copied from https://github.com/aspect-extensions/run/blob/main/runnable.axl |
| 2 | +TODO(alexeagle): depend on that AXL module instead |
| 3 | +""" |
| 4 | +def _process_bes(state: struct, event: bazel.build.build_event.BuildEvent): |
| 5 | + filesets = state.filesets |
| 6 | + target_fileset = state.target_fileset |
| 7 | + target = state.target |
| 8 | + if event.kind == "named_set_of_files": |
| 9 | + filesets[event.id.id] = event.payload.files |
| 10 | + elif event.kind == "target_completed": |
| 11 | + if event.id.label == target: |
| 12 | + for og in event.payload.output_group: |
| 13 | + if og.name == "default": |
| 14 | + target_fileset[event.id.label] = og.file_sets |
| 15 | + |
| 16 | +def _determine_entrypoint(state: struct) -> str | None: |
| 17 | + filesets = state.filesets |
| 18 | + target_fileset = state.target_fileset |
| 19 | + if state.target not in target_fileset: |
| 20 | + return None |
| 21 | + targetfs = target_fileset[state.target][0].id |
| 22 | + files = filesets[targetfs] |
| 23 | + entrypoint = None |
| 24 | + for file in files: |
| 25 | + if len(file.path_prefix): |
| 26 | + entrypoint = file.file.removeprefix("file://") |
| 27 | + break |
| 28 | + return entrypoint |
| 29 | + |
| 30 | +def _spawn(ctx: task_context, state: struct, args: list[str]) -> std.process.child: |
| 31 | + entrypoint = _determine_entrypoint(state) |
| 32 | + runfiles = entrypoint + ".runfiles" |
| 33 | + return ctx.std.process.command(entrypoint)\ |
| 34 | + .current_dir(runfiles) \ |
| 35 | + .env("RUNFILES_DIR", runfiles) \ |
| 36 | + .env("JAVA_RUNFILES", runfiles) \ |
| 37 | + .env("RUNFILES_MANIFEST_FILE", runfiles + "_manifest") \ |
| 38 | + .env("BUILD_WORKSPACE_DIRECTORY", "TODO") \ |
| 39 | + .env("BUILD_WORKING_DIRECTORY", ctx.std.env.current_dir()) \ |
| 40 | + .args(args) \ |
| 41 | + .spawn() |
| 42 | + |
| 43 | +def runnable(ctx) -> struct: |
| 44 | + state = struct( |
| 45 | + ctx = ctx, |
| 46 | + target = "@@lcov+//:lcov", # TODO(alexeagle): we can assume there's only one target |
| 47 | + filesets = {}, |
| 48 | + target_fileset = {} |
| 49 | + ) |
| 50 | + |
| 51 | + return struct( |
| 52 | + event = lambda event: _process_bes(state, event), |
| 53 | + spawn = lambda ctx, args: _spawn(ctx, state, args), |
| 54 | + ) |
| 55 | + |
| 56 | +spawn = _spawn |
0 commit comments