| """Rule for generating integrity files | |
| Default output is a .sha256 file but .sha1 and .md5 files are also available | |
| via output groups. | |
| Based on https://github.com/bazelbuild/examples/blob/main/rules/implicit_output/hash.bzl | |
| """ | |
| def _hash(ctx, algo, file): | |
| coreutils = ctx.toolchains["@aspect_bazel_lib//lib:coreutils_toolchain_type"] | |
| out = ctx.actions.declare_file("{}.{}".format(file.basename, algo), sibling = file) | |
| ctx.actions.run_shell( | |
| outputs = [out], | |
| inputs = [file], | |
| tools = [coreutils.coreutils_info.bin], | |
| # coreutils has --no-names option but it doesn't work in current version, so we have to use cut. | |
| command = """HASH=$({coreutils} hashsum --{algo} {src} | {coreutils} cut -f1 -d " ") && {coreutils} echo -e "$HASH {basename}" > {out}""".format( | |
| coreutils = coreutils.coreutils_info.bin.path, | |
| algo = algo, | |
| src = file.path, | |
| basename = file.basename, | |
| out = out.path, | |
| ), | |
| ) | |
| return out | |
| def _impl(ctx): | |
| # Create actions to generate the three output files. | |
| # Actions are run only when the corresponding file is requested. | |
| md5out = _hash(ctx, "md5", ctx.file.src) | |
| sha1out = _hash(ctx, "sha1", ctx.file.src) | |
| sha256out = _hash(ctx, "sha256", ctx.file.src) | |
| # By default (if you run `bazel build` on this target, or if you use it as a | |
| # source of another target), only the sha256 is computed. | |
| return [ | |
| DefaultInfo( | |
| files = depset([sha256out]), | |
| ), | |
| OutputGroupInfo( | |
| md5 = depset([md5out]), | |
| sha1 = depset([sha1out]), | |
| sha256 = depset([sha256out]), | |
| ), | |
| ] | |
| _hashes = rule( | |
| implementation = _impl, | |
| toolchains = [ | |
| "@aspect_bazel_lib//lib:coreutils_toolchain_type", | |
| ], | |
| attrs = { | |
| "src": attr.label( | |
| allow_single_file = True, | |
| mandatory = True, | |
| ), | |
| }, | |
| ) | |
| def hashes(name, src, **kwargs): | |
| _hashes( | |
| name = name, | |
| src = src, | |
| **kwargs | |
| ) |