| def _pkg_archive_impl(repository_ctx): |
| 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]) |
| |
| repository_ctx.file("BUILD.bazel", repository_ctx.attr.build_file_content) |
| |
| 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(), |
| }, |
| ) |