| # 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"}, | 
 | ) |