| # Copyright 2017 The Bazel Authors. All rights reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Quick rule to build a Jekyll site.""" | |
| def _bucket_from_workspace_name(wname): | |
| """Try to assert the bucket name from the workspace name. | |
| E.g. it will answer www.bazel.build if the workspace name is build_bazel_www. | |
| Args: | |
| wname: workspace name | |
| Returns: | |
| the guessed name of the bucket for this workspace. | |
| """ | |
| revlist = [] | |
| for part in wname.split("_"): | |
| revlist.insert(0, part) | |
| return ".".join(revlist) | |
| def _impl(ctx): | |
| """Quick and non-hermetic rule to build a Jekyll site.""" | |
| source = ctx.actions.declare_directory(ctx.attr.name + "-srcs") | |
| output = ctx.actions.declare_directory(ctx.attr.name + "-build") | |
| ctx.actions.run_shell( | |
| inputs = ctx.files.srcs, | |
| outputs = [source], | |
| command = ("mkdir -p %s\n" % (source.path)) + | |
| "\n".join([ | |
| "tar xf %s -C %s" % (src.path, source.path) | |
| for src in ctx.files.srcs | |
| ]), | |
| ) | |
| ctx.actions.run( | |
| inputs = [source], | |
| outputs = [output], | |
| executable = "jekyll", | |
| use_default_shell_env = True, | |
| arguments = ["build", "-q", "-s", source.path, "-d", output.path], | |
| ) | |
| ctx.actions.run( | |
| inputs = [output], | |
| outputs = [ctx.outputs.out], | |
| executable = "tar", | |
| arguments = ["cf", ctx.outputs.out.path, "-C", output.path, "."], | |
| ) | |
| # Create a shell script to serve the site locally or push with the --push | |
| # flag. | |
| bucket = ctx.attr.bucket if ctx.attr.bucket else _bucket_from_workspace_name(ctx.workspace_name) | |
| ctx.actions.expand_template( | |
| template = ctx.file._jekyll_build_tpl, | |
| output = ctx.outputs.executable, | |
| substitutions = { | |
| "%{workspace_name}": ctx.workspace_name, | |
| "%{source_dir}": source.short_path, | |
| "%{prod_dir}": output.short_path, | |
| "%{bucket}": bucket, | |
| }, | |
| is_executable = True, | |
| ) | |
| return [DefaultInfo(runfiles = ctx.runfiles(files = [source, output]))] | |
| jekyll_build = rule( | |
| implementation = _impl, | |
| executable = True, | |
| attrs = { | |
| "srcs": attr.label_list(allow_empty = False), | |
| "bucket": attr.string(), | |
| "_jekyll_build_tpl": attr.label( | |
| default = ":jekyll_build.sh.tpl", | |
| allow_single_file = True, | |
| ), | |
| }, | |
| outputs = {"out": "%{name}.tar"}, | |
| ) |