blob: adea89e6e235abad9c504c8f66ccf794fe2d9aba [file] [log] [blame]
David Pursehouse2d085002016-12-11 19:00:10 +09001GERRIT = "GERRIT:"
2
3GERRIT_API = "GERRIT_API:"
4
5MAVEN_CENTRAL = "MAVEN_CENTRAL:"
6
7MAVEN_LOCAL = "MAVEN_LOCAL:"
David Ostrovsky65460852016-11-07 23:05:32 +01008
David Ostrovskya9c45652018-12-28 09:23:12 +01009ECLIPSE = "ECLIPSE:"
10
David Ostrovskyad61c852019-01-14 07:11:04 +010011MAVEN_SNAPSHOT = "https://oss.sonatype.org/content/repositories/snapshots"
12
13SNAPSHOT = "-SNAPSHOT-"
14
David Ostrovsky65460852016-11-07 23:05:32 +010015def _maven_release(ctx, parts):
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020016 """induce jar and url name from maven coordinates."""
17 if len(parts) not in [3, 4]:
18 fail('%s:\nexpected id="groupId:artifactId:version[:classifier]"' %
19 ctx.attr.artifact)
20 if len(parts) == 4:
21 group, artifact, version, classifier = parts
22 file_version = version + "-" + classifier
23 else:
24 group, artifact, version = parts
25 file_version = version
David Ostrovsky65460852016-11-07 23:05:32 +010026
David Ostrovskyad61c852019-01-14 07:11:04 +010027 repository = ctx.attr.repository
28
29 if "-SNAPSHOT-" in version:
30 start = version.index(SNAPSHOT)
31 end = start + len(SNAPSHOT) - 1
32
33 # file version without snapshot constant, but with post snapshot suffix
34 file_version = version[:start] + version[end:]
35
36 # version without post snapshot suffix
37 version = version[:end]
38
39 # overwrite the repository with Maven snapshot repository
40 repository = MAVEN_SNAPSHOT
41
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020042 jar = artifact.lower() + "-" + file_version
David Ostrovskyad61c852019-01-14 07:11:04 +010043
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020044 url = "/".join([
David Ostrovskyad61c852019-01-14 07:11:04 +010045 repository,
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020046 group.replace(".", "/"),
47 artifact,
48 version,
49 artifact + "-" + file_version,
50 ])
David Ostrovsky65460852016-11-07 23:05:32 +010051
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020052 return jar, url
David Ostrovsky65460852016-11-07 23:05:32 +010053
54# Creates a struct containing the different parts of an artifact's FQN
55def _create_coordinates(fully_qualified_name):
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020056 parts = fully_qualified_name.split(":")
57 packaging = None
58 classifier = None
David Ostrovsky65460852016-11-07 23:05:32 +010059
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020060 if len(parts) == 3:
61 group_id, artifact_id, version = parts
62 elif len(parts) == 4:
David Ostrovsky7d8ad562021-02-26 18:49:37 +010063 group_id, artifact_id, version, classifier = parts
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020064 elif len(parts) == 5:
65 group_id, artifact_id, version, packaging, classifier = parts
66 else:
67 fail("Invalid fully qualified name for artifact: %s" % fully_qualified_name)
David Ostrovsky65460852016-11-07 23:05:32 +010068
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020069 return struct(
70 fully_qualified_name = fully_qualified_name,
71 group_id = group_id,
72 artifact_id = artifact_id,
73 packaging = packaging,
74 classifier = classifier,
75 version = version,
76 )
David Ostrovsky65460852016-11-07 23:05:32 +010077
Paladox none6e5f8e62017-01-28 15:16:29 +000078def _format_deps(attr, deps):
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020079 formatted_deps = ""
80 if deps:
81 if len(deps) == 1:
82 formatted_deps += "%s = [\'%s\']," % (attr, deps[0])
83 else:
84 formatted_deps += "%s = [\n" % attr
85 for dep in deps:
86 formatted_deps += " \'%s\',\n" % dep
87 formatted_deps += " ],"
88 return formatted_deps
Paladox none6e5f8e62017-01-28 15:16:29 +000089
David Ostrovsky1cbeda42017-05-06 06:35:48 +020090def _generate_build_files(ctx, binjar, srcjar):
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +020091 header = "# DO NOT EDIT: automatically generated BUILD file for maven_jar rule %s" % ctx.name
92 srcjar_attr = ""
93 if srcjar:
94 srcjar_attr = 'srcjar = "%s",' % srcjar
95 contents = """
David Ostrovsky1cbeda42017-05-06 06:35:48 +020096{header}
David Ostrovsky61786572019-12-24 17:04:44 +010097load("@rules_java//java:defs.bzl", "java_import")
Han-Wen Nienhuysc1a69762016-11-29 15:06:30 +010098package(default_visibility = ['//visibility:public'])
David Ostrovsky65460852016-11-07 23:05:32 +010099java_import(
Han-Wen Nienhuysc1a69762016-11-29 15:06:30 +0100100 name = 'jar',
Han-Wen Nienhuysc1a69762016-11-29 15:06:30 +0100101 jars = ['{binjar}'],
Paladox none6e5f8e62017-01-28 15:16:29 +0000102 {srcjar_attr}
103 {deps}
104 {exports}
David Ostrovsky65460852016-11-07 23:05:32 +0100105)
David Ostrovskyc13a3db2016-12-10 15:19:05 +0100106java_import(
107 name = 'neverlink',
108 jars = ['{binjar}'],
109 neverlink = 1,
Paladox none6e5f8e62017-01-28 15:16:29 +0000110 {deps}
111 {exports}
David Ostrovskyc13a3db2016-12-10 15:19:05 +0100112)
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200113\n""".format(
114 srcjar_attr = srcjar_attr,
115 header = header,
116 binjar = binjar,
117 deps = _format_deps("deps", ctx.attr.deps),
118 exports = _format_deps("exports", ctx.attr.exports),
119 )
120 if srcjar:
121 contents += """
Han-Wen Nienhuysc1a69762016-11-29 15:06:30 +0100122java_import(
123 name = 'src',
124 jars = ['{srcjar}'],
125)
126""".format(srcjar = srcjar)
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200127 ctx.file("%s/BUILD" % ctx.path("jar"), contents, False)
David Ostrovsky65460852016-11-07 23:05:32 +0100128
129def _maven_jar_impl(ctx):
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200130 """rule to download a Maven archive."""
131 coordinates = _create_coordinates(ctx.attr.artifact)
David Ostrovsky65460852016-11-07 23:05:32 +0100132
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200133 name = ctx.name
134 sha1 = ctx.attr.sha1
David Ostrovsky65460852016-11-07 23:05:32 +0100135
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200136 parts = ctx.attr.artifact.split(":")
David Ostrovsky65460852016-11-07 23:05:32 +0100137
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200138 jar, url = _maven_release(ctx, parts)
David Ostrovsky65460852016-11-07 23:05:32 +0100139
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200140 binjar = jar + ".jar"
141 binjar_path = ctx.path("/".join(["jar", binjar]))
142 binurl = url + ".jar"
David Ostrovsky65460852016-11-07 23:05:32 +0100143
David Ostrovsky2b5fe092021-03-03 11:52:30 +0100144 python = ctx.which("python3")
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200145 script = ctx.path(ctx.attr._download_script)
David Ostrovsky899edce2016-11-14 09:56:33 -0800146
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200147 args = [python, script, "-o", binjar_path, "-u", binurl]
148 if ctx.attr.sha1:
149 args.extend(["-v", sha1])
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200150 for x in ctx.attr.exclude:
151 args.extend(["-x", x])
David Ostrovsky65460852016-11-07 23:05:32 +0100152
David Ostrovsky65460852016-11-07 23:05:32 +0100153 out = ctx.execute(args)
Han-Wen Nienhuysc1a69762016-11-29 15:06:30 +0100154
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200155 if out.return_code:
David Ostrovsky75076df2019-06-08 18:16:08 +0200156 fail("failed %s: %s" % (args, out.stderr))
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200157
158 srcjar = None
159 if ctx.attr.src_sha1 or ctx.attr.attach_source:
160 srcjar = jar + "-src.jar"
David Ostrovsky7d8ad562021-02-26 18:49:37 +0100161 srcurl = url
162 if coordinates.classifier != None:
163 srcurl = url.replace("-" + coordinates.classifier, "")
164 srcurl += "-sources.jar"
Han-Wen Nienhuysb6a40482018-07-10 11:51:36 +0200165 srcjar_path = ctx.path("jar/" + srcjar)
166 args = [python, script, "-o", srcjar_path, "-u", srcurl]
167 if ctx.attr.src_sha1:
168 args.extend(["-v", ctx.attr.src_sha1])
169 out = ctx.execute(args)
170 if out.return_code:
171 fail("failed %s: %s" % (args, out.stderr))
172
173 _generate_build_files(ctx, binjar, srcjar)
David Ostrovsky65460852016-11-07 23:05:32 +0100174
David Pursehouse2d085002016-12-11 19:00:10 +0900175maven_jar = repository_rule(
176 attrs = {
177 "artifact": attr.string(mandatory = True),
David Pursehouse88d08852019-01-09 21:21:52 +0900178 "attach_source": attr.bool(default = True),
179 "exclude": attr.string_list(),
180 "repository": attr.string(default = MAVEN_CENTRAL),
Paladox nonecd9adc42017-01-28 14:45:40 +0000181 "sha1": attr.string(),
David Pursehouse2d085002016-12-11 19:00:10 +0900182 "src_sha1": attr.string(),
Paladox none6e5f8e62017-01-28 15:16:29 +0000183 "exports": attr.string_list(),
David Pursehouse88d08852019-01-09 21:21:52 +0900184 "deps": attr.string_list(),
185 "_download_script": attr.label(default = Label("//tools:download_file.py")),
David Pursehouse2d085002016-12-11 19:00:10 +0900186 },
187 local = True,
188 implementation = _maven_jar_impl,
189)