def _pkg_archive_impl(repository_ctx):
repository_ctx.file("BUILD.bazel", repository_ctx.attr.build_file_content)
if not repository_ctx.which("pkgutil"):
# pkgutil is macOS-only; skip download on other platforms
return
url = repository_ctx.attr.url
(ignored, ignored, pkg_name) = url.rpartition("/")
idx = pkg_name.find("?")
if idx != -1:
pkg_name = pkg_name[0:idx]
pkg_name = pkg_name.replace("%20", "_")
attrs = {
"output": pkg_name + ".download",
}
if repository_ctx.attr.sha256:
attrs.update({"sha256": repository_ctx.attr.sha256})
repository_ctx.download(
url,
**attrs
)
repository_ctx.execute([
repository_ctx.which("pkgutil"),
"--expand-full",
pkg_name + ".download",
pkg_name,
])
for (key, value) in repository_ctx.attr.move.items():
repository_ctx.execute(["mv", pkg_name + "/" + key, value])
pkg_archive = repository_rule(
_pkg_archive_impl,
attrs = {
"url": attr.string(
mandatory = True,
),
"sha256": attr.string(),
"move": attr.string_dict(),
"build_file_content": attr.string(),
"build_file": attr.label(),
},
)