a667b4c439
Buildifier is now also used for formatting .bzl files. This change was created by running buildifier 0.12 over our source tree. Change-Id: I9f15112d4fe23e5cec0700cfe47f1ca649f61d2a
322 lines
8.0 KiB
Python
322 lines
8.0 KiB
Python
def documentation_attributes():
|
|
return [
|
|
"toc2",
|
|
'newline="\\n"',
|
|
'asterisk="*"',
|
|
'plus="+"',
|
|
'caret="^"',
|
|
'startsb="["',
|
|
'endsb="]"',
|
|
'tilde="~"',
|
|
"last-update-label!",
|
|
"source-highlighter=prettify",
|
|
"stylesheet=DEFAULT",
|
|
"linkcss=true",
|
|
"prettifydir=.",
|
|
# Just a placeholder, will be filled in asciidoctor java binary:
|
|
"revnumber=%s",
|
|
]
|
|
|
|
def _replace_macros_impl(ctx):
|
|
cmd = [
|
|
ctx.file._exe.path,
|
|
"--suffix",
|
|
ctx.attr.suffix,
|
|
"-s",
|
|
ctx.file.src.path,
|
|
"-o",
|
|
ctx.outputs.out.path,
|
|
]
|
|
if ctx.attr.searchbox:
|
|
cmd.append("--searchbox")
|
|
else:
|
|
cmd.append("--no-searchbox")
|
|
ctx.actions.run_shell(
|
|
inputs = [ctx.file._exe, ctx.file.src],
|
|
outputs = [ctx.outputs.out],
|
|
command = cmd,
|
|
use_default_shell_env = True,
|
|
progress_message = "Replacing macros in %s" % ctx.file.src.short_path,
|
|
)
|
|
|
|
_replace_macros = rule(
|
|
attrs = {
|
|
"_exe": attr.label(
|
|
default = Label("//Documentation:replace_macros.py"),
|
|
allow_single_file = True,
|
|
),
|
|
"src": attr.label(
|
|
mandatory = True,
|
|
allow_single_file = [".txt"],
|
|
),
|
|
"suffix": attr.string(mandatory = True),
|
|
"searchbox": attr.bool(default = True),
|
|
"out": attr.output(mandatory = True),
|
|
},
|
|
implementation = _replace_macros_impl,
|
|
)
|
|
|
|
def _generate_asciidoc_args(ctx):
|
|
args = []
|
|
if ctx.attr.backend:
|
|
args.extend(["-b", ctx.attr.backend])
|
|
revnumber = False
|
|
for attribute in ctx.attr.attributes:
|
|
if attribute.startswith("revnumber="):
|
|
revnumber = True
|
|
else:
|
|
args.extend(["-a", attribute])
|
|
if revnumber:
|
|
args.extend([
|
|
"--revnumber-file",
|
|
ctx.file.version.path,
|
|
])
|
|
for src in ctx.files.srcs:
|
|
args.append(src.path)
|
|
return args
|
|
|
|
def _invoke_replace_macros(name, src, suffix, searchbox):
|
|
fn = src
|
|
if fn.startswith(":"):
|
|
fn = src[1:]
|
|
|
|
_replace_macros(
|
|
name = "macros_%s_%s" % (name, fn),
|
|
src = src,
|
|
out = fn + suffix,
|
|
suffix = suffix,
|
|
searchbox = searchbox,
|
|
)
|
|
|
|
return ":" + fn + suffix, fn.replace(".txt", ".html")
|
|
|
|
def _asciidoc_impl(ctx):
|
|
args = [
|
|
"--bazel",
|
|
"--in-ext",
|
|
".txt" + ctx.attr.suffix,
|
|
"--out-ext",
|
|
".html",
|
|
]
|
|
args.extend(_generate_asciidoc_args(ctx))
|
|
ctx.actions.run(
|
|
inputs = ctx.files.srcs + [ctx.executable._exe, ctx.file.version],
|
|
outputs = ctx.outputs.outs,
|
|
executable = ctx.executable._exe,
|
|
arguments = args,
|
|
progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
|
|
)
|
|
|
|
_asciidoc_attrs = {
|
|
"_exe": attr.label(
|
|
default = Label("//java/com/google/gerrit/asciidoctor:asciidoc"),
|
|
cfg = "host",
|
|
allow_files = True,
|
|
executable = True,
|
|
),
|
|
"srcs": attr.label_list(
|
|
mandatory = True,
|
|
allow_files = True,
|
|
),
|
|
"version": attr.label(
|
|
default = Label("//:version.txt"),
|
|
allow_single_file = True,
|
|
),
|
|
"suffix": attr.string(mandatory = True),
|
|
"backend": attr.string(),
|
|
"attributes": attr.string_list(),
|
|
}
|
|
|
|
_asciidoc = rule(
|
|
attrs = dict(_asciidoc_attrs.items() + {
|
|
"outs": attr.output_list(mandatory = True),
|
|
}.items()),
|
|
implementation = _asciidoc_impl,
|
|
)
|
|
|
|
def _genasciidoc_htmlonly(
|
|
name,
|
|
srcs = [],
|
|
attributes = [],
|
|
backend = None,
|
|
searchbox = True,
|
|
**kwargs):
|
|
SUFFIX = "." + name + "_macros"
|
|
new_srcs = []
|
|
outs = ["asciidoctor.css"]
|
|
|
|
for src in srcs:
|
|
new_src, html_name = _invoke_replace_macros(name, src, SUFFIX, searchbox)
|
|
new_srcs.append(new_src)
|
|
outs.append(html_name)
|
|
|
|
_asciidoc(
|
|
name = name + "_gen",
|
|
srcs = new_srcs,
|
|
suffix = SUFFIX,
|
|
backend = backend,
|
|
attributes = attributes,
|
|
outs = outs,
|
|
)
|
|
|
|
native.filegroup(
|
|
name = name,
|
|
data = outs,
|
|
**kwargs
|
|
)
|
|
|
|
def genasciidoc(
|
|
name,
|
|
srcs = [],
|
|
attributes = [],
|
|
backend = None,
|
|
searchbox = True,
|
|
resources = True,
|
|
**kwargs):
|
|
SUFFIX = "_htmlonly"
|
|
|
|
_genasciidoc_htmlonly(
|
|
name = name + SUFFIX if resources else name,
|
|
srcs = srcs,
|
|
attributes = attributes,
|
|
backend = backend,
|
|
searchbox = searchbox,
|
|
**kwargs
|
|
)
|
|
|
|
if resources:
|
|
htmlonly = ":" + name + SUFFIX
|
|
native.filegroup(
|
|
name = name,
|
|
srcs = [
|
|
htmlonly,
|
|
"//Documentation:resources",
|
|
],
|
|
**kwargs
|
|
)
|
|
|
|
def _asciidoc_html_zip_impl(ctx):
|
|
args = [
|
|
"--mktmp",
|
|
"-z",
|
|
ctx.outputs.out.path,
|
|
"--in-ext",
|
|
".txt" + ctx.attr.suffix,
|
|
"--out-ext",
|
|
".html",
|
|
]
|
|
args.extend(_generate_asciidoc_args(ctx))
|
|
ctx.actions.run(
|
|
inputs = ctx.files.srcs + [ctx.file.version],
|
|
outputs = [ctx.outputs.out],
|
|
tools = [ctx.executable._exe],
|
|
executable = ctx.executable._exe,
|
|
arguments = args,
|
|
progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
|
|
)
|
|
|
|
_asciidoc_html_zip = rule(
|
|
attrs = _asciidoc_attrs,
|
|
outputs = {
|
|
"out": "%{name}.zip",
|
|
},
|
|
implementation = _asciidoc_html_zip_impl,
|
|
)
|
|
|
|
def _genasciidoc_htmlonly_zip(
|
|
name,
|
|
srcs = [],
|
|
attributes = [],
|
|
backend = None,
|
|
searchbox = True,
|
|
**kwargs):
|
|
SUFFIX = "." + name + "_expn"
|
|
new_srcs = []
|
|
|
|
for src in srcs:
|
|
new_src, _ = _invoke_replace_macros(name, src, SUFFIX, searchbox)
|
|
new_srcs.append(new_src)
|
|
|
|
_asciidoc_html_zip(
|
|
name = name,
|
|
srcs = new_srcs,
|
|
suffix = SUFFIX,
|
|
backend = backend,
|
|
attributes = attributes,
|
|
)
|
|
|
|
def _asciidoc_zip_impl(ctx):
|
|
tmpdir = ctx.outputs.out.path + "_tmpdir"
|
|
cmd = [
|
|
"p=$PWD",
|
|
"rm -rf %s" % tmpdir,
|
|
"mkdir -p %s/%s/" % (tmpdir, ctx.attr.directory),
|
|
"unzip -q %s -d %s/%s/" % (ctx.file.src.path, tmpdir, ctx.attr.directory),
|
|
]
|
|
for r in ctx.files.resources:
|
|
if r.path == r.short_path:
|
|
cmd.append("tar -cf- %s | tar -C %s -xf-" % (r.short_path, tmpdir))
|
|
else:
|
|
parent = r.path[:-len(r.short_path)]
|
|
cmd.append(
|
|
"tar -C %s -cf- %s | tar -C %s -xf-" % (parent, r.short_path, tmpdir),
|
|
)
|
|
cmd.extend([
|
|
"cd %s" % tmpdir,
|
|
"zip -qr $p/%s *" % ctx.outputs.out.path,
|
|
])
|
|
ctx.actions.run_shell(
|
|
inputs = [ctx.file.src] + ctx.files.resources,
|
|
outputs = [ctx.outputs.out],
|
|
command = " && ".join(cmd),
|
|
progress_message =
|
|
"Generating asciidoctor zip file %s" % ctx.outputs.out.short_path,
|
|
)
|
|
|
|
_asciidoc_zip = rule(
|
|
attrs = {
|
|
"src": attr.label(
|
|
mandatory = True,
|
|
allow_single_file = [".zip"],
|
|
),
|
|
"resources": attr.label_list(
|
|
mandatory = True,
|
|
allow_files = True,
|
|
),
|
|
"directory": attr.string(mandatory = True),
|
|
},
|
|
outputs = {
|
|
"out": "%{name}.zip",
|
|
},
|
|
implementation = _asciidoc_zip_impl,
|
|
)
|
|
|
|
def genasciidoc_zip(
|
|
name,
|
|
srcs = [],
|
|
attributes = [],
|
|
directory = None,
|
|
backend = None,
|
|
searchbox = True,
|
|
resources = True,
|
|
**kwargs):
|
|
SUFFIX = "_htmlonly"
|
|
|
|
_genasciidoc_htmlonly_zip(
|
|
name = name + SUFFIX if resources else name,
|
|
srcs = srcs,
|
|
attributes = attributes,
|
|
backend = backend,
|
|
searchbox = searchbox,
|
|
**kwargs
|
|
)
|
|
|
|
if resources:
|
|
htmlonly = ":" + name + SUFFIX
|
|
_asciidoc_zip(
|
|
name = name,
|
|
src = htmlonly,
|
|
resources = ["//Documentation:resources"],
|
|
directory = directory,
|
|
)
|