# 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_files = True, single_file = True, ), }, outputs = {"out": "%{name}.tar"}, )