| def _impl(repository_ctx): |
| archive = repository_ctx.attr.name + ".tar" |
| reference = Label("@%s_unpatched//:README" % repository_ctx.attr.name) |
| dirname = repository_ctx.path(reference).dirname |
| repository_ctx.execute(["tar", "hcf", archive, "-C", dirname, "."]) |
| repository_ctx.extract(archive) |
| for patch in repository_ctx.attr.patches: |
| repository_ctx.patch(repository_ctx.path(patch), repository_ctx.attr.patch_strip) |
| build_file = repository_ctx.path(repository_ctx.attr.build_file) |
| repository_ctx.execute(["cp", build_file, "BUILD.bazel"]) |
| |
| _patched_rule = repository_rule( |
| implementation = _impl, |
| attrs = { |
| "build_file": attr.label(), |
| "patch_strip": attr.int(), |
| "patches": attr.label_list(), |
| }, |
| ) |
| |
| def new_patched_local_repository(name, path, **kwargs): |
| native.new_local_repository( |
| name = name + "_unpatched", |
| build_file_content = """ |
| pkg_tar(name = "content", srcs = glob(["**"])) |
| """, |
| path = path, |
| ) |
| _patched_rule(name = name, **kwargs) |
| |
| def _new_empty_repository_impl(repo_ctx): |
| build_file = repo_ctx.attr.build_file |
| build_file_content = repo_ctx.attr.build_file_content |
| if not (bool(build_file) != bool(build_file_content)): |
| fail("Exactly one of 'build_file' or 'build_file_content' is required") |
| |
| if build_file_content: |
| repo_ctx.file("BUILD", build_file_content) |
| elif build_file: |
| repo_ctx.template("BUILD", repo_ctx.attr.build_file, {}) |
| |
| new_empty_repository = repository_rule( |
| attrs = { |
| "build_file": attr.label(allow_files = True), |
| "build_file_content": attr.string(), |
| }, |
| implementation = _new_empty_repository_impl, |
| ) |
| |
| """Create an empty repository with the supplied BUILD file. |
| |
| This is mostly useful to create wrappers for specific target that we want |
| to be used with the '@' syntax. |
| """ |