
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
180 lines
5.0 KiB
Python
180 lines
5.0 KiB
Python
GERRIT = "GERRIT:"
|
|
|
|
GERRIT_API = "GERRIT_API:"
|
|
|
|
MAVEN_CENTRAL = "MAVEN_CENTRAL:"
|
|
|
|
MAVEN_LOCAL = "MAVEN_LOCAL:"
|
|
|
|
def _maven_release(ctx, parts):
|
|
"""induce jar and url name from maven coordinates."""
|
|
if len(parts) not in [3, 4]:
|
|
fail('%s:\nexpected id="groupId:artifactId:version[:classifier]"' %
|
|
ctx.attr.artifact)
|
|
if len(parts) == 4:
|
|
group, artifact, version, classifier = parts
|
|
file_version = version + "-" + classifier
|
|
else:
|
|
group, artifact, version = parts
|
|
file_version = version
|
|
|
|
jar = artifact.lower() + "-" + file_version
|
|
url = "/".join([
|
|
ctx.attr.repository,
|
|
group.replace(".", "/"),
|
|
artifact,
|
|
version,
|
|
artifact + "-" + file_version,
|
|
])
|
|
|
|
return jar, url
|
|
|
|
# Creates a struct containing the different parts of an artifact's FQN
|
|
def _create_coordinates(fully_qualified_name):
|
|
parts = fully_qualified_name.split(":")
|
|
packaging = None
|
|
classifier = None
|
|
|
|
if len(parts) == 3:
|
|
group_id, artifact_id, version = parts
|
|
elif len(parts) == 4:
|
|
group_id, artifact_id, version, packaging = parts
|
|
elif len(parts) == 5:
|
|
group_id, artifact_id, version, packaging, classifier = parts
|
|
else:
|
|
fail("Invalid fully qualified name for artifact: %s" % fully_qualified_name)
|
|
|
|
return struct(
|
|
fully_qualified_name = fully_qualified_name,
|
|
group_id = group_id,
|
|
artifact_id = artifact_id,
|
|
packaging = packaging,
|
|
classifier = classifier,
|
|
version = version,
|
|
)
|
|
|
|
def _format_deps(attr, deps):
|
|
formatted_deps = ""
|
|
if deps:
|
|
if len(deps) == 1:
|
|
formatted_deps += "%s = [\'%s\']," % (attr, deps[0])
|
|
else:
|
|
formatted_deps += "%s = [\n" % attr
|
|
for dep in deps:
|
|
formatted_deps += " \'%s\',\n" % dep
|
|
formatted_deps += " ],"
|
|
return formatted_deps
|
|
|
|
def _generate_build_files(ctx, binjar, srcjar):
|
|
header = "# DO NOT EDIT: automatically generated BUILD file for maven_jar rule %s" % ctx.name
|
|
srcjar_attr = ""
|
|
if srcjar:
|
|
srcjar_attr = 'srcjar = "%s",' % srcjar
|
|
contents = """
|
|
{header}
|
|
package(default_visibility = ['//visibility:public'])
|
|
java_import(
|
|
name = 'jar',
|
|
jars = ['{binjar}'],
|
|
{srcjar_attr}
|
|
{deps}
|
|
{exports}
|
|
)
|
|
java_import(
|
|
name = 'neverlink',
|
|
jars = ['{binjar}'],
|
|
neverlink = 1,
|
|
{deps}
|
|
{exports}
|
|
)
|
|
\n""".format(
|
|
srcjar_attr = srcjar_attr,
|
|
header = header,
|
|
binjar = binjar,
|
|
deps = _format_deps("deps", ctx.attr.deps),
|
|
exports = _format_deps("exports", ctx.attr.exports),
|
|
)
|
|
if srcjar:
|
|
contents += """
|
|
java_import(
|
|
name = 'src',
|
|
jars = ['{srcjar}'],
|
|
)
|
|
""".format(srcjar = srcjar)
|
|
ctx.file("%s/BUILD" % ctx.path("jar"), contents, False)
|
|
|
|
# Compatibility layer for java_import_external from rules_closure
|
|
contents = """
|
|
{header}
|
|
package(default_visibility = ['//visibility:public'])
|
|
|
|
alias(
|
|
name = "{rule_name}",
|
|
actual = "@{rule_name}//jar",
|
|
)
|
|
\n""".format(rule_name = ctx.name, header = header)
|
|
ctx.file("BUILD", contents, False)
|
|
|
|
def _maven_jar_impl(ctx):
|
|
"""rule to download a Maven archive."""
|
|
coordinates = _create_coordinates(ctx.attr.artifact)
|
|
|
|
name = ctx.name
|
|
sha1 = ctx.attr.sha1
|
|
|
|
parts = ctx.attr.artifact.split(":")
|
|
|
|
# TODO(davido): Only releases for now, implement handling snapshots
|
|
jar, url = _maven_release(ctx, parts)
|
|
|
|
binjar = jar + ".jar"
|
|
binjar_path = ctx.path("/".join(["jar", binjar]))
|
|
binurl = url + ".jar"
|
|
|
|
python = ctx.which("python")
|
|
script = ctx.path(ctx.attr._download_script)
|
|
|
|
args = [python, script, "-o", binjar_path, "-u", binurl]
|
|
if ctx.attr.sha1:
|
|
args.extend(["-v", sha1])
|
|
if ctx.attr.unsign:
|
|
args.append("--unsign")
|
|
for x in ctx.attr.exclude:
|
|
args.extend(["-x", x])
|
|
|
|
out = ctx.execute(args)
|
|
|
|
if out.return_code:
|
|
fail("failed %s: %s" % (" ".join(args), out.stderr))
|
|
|
|
srcjar = None
|
|
if ctx.attr.src_sha1 or ctx.attr.attach_source:
|
|
srcjar = jar + "-src.jar"
|
|
srcurl = url + "-sources.jar"
|
|
srcjar_path = ctx.path("jar/" + srcjar)
|
|
args = [python, script, "-o", srcjar_path, "-u", srcurl]
|
|
if ctx.attr.src_sha1:
|
|
args.extend(["-v", ctx.attr.src_sha1])
|
|
out = ctx.execute(args)
|
|
if out.return_code:
|
|
fail("failed %s: %s" % (args, out.stderr))
|
|
|
|
_generate_build_files(ctx, binjar, srcjar)
|
|
|
|
maven_jar = repository_rule(
|
|
attrs = {
|
|
"artifact": attr.string(mandatory = True),
|
|
"sha1": attr.string(),
|
|
"src_sha1": attr.string(),
|
|
"_download_script": attr.label(default = Label("//tools:download_file.py")),
|
|
"repository": attr.string(default = MAVEN_CENTRAL),
|
|
"attach_source": attr.bool(default = True),
|
|
"unsign": attr.bool(default = False),
|
|
"deps": attr.string_list(),
|
|
"exports": attr.string_list(),
|
|
"exclude": attr.string_list(),
|
|
},
|
|
local = True,
|
|
implementation = _maven_jar_impl,
|
|
)
|