David Pursehouse | 2d08500 | 2016-12-11 19:00:10 +0900 | [diff] [blame] | 1 | GERRIT = "GERRIT:" |
| 2 | |
| 3 | GERRIT_API = "GERRIT_API:" |
| 4 | |
| 5 | MAVEN_CENTRAL = "MAVEN_CENTRAL:" |
| 6 | |
| 7 | MAVEN_LOCAL = "MAVEN_LOCAL:" |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 8 | |
David Ostrovsky | a9c4565 | 2018-12-28 09:23:12 +0100 | [diff] [blame] | 9 | ECLIPSE = "ECLIPSE:" |
| 10 | |
David Ostrovsky | ad61c85 | 2019-01-14 07:11:04 +0100 | [diff] [blame] | 11 | MAVEN_SNAPSHOT = "https://oss.sonatype.org/content/repositories/snapshots" |
| 12 | |
| 13 | SNAPSHOT = "-SNAPSHOT-" |
| 14 | |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 15 | def _maven_release(ctx, parts): |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 16 | """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 Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 26 | |
David Ostrovsky | ad61c85 | 2019-01-14 07:11:04 +0100 | [diff] [blame] | 27 | 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 Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 42 | jar = artifact.lower() + "-" + file_version |
David Ostrovsky | ad61c85 | 2019-01-14 07:11:04 +0100 | [diff] [blame] | 43 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 44 | url = "/".join([ |
David Ostrovsky | ad61c85 | 2019-01-14 07:11:04 +0100 | [diff] [blame] | 45 | repository, |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 46 | group.replace(".", "/"), |
| 47 | artifact, |
| 48 | version, |
| 49 | artifact + "-" + file_version, |
| 50 | ]) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 51 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 52 | return jar, url |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 53 | |
| 54 | # Creates a struct containing the different parts of an artifact's FQN |
| 55 | def _create_coordinates(fully_qualified_name): |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 56 | parts = fully_qualified_name.split(":") |
| 57 | packaging = None |
| 58 | classifier = None |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 59 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 60 | if len(parts) == 3: |
| 61 | group_id, artifact_id, version = parts |
| 62 | elif len(parts) == 4: |
David Ostrovsky | 7d8ad56 | 2021-02-26 18:49:37 +0100 | [diff] [blame] | 63 | group_id, artifact_id, version, classifier = parts |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 64 | 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 Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 68 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 69 | 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 Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 77 | |
Paladox none | 6e5f8e6 | 2017-01-28 15:16:29 +0000 | [diff] [blame] | 78 | def _format_deps(attr, deps): |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 79 | 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 none | 6e5f8e6 | 2017-01-28 15:16:29 +0000 | [diff] [blame] | 89 | |
David Ostrovsky | 1cbeda4 | 2017-05-06 06:35:48 +0200 | [diff] [blame] | 90 | def _generate_build_files(ctx, binjar, srcjar): |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 91 | 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 Ostrovsky | 1cbeda4 | 2017-05-06 06:35:48 +0200 | [diff] [blame] | 96 | {header} |
David Ostrovsky | 6178657 | 2019-12-24 17:04:44 +0100 | [diff] [blame] | 97 | load("@rules_java//java:defs.bzl", "java_import") |
Han-Wen Nienhuys | c1a6976 | 2016-11-29 15:06:30 +0100 | [diff] [blame] | 98 | package(default_visibility = ['//visibility:public']) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 99 | java_import( |
Han-Wen Nienhuys | c1a6976 | 2016-11-29 15:06:30 +0100 | [diff] [blame] | 100 | name = 'jar', |
Han-Wen Nienhuys | c1a6976 | 2016-11-29 15:06:30 +0100 | [diff] [blame] | 101 | jars = ['{binjar}'], |
Paladox none | 6e5f8e6 | 2017-01-28 15:16:29 +0000 | [diff] [blame] | 102 | {srcjar_attr} |
| 103 | {deps} |
| 104 | {exports} |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 105 | ) |
David Ostrovsky | c13a3db | 2016-12-10 15:19:05 +0100 | [diff] [blame] | 106 | java_import( |
| 107 | name = 'neverlink', |
| 108 | jars = ['{binjar}'], |
| 109 | neverlink = 1, |
Paladox none | 6e5f8e6 | 2017-01-28 15:16:29 +0000 | [diff] [blame] | 110 | {deps} |
| 111 | {exports} |
David Ostrovsky | c13a3db | 2016-12-10 15:19:05 +0100 | [diff] [blame] | 112 | ) |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 113 | \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 Nienhuys | c1a6976 | 2016-11-29 15:06:30 +0100 | [diff] [blame] | 122 | java_import( |
| 123 | name = 'src', |
| 124 | jars = ['{srcjar}'], |
| 125 | ) |
| 126 | """.format(srcjar = srcjar) |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 127 | ctx.file("%s/BUILD" % ctx.path("jar"), contents, False) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 128 | |
| 129 | def _maven_jar_impl(ctx): |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 130 | """rule to download a Maven archive.""" |
| 131 | coordinates = _create_coordinates(ctx.attr.artifact) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 132 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 133 | name = ctx.name |
| 134 | sha1 = ctx.attr.sha1 |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 135 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 136 | parts = ctx.attr.artifact.split(":") |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 137 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 138 | jar, url = _maven_release(ctx, parts) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 139 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 140 | binjar = jar + ".jar" |
| 141 | binjar_path = ctx.path("/".join(["jar", binjar])) |
| 142 | binurl = url + ".jar" |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 143 | |
David Ostrovsky | 2b5fe09 | 2021-03-03 11:52:30 +0100 | [diff] [blame] | 144 | python = ctx.which("python3") |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 145 | script = ctx.path(ctx.attr._download_script) |
David Ostrovsky | 899edce | 2016-11-14 09:56:33 -0800 | [diff] [blame] | 146 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 147 | args = [python, script, "-o", binjar_path, "-u", binurl] |
| 148 | if ctx.attr.sha1: |
| 149 | args.extend(["-v", sha1]) |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 150 | for x in ctx.attr.exclude: |
| 151 | args.extend(["-x", x]) |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 152 | |
David Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 153 | out = ctx.execute(args) |
Han-Wen Nienhuys | c1a6976 | 2016-11-29 15:06:30 +0100 | [diff] [blame] | 154 | |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 155 | if out.return_code: |
David Ostrovsky | 75076df | 2019-06-08 18:16:08 +0200 | [diff] [blame] | 156 | fail("failed %s: %s" % (args, out.stderr)) |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 157 | |
| 158 | srcjar = None |
| 159 | if ctx.attr.src_sha1 or ctx.attr.attach_source: |
| 160 | srcjar = jar + "-src.jar" |
David Ostrovsky | 7d8ad56 | 2021-02-26 18:49:37 +0100 | [diff] [blame] | 161 | srcurl = url |
| 162 | if coordinates.classifier != None: |
| 163 | srcurl = url.replace("-" + coordinates.classifier, "") |
| 164 | srcurl += "-sources.jar" |
Han-Wen Nienhuys | b6a4048 | 2018-07-10 11:51:36 +0200 | [diff] [blame] | 165 | 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 Ostrovsky | 6546085 | 2016-11-07 23:05:32 +0100 | [diff] [blame] | 174 | |
David Pursehouse | 2d08500 | 2016-12-11 19:00:10 +0900 | [diff] [blame] | 175 | maven_jar = repository_rule( |
| 176 | attrs = { |
| 177 | "artifact": attr.string(mandatory = True), |
David Pursehouse | 88d0885 | 2019-01-09 21:21:52 +0900 | [diff] [blame] | 178 | "attach_source": attr.bool(default = True), |
| 179 | "exclude": attr.string_list(), |
| 180 | "repository": attr.string(default = MAVEN_CENTRAL), |
Paladox none | cd9adc4 | 2017-01-28 14:45:40 +0000 | [diff] [blame] | 181 | "sha1": attr.string(), |
David Pursehouse | 2d08500 | 2016-12-11 19:00:10 +0900 | [diff] [blame] | 182 | "src_sha1": attr.string(), |
Paladox none | 6e5f8e6 | 2017-01-28 15:16:29 +0000 | [diff] [blame] | 183 | "exports": attr.string_list(), |
David Pursehouse | 88d0885 | 2019-01-09 21:21:52 +0900 | [diff] [blame] | 184 | "deps": attr.string_list(), |
| 185 | "_download_script": attr.label(default = Label("//tools:download_file.py")), |
David Pursehouse | 2d08500 | 2016-12-11 19:00:10 +0900 | [diff] [blame] | 186 | }, |
| 187 | local = True, |
| 188 | implementation = _maven_jar_impl, |
| 189 | ) |