diff --git a/.gitignore b/.gitignore index 80489aaf3..13990b466 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ hash2 .vscode unformatted-*.backup.scala .scala-build -test/semanticdb/tempsrc \ No newline at end of file +test/semanticdb/tempsrc + +# From scripts/create_repository.py +repository-artifacts.json diff --git a/scripts/README.md b/scripts/README.md index dfc6a09cf..6a8c5fec6 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -6,56 +6,101 @@ - [Debugging](#debugging) - [Requirements](#requirements) -### About -The script allows to update a certain scala_x_x.bzl file and its content (artifact, sha, dependencies), by changing the value of `root_scala_version` variable. -It can be used to create non-existent file for chosen Scala version.
-It's using a [https://get-coursier.io/docs/](coursier) in order to **resolve** lists the transitive dependencies of dependencies and **fetch** the JARs of it. - -### Usage -Usage from `/rules_scala/scripts`: -```` -python3 create_repository.py -```` - -### Examples -Current value of `root_scala_versions`: +## About + +The script allows to update a certain scala_x_x.bzl file and its content +(artifact, sha, dependencies), by changing the value of `root_scala_version` +variable. + +It can be used to create non-existent file for chosen Scala version. + +It's using a [https://get-coursier.io/docs/](coursier) in order to **resolve** +lists the transitive dependencies of dependencies and **fetch** the JARs of it. + +## Usage + +Usage from the rules_scala root directory: + +```sh +./scripts/create_repository.py ``` -root_scala_versions = ["2.11.12", "2.12.19", "2.13.14", "3.1.3", "3.2.2", "3.3.3", "3.4.3", "3.5.0"] + +## Examples + +Current value of `root_scala_versions`: + +```py +root_scala_versions = [ + "2.11.12", + "2.12.19", + "2.13.14", + "3.1.3", + "3.2.2", + "3.3.3", + "3.4.3", + "3.5.0", +] ``` To **update** content of `scala_3_4.bzl` file: -``` -root_scala_versions = ["2.11.12", "2.12.19", "2.13.14", "3.1.3", "3.2.2", "3.3.3", "3.4.4", "3.5.0"] - ^^^^^^^ <- updated version + +```py +root_scala_versions = [ + "2.11.12", + "2.12.19", + "2.13.14", + "3.1.3", + "3.2.2", + "3.3.3", + "3.4.4", # <- updated version + "3.5.0" +] ``` To **create** new `scala_3_6.bzl` file: -``` -root_scala_versions = ["2.11.12", "2.12.19", "2.13.14", "3.1.3", "3.2.2", "3.3.3", "3.4.3", "3.5.0", "3.6.0"] - ^^^^^^^ <- new version -``` -### Debugging -Certain dependency version may not have a support for chosen Scala version e.g. +```py +root_scala_versions = [ + "2.11.12", + "2.12.19", + "2.13.14", + "3.1.3", + "3.2.2", + "3.3.3", + "3.4.3", + "3.5.0", + "3.6.0", # <- new version +] ``` + +## Debugging + +Certain dependency versions may not support a specific Scala versions, e.g., + +```py kind_projector_version = "0.13.2" if scala_major < "2.13" else "0.13.3" ``` -In order of that, there may be situations that script won't work. To debug that problem and adjust the values of hard-coded variables: -``` -scala_test_major = "3" if scala_major >= "3.0" else scala_major -scala_fmt_major = "2.13" if scala_major >= "3.0" else scala_major +There may be situations in which the script won't work. To debug that problem +and adjust the values of hard-coded variables: + +```py +scalatest_major = "3" if scala_major >= "3.0" else scala_major +scalafmt_major = "2.13" if scala_major >= "3.0" else scala_major kind_projector_version = "0.13.2" if scala_major < "2.13" else "0.13.3" -f"org.scalameta:scalafmt-core_{scala_fmt_major}:{"2.7.5" if scala_major == "2.11" else scala_fmt_version}" +scalafmt_version = "2.7.5" if scala_major == "2.11" else SCALAFMT_VERSION ``` -there is an option to print the output of these two subprocesses: -`output = subprocess.run(f'cs fetch {artifact}', capture_output=True, text=True, shell=True).stdout.splitlines()`
+there is an option to print the output of these two subprocesses: +```py + command = f'cs resolve {' '.join(root_artifacts)}' + output = subprocess.run( + command, capture_output=True, text=True, shell=True + ).stdout.splitlines() ``` - command = f'cs resolve {' '.join(root_artifacts)}' - output = subprocess.run(command, capture_output=True, text=True, shell=True).stdout.splitlines() -``` -### Requirements -Installed [Coursier](https://get-coursier.io/) and [Python 3](https://www.python.org/downloads/) \ No newline at end of file +## Requirements + +Install [Coursier](https://get-coursier.io/) and +[Python 3](https://www.python.org/downloads/) before running the script. diff --git a/scripts/create_repository.py b/scripts/create_repository.py old mode 100644 new mode 100755 index a0bb4df69..b39e8a477 --- a/scripts/create_repository.py +++ b/scripts/create_repository.py @@ -1,200 +1,426 @@ -import subprocess +#!/usr/bin/env python3 +"""Updates jar versions in third_party/repositories/scala_*.bzl files""" + from dataclasses import dataclass from pathlib import Path -from typing import List from typing import Dict -import urllib.request -import time +from typing import List + +import argparse +import ast import hashlib import json -import ast -import copy -import glob -import os +import re +import shutil +import subprocess +import sys +import urllib.request -root_scala_versions = ["2.11.12", "2.12.20", "2.13.15", "3.1.3", "3.2.2", "3.3.4", "3.4.3", "3.5.2"] -scala_test_version = "3.2.9" -scala_fmt_version = "3.0.0" +ROOT_SCALA_VERSIONS = [ + "2.11.12", + "2.12.20", + "2.13.15", + "3.1.3", + "3.2.2", + "3.3.4", + "3.4.3", + "3.5.2", +] +SCALATEST_VERSION = "3.2.9" +SCALAFMT_VERSION = "3.8.3" +PROTOBUF_JAVA_VERSION = "4.28.2" + +EXCLUDED_ARTIFACTS = set([ + "org.scala-lang.modules:scala-parser-combinators_2.11:1.0.4", +]) + +OUTPUT_DIR = Path(__file__).parent.parent / 'third_party' / 'repositories' +DOWNLOADED_ARTIFACTS_FILE = 'repository-artifacts.json' @dataclass class MavenCoordinates: - group: str - artifact: str - version: str - coordinate: str + group: str + artifact: str + version: str + coordinate: str + + def artifact_name(self): + return f'{self.group}:{self.artifact}' @dataclass class ResolvedArtifact: - coordinates: MavenCoordinates - checksum: str - direct_dependencies: List[MavenCoordinates] - -def select_root_artifacts(scala_version) -> List[str]: - scala_major = ".".join(scala_version.split(".")[:2]) - scala_test_major = "3" if scala_major >= "3.0" else scala_major - scala_fmt_major = "2.13" if scala_major >= "3.0" else scala_major - kind_projector_version = "0.13.2" if scala_major < "2.12" else "0.13.3" - - common_root_artifacts = [ - f"org.scalatest:scalatest_{scala_test_major}:{scala_test_version}", - f"org.scalameta:scalafmt-core_{scala_fmt_major}:{"2.7.5" if scala_major == "2.11" else scala_fmt_version}" - ] - - scala_artifacts = [ - f'org.scala-lang:scala3-library_3:{scala_version}', - f'org.scala-lang:scala3-compiler_3:{scala_version}', - f'org.scala-lang:scala3-interfaces:{scala_version}', - f'org.scala-lang:tasty-core_3:{scala_version}' - ] if scala_major[0] == "3" else [ + coordinates: MavenCoordinates + checksum: str + direct_dependencies: List[MavenCoordinates] + +class CreateRepositoryError(Exception): + pass + +def select_root_artifacts(scala_version, scala_major, is_scala_3) -> List[str]: + scalatest_major = "3" if is_scala_3 else scala_major + scalafmt_major = "2.13" if is_scala_3 else scala_major + kind_projector_version = "0.13.2" if scala_major < "2.12" else "0.13.3" + scalafmt_version = "2.7.5" if scala_major == "2.11" else SCALAFMT_VERSION + + common_root_artifacts = [ + f"com.google.protobuf:protobuf-java:{PROTOBUF_JAVA_VERSION}", + f"org.scalatest:scalatest_{scalatest_major}:{SCALATEST_VERSION}", + f"org.scalameta:scalafmt-core_{scalafmt_major}:{scalafmt_version}" + ] + scala_artifacts = [ + f'org.scala-lang:scala3-library_3:{scala_version}', + f'org.scala-lang:scala3-compiler_3:{scala_version}', + f'org.scala-lang:scala3-interfaces:{scala_version}', + f'org.scala-lang:tasty-core_3:{scala_version}' + ] if scala_major[0] == "3" else [ f'org.scala-lang:scala-library:{scala_version}', f'org.scala-lang:scala-compiler:{scala_version}', f'org.scala-lang:scala-reflect:{scala_version}', f'org.scalameta:semanticdb-scalac_{scala_version}:4.9.9', f'org.typelevel:kind-projector_{scala_version}:{kind_projector_version}' - ] - - return common_root_artifacts + scala_artifacts + ] + return common_root_artifacts + scala_artifacts def get_maven_coordinates(artifact) -> MavenCoordinates: - splitted = artifact.split(':') - version = splitted[2] if splitted[2][0].isnumeric() else splitted[3] - return MavenCoordinates(splitted[0], splitted[1], version, artifact) + # There are Maven artifacts that contain extra components like `:jar` in + # their coordinates. However, the groupId and artifactId are always the + # first two components, and the version is the last. + parts = artifact.split(':') + return MavenCoordinates(parts[0], parts[1], parts[-1], artifact) def get_mavens_coordinates_from_json(artifacts) -> List[MavenCoordinates]: - return list(map(lambda artifact: get_maven_coordinates(artifact), artifacts)) + return list(map(get_maven_coordinates, artifacts)) + +def run_command(command, description): + """Runs a command and emits its output only on error. + + Args: + command: the shell command to run + description: prefixed to the error message on failure + + Returns: + the CompletedProcess object on success, None on error + + Raises: + CreateRepositoryError if the command fails + """ + try: + return subprocess.run( + command, capture_output=True, text=True, shell=True, check=True + ) + + except subprocess.CalledProcessError as err: + err_msg = "\n".join([ + f'{description} failed for command: {err.cmd}', + err.stderr + ]) + raise CreateRepositoryError(err_msg) from err def get_artifact_checksum(artifact) -> str: - output = subprocess.run(f'cs fetch {artifact}', capture_output=True, text=True, shell=True).stdout.splitlines() - possible_url = [o for o in output if "https" in o][0] - possible_url = possible_url[possible_url.find("https"):].replace('https/', 'https://') + proc = run_command( + f'cs fetch {artifact}', 'Fetching artifact for checksumming', + ) + + possible_url = [o for o in proc.stdout.splitlines() if "https" in o][0] + possible_url = possible_url[possible_url.find("https"):] + possible_url = possible_url.replace('https/', 'https://') + try: with urllib.request.urlopen(possible_url) as value: - body = value.read() - return hashlib.sha256(body).hexdigest() + return hashlib.sha256(value.read()).hexdigest() + except urllib.error.HTTPError as e: - print(f'RESOURCES NOT FOUND: {possible_url}') + print(f'RESOURCES NOT FOUND: {possible_url}: {e}') + return 'NO_CHECKSUM_FOUND' def get_json_dependencies(artifact) -> List[MavenCoordinates]: - with open('out.json') as file: - data = json.load(file) - return get_mavens_coordinates_from_json(dependency["directDependencies"]) if any((dependency := d)["coord"] == artifact for d in data["dependencies"]) else [] - -def get_label(coordinate) -> str: - if ("org.scala-lang" in coordinate.group or "org.scalatest" in coordinate.group or "org.scalactic" in coordinate.group or "com.twitter" in coordinate.group or "javax.annotation" in coordinate.group) and "scala-collection" not in coordinate.artifact and "scalap" not in coordinate.artifact: - return "io_bazel_rules_scala_" + coordinate.artifact.split('_')[0].replace('-', '_') - elif "org.openjdk.jmh" in coordinate.group or "org.ow2.asm" in coordinate.group or "net.sf.jopt-simple" in coordinate.group or "org.apache.commons" in coordinate.group or "junit" in coordinate.group or "org.hamcrest" in coordinate.group or "org.specs2" in coordinate.group: - return "io_bazel_rules_scala_" + coordinate.group.replace('.', '_').replace('-', '_') + '_' + coordinate.artifact.split('_')[0].replace('-', '_') - elif "mustache" in coordinate.group or "guava" in coordinate.group or "scopt" in coordinate.group: - return "io_bazel_rules_scala_" + coordinate.group.split('.')[-1] - elif "com.thesamet.scalapb" in coordinate.group or "io." in coordinate.group or "com.google.guava" in coordinate.group: - return "scala_proto_rules_" + coordinate.artifact.split('_')[0].replace('-', '_') - else: - return (coordinate.group.replace('.', '_').replace('-', '_') + '_' + coordinate.artifact.split('_')[0].replace('-', '_')).replace('_v2', '') - -def map_to_resolved_artifacts(output) -> List[ResolvedArtifact]: - resolved_artifacts = [] - subprocess.call(f'cs fetch {' '.join(output)} --json-output-file out.json', shell=True) - for o in output: - replaced = o.replace(':default','') - coordinates = get_maven_coordinates(replaced) - checksum = get_artifact_checksum(replaced) - direct_dependencies = get_json_dependencies(replaced) - resolved_artifacts.append(ResolvedArtifact(coordinates, checksum, direct_dependencies)) - return resolved_artifacts - -def resolve_artifacts_with_checksums_and_direct_dependencies(root_artifacts) -> List[ResolvedArtifact]: - command = f'cs resolve {' '.join(root_artifacts)}' - proc = subprocess.run(command, capture_output=True, text=True, shell=True) - print(proc.stderr) - output = proc.stdout.splitlines() - return map_to_resolved_artifacts(output) - -def to_rules_scala_compatible_dict(artifacts, version) -> Dict[str, Dict]: - temp = {} - - for a in artifacts: - label = get_label(a.coordinates).replace('scala3_', 'scala_').replace('scala_tasty_core', 'scala_scala_tasty_core') - deps = [f'@{get_label(dep)}_2' if "scala3-library_3" in a.coordinates.artifact else f'@{get_label(dep)}' for dep in a.direct_dependencies] - - temp[label] = { - "artifact": f"{a.coordinates.coordinate}", - "sha256": f"{a.checksum}", - } if not deps else { - "artifact": f"{a.coordinates.coordinate}", - "sha256": f"{a.checksum}", - "deps:": deps, - } - - return temp - -def is_that_trailing_coma(content, char, indice) -> bool: - return content[indice] == char and content[indice+1] != ',' and content[indice+1] != ':' and content[indice+1] != '@' and not content[indice+1].isalnum() - -def get_with_trailing_commas(content) -> str: - copied = copy.deepcopy(content) - content_length = len(copied) - i = 0 - - while i < content_length - 1: - if is_that_trailing_coma(copied, '"', i): - copied = copied[:i] + '",' + copied[i + 1:] - content_length = content_length + 1 - i = i+2 - elif is_that_trailing_coma(copied, ']', i): - copied = copied[:i] + '],' + copied[i + 1:] - content_length = content_length + 1 - i = i+2 - elif is_that_trailing_coma(copied, '}', i): - copied = copied[:i] + '},' + copied[i + 1:] - content_length = content_length + 1 - i = i+2 - else: - i = i+1 - - return copied + with open(DOWNLOADED_ARTIFACTS_FILE, 'r', encoding='utf-8') as file: + data = json.load(file) + + return ( + get_mavens_coordinates_from_json(dep["directDependencies"]) + if any((dep := d)["coord"] == artifact for d in data["dependencies"]) + else [] + ) + +ARTIFACT_LABEL_ONLY_GROUPS = set([ + "com.google.guava", + "com.twitter", + "javax.annotation", + "org.scalactic", + "org.scalatest", +]) + +GROUP_AND_ARTIFACT_LABEL_GROUPS = set([ + "junit", + "net.sf.jopt-simple", + "org.apache.commons", + "org.hamcrest", + "org.openjdk.jmh", + "org.ow2.asm", + "org.specs2", +]) + +SCALA_PROTO_RULES_GROUPS = set([ + "com.google.api.grpc", + "com.google.instrumentation", + "com.lmax", + "com.thesamet.scalapb", + "dev.dirs.directories", + "io.grpc", + "io.netty", + "io.opencensus", + "io.perfmark", +]) + +SPECIAL_CASE_GROUP_LABELS = { + "com.github.scopt": "io_bazel_rules_scala_scopt", + "com.github.spullara.mustache.java": "io_bazel_rules_scala_mustache", +} + +SCALA_LANG_GROUPS = set(['org.scala-lang', 'org.scala-lang.modules']) +SCALA_2_ARTIFACTS = set(['scala-library', 'scala-compiler', 'scala-reflect']) + +def get_scala_lang_label(artifact_label, is_scala_3, coordinates): + artifact = coordinates.artifact + if artifact == 'scalap': + return 'org_scala_lang_scalap' + if artifact.startswith('scala-collection-compat'): + return 'org_scala_lang_modules_scala_collection_compat' + + label = f'io_bazel_rules_scala_{artifact_label}' + + if is_scala_3 and artifact in SCALA_2_ARTIFACTS: + return label + '_2' + if artifact.startswith('scala3-'): + return label.replace('scala3_', 'scala_') + return label.replace('scala_tasty_core', 'scala_scala_tasty_core') + +def get_scala_proto_label(artifact_label, coordinates): + if ( + coordinates.group == "com.thesamet.scalapb" and + not artifact_label.startswith("scalapb_") + ): + artifact_label = "scalapb_" + artifact_label + return f'scala_proto_rules_{artifact_label}' + +def get_label(coordinates, is_scala_3) -> str: + group = coordinates.group + group_label = group.replace('.', '_').replace('-', '_') + artifact_label = coordinates.artifact.split('_')[0].replace('-', '_') + + if group in SCALA_LANG_GROUPS: + return get_scala_lang_label(artifact_label, is_scala_3, coordinates) + if group in ARTIFACT_LABEL_ONLY_GROUPS: + return f'io_bazel_rules_scala_{artifact_label}' + if group in GROUP_AND_ARTIFACT_LABEL_GROUPS: + return f'io_bazel_rules_scala_{group_label}_{artifact_label}' + if group in SCALA_PROTO_RULES_GROUPS: + return get_scala_proto_label(artifact_label, coordinates) + if group in SPECIAL_CASE_GROUP_LABELS: + return SPECIAL_CASE_GROUP_LABELS['group'] + return f'{group_label}_{artifact_label}'.replace('_v2', '') + +def is_newer_version(coords_to_check, current_artifact): + """Determines if the coords_to_check is newer than the current_artifact. + + The idea is to prevent downgrades of versions already in the artifacts file. + If they are later versions, presumably they were updated to that version for + a good reason. + + Args: + coords_to_check (MavenCoordinates): a potentially newer artifact + current_artifact (ResolvedArtifact): the current artifact information in + the repo config file, or None if it doesn't exist + + Returns: + True if current_artifact is none or coords_to_check.version is newer than + current_artifact.coordinates.version, or if current_artifact is None + False otherwise + """ + if current_artifact is None: + return True + + check_parts = coords_to_check.version.split(".") + current_parts = current_artifact.coordinates.version.split(".") + + for check_part, current_part in zip(check_parts, current_parts): + if check_part == current_part: + continue + if check_part.isdecimal() and current_part.isdecimal(): + return int(current_part) < int(check_part) + return current_part < check_part + + return len(current_parts) < len(check_parts) + +def map_to_resolved_artifacts( + output, current_resolved_artifacts_map, +) -> List[ResolvedArtifact]: + command = ( + f'cs fetch {' '.join(output)} --json-output-file ' + + DOWNLOADED_ARTIFACTS_FILE + ) + proc = run_command(command, 'Fetching resolved artifacts') + resolved = [] + + for line in output: + coords = line.replace(':default', '') + mvn_coords = get_maven_coordinates(coords) + deps = get_json_dependencies(coords) + current = current_resolved_artifacts_map.get(mvn_coords.artifact_name()) + + if is_newer_version(mvn_coords, current): + resolved.append(ResolvedArtifact( + mvn_coords, get_artifact_checksum(coords), deps + )) + + return resolved + +def resolve_artifacts_with_checksums_and_direct_dependencies( + root_artifacts, current_resolved_artifacts_map +) -> List[ResolvedArtifact]: + proc = run_command( + f'cs resolve {' '.join(root_artifacts)}', 'Resolving root artifacts' + ) + + return map_to_resolved_artifacts( + proc.stdout.splitlines(), current_resolved_artifacts_map, + ) + +def to_rules_scala_compatible_dict(artifacts, is_scala_3) -> Dict[str, Dict]: + result = {} + + for a in artifacts: + coordinates = a.coordinates + result[get_label(coordinates, is_scala_3)] = { + "artifact": f"{coordinates.coordinate}", + "sha256": f"{a.checksum}", + "deps": sorted([ + f'@{get_label(d, is_scala_3)}' for d in a.direct_dependencies + ]), + } + + return result def write_to_file(artifact_dict, version, file): - with file.open('w') as data: - data.write(f'scala_version = "{version}"\n') - data.write('\nartifacts = ') - data.write(f'{get_with_trailing_commas(json.dumps(artifact_dict, indent=4).replace('true', 'True').replace('false', 'False'))}\n') - -def create_file(version): - path = os.getcwd().replace('/scripts', '/third_party/repositories') - file = Path(f'{path}/{'scala_' + "_".join(version.split(".")[:2]) + '.bzl'}') - - if not file.exists(): - file_to_copy = Path(sorted(glob.glob(f'{path}/*.bzl'))[-1]) - with file.open('w+') as data, file_to_copy.open('r') as data_to_copy: - for line in data_to_copy: - data.write(line) - - with file.open('r+') as data: - excluded_artifacts = ["org.scala-lang.modules:scala-parser-combinators_2.11:1.0.4"] - root_artifacts = select_root_artifacts(version) - read_data = data.read() + artifacts = ( + json.dumps(artifact_dict, indent=4) + .replace('true', 'True') + .replace('false', 'False') + ) + # Add trailing commas. + artifacts = re.sub(r'([]}"])\n', r'\1,\n', artifacts) + '\n' + + with file.open('w', encoding='utf-8') as data: + data.write(f'scala_version = "{version}"\n') + data.write('\nartifacts = ') + data.write(artifacts) + +def create_current_resolved_artifacts_map(original_artifacts): + result = {} + for metadata in original_artifacts.values(): + coordinates = get_maven_coordinates(metadata['artifact']) + artifact_name = coordinates.artifact_name() + + if artifact_name not in result and metadata.get('testonly') is not True: + result[artifact_name] = ResolvedArtifact( + coordinates, metadata['sha256'], metadata.get('deps', []) + ) + return result + +def copy_previous_version_or_create_new_file_if_missing(file_path, output_dir): + if file_path.exists(): + return + + existing_files = sorted(output_dir.glob('scala_*.bzl')) + if existing_files: + shutil.copyfile(existing_files[-1], file_path) + return + + with open(file_path, 'w', encoding='utf-8') as f: + f.write('{}\n') + +def create_or_update_repository_file(version, output_dir): + file = output_dir / f'scala_{"_".join(version.split(".")[:2])}.bzl' + copy_previous_version_or_create_new_file_if_missing(file, output_dir) + + print('\nUPDATING:', file) + with file.open('r', encoding='utf-8') as data: + read_data = data.read() + + scala_major = ".".join(version.split(".")[:2]) + is_scala_3 = scala_major.startswith("3.") + root_artifacts = select_root_artifacts(version, scala_major, is_scala_3) replaced_data = read_data[read_data.find('{'):] - original_artifact_dict = ast.literal_eval(replaced_data) - labels = original_artifact_dict.keys() - - transitive_artifacts: List[ResolvedArtifact] = resolve_artifacts_with_checksums_and_direct_dependencies(root_artifacts) - generated_artifact_dict = to_rules_scala_compatible_dict(transitive_artifacts, version) - generated_labels = generated_artifact_dict.keys() - - for label in labels: - if label in generated_labels and generated_artifact_dict[label]["artifact"] not in excluded_artifacts: - artifact = generated_artifact_dict[label]["artifact"] - sha = generated_artifact_dict[label]["sha256"] - deps = generated_artifact_dict[label]["deps:"] if "deps:" in generated_artifact_dict[label] else [] - original_artifact_dict[label]["artifact"] = artifact - original_artifact_dict[label]["sha256"] = sha - if deps: - dependencies = [d for d in deps if d[1:] in labels and "runtime" not in d and "runtime" not in artifact] - if dependencies: - original_artifact_dict[label]["deps"] = dependencies - - write_to_file(original_artifact_dict, version, file) - -for version in root_scala_versions: - create_file(version) \ No newline at end of file + original_artifacts = ast.literal_eval(replaced_data) + + transitive_artifacts: List[ResolvedArtifact] = ( + resolve_artifacts_with_checksums_and_direct_dependencies( + root_artifacts, + create_current_resolved_artifacts_map(original_artifacts), + ) + ) + generated_artifacts = to_rules_scala_compatible_dict( + transitive_artifacts, is_scala_3 + ) + + for label, generated_metadata in generated_artifacts.items(): + artifact = generated_metadata["artifact"] + if artifact in EXCLUDED_ARTIFACTS: + continue + + metadata = original_artifacts.setdefault(label, {}) + metadata["artifact"] = artifact + metadata["sha256"] = generated_metadata["sha256"] + dependencies = generated_metadata["deps"] + + if dependencies: + metadata["deps"] = dependencies + + write_to_file(original_artifacts, version, file) + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=( + 'Creates or updates repository configuration files ' + + 'for different Scala versions.' + ) + ) + parser.add_argument( + '--version', + type=str, + choices=ROOT_SCALA_VERSIONS, + metavar='SCALA_VERSION', + help=( + 'Scala version for which to update repository information; ' + + 'if not provided, updates all supported versions: ' + + ', '.join(ROOT_SCALA_VERSIONS) + ), + ) + parser.add_argument( + '--output_dir', + type=str, + default=str(OUTPUT_DIR), + help=( + 'Directory in which to generate or update repository files ' + + f'(default: {OUTPUT_DIR})' + ), + ) + + args = parser.parse_args() + output_dir = Path(args.output_dir) + output_dir.mkdir(mode=0o755, parents=True, exist_ok=True) + + try: + for version in [args.version] if args.version else ROOT_SCALA_VERSIONS: + create_or_update_repository_file(version, output_dir) + + except CreateRepositoryError as err: + print(f'Failed to update version {version}: {err}', file=sys.stderr) + sys.exit(1) + + finally: + artifacts_file = Path(DOWNLOADED_ARTIFACTS_FILE) + if artifacts_file.exists(): + artifacts_file.unlink() diff --git a/third_party/repositories/scala_2_11.bzl b/third_party/repositories/scala_2_11.bzl index b3073d1f3..8ccca8eca 100644 --- a/third_party/repositories/scala_2_11.bzl +++ b/third_party/repositories/scala_2_11.bzl @@ -591,4 +591,40 @@ artifacts = { "@io_bazel_rules_scala_scala_library", ], }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_2.11:3.2.9", + "sha256": "85f8d906a5bbeeed9d1cfb5876b70a794be5149f6ba3f2ee00c16c73d8726211", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_2.11:3.2.9", + "sha256": "6bacfbe85d5928cff038be1e0d90c35ebceb9f5cec32d7271a85f7c8470dd10f", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_2.11:3.2.9", + "sha256": "f7c3fcbe130e8fb74231672104cae913b3d31b1c997f9bb010a61b9ee6314fb5", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_2.11:3.2.9", + "sha256": "96b382988fbcbf1c3ff45ba4eac06a069d0f3cb3247a66ea60fd7c0be90e55ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_2_12.bzl b/third_party/repositories/scala_2_12.bzl index 9c180f76d..6378ae813 100644 --- a/third_party/repositories/scala_2_12.bzl +++ b/third_party/repositories/scala_2_12.bzl @@ -618,4 +618,40 @@ artifacts = { "@io_bazel_rules_scala_scala_library", ], }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_2.12:3.2.9", + "sha256": "f0e70557af834d16c36e6a84a1c74c78c2c2737af44d329452bfaefaf01b680b", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_2.12:3.2.9", + "sha256": "8a60666d87385d3bd940d8f55b4c28ffbef066d8b01e11b0585b5cd6e4b3734d", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_2.12:3.2.9", + "sha256": "11e116ef37da8bad9d1b705d0dd166123bfdd8346f6ab0f3242c71eb14b019fa", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_2.12:3.2.9", + "sha256": "3d51d057ac4858fb38faf63035f94687a29f75492825ee8881204008a0a59a95", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_2_13.bzl b/third_party/repositories/scala_2_13.bzl index e5275799d..0e891fade 100644 --- a/third_party/repositories/scala_2_13.bzl +++ b/third_party/repositories/scala_2_13.bzl @@ -628,4 +628,52 @@ artifacts = { "@io_bazel_rules_scala_scala_library", ], }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.14.0", + "sha256": "34ed1e1f27fa896bca50dbc4e99cf3732967cec387a7a0d5e3486c09673fe8c6", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.26.3", + "sha256": "f23116c349314658cdebaa6caf6d0067733cc9e5b852cad2a29e643d32bd52bd", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_2.13:3.2.9", + "sha256": "803d4f2ce03b581ed5435a097a20882809dfe48b87ed232f13a98e718ceb731d", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_2.13:3.2.9", + "sha256": "f08355a14c5afece8130016a9f8e5bbc4196f4b612fefefb2acf223fb9f92607", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_2.13:3.2.9", + "sha256": "edd37859e64c4f18ef266a28603ac7d85649f3f3cc26c14eb093d60199eaec03", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_2.13:3.2.9", + "sha256": "c5d5424bc43f02df9720bd83c57daa982af02ad7ae468875956ebe183f836277", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_3_1.bzl b/third_party/repositories/scala_3_1.bzl index 13a9b87ad..0cf62b56b 100644 --- a/third_party/repositories/scala_3_1.bzl +++ b/third_party/repositories/scala_3_1.bzl @@ -621,4 +621,71 @@ artifacts = { "artifact": "org.typelevel:kind-projector_2.13.12:0.13.2", "sha256": "4bd985e53ac950a1f130981f7ec9a2c5dffe4c2f588fc695180c6105f4a9557f", }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.13.0", + "sha256": "66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.22.0", + "sha256": "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3", + }, + "org_jline_jline_reader": { + "artifact": "org.jline:jline-reader:3.19.0", + "sha256": "5a794c15884538c312a37c1b49cf025a013d8303ad31eadb53d4f8ae091ef355", + "deps": [ + "@org_jline_jline_terminal", + ], + }, + "org_jline_jline_terminal": { + "artifact": "org.jline:jline-terminal:3.19.0", + "sha256": "abdbeafa38c4ccd82578c1f3d08ea48af439eff194d23aa3bae18fbe93b4dcf0", + }, + "org_jline_jline_terminal_jna": { + "artifact": "org.jline:jline-terminal-jna:3.19.0", + "sha256": "4a86975ba94756eaf70dea642d8d4c32535b65479050b56c476dc8c6b0519331", + "deps": [ + "@net_java_dev_jna_jna", + "@org_jline_jline_terminal", + ], + }, + "org_scala_sbt_util_interface": { + "artifact": "org.scala-sbt:util-interface:1.3.0", + "sha256": "89028234b4621ac92761676a00e2e47598fcf5232a9bb994a7ed6dee94eb5aa2", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_3:3.2.9", + "sha256": "20a310d96298a2cde22e1d990f6ef61320ff38f273902aa31592e04e02d902ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_3:3.2.9", + "sha256": "bae00b7ce007b8cc86ffddb44246f5aa8e47055414337ddf322a9ae7c95ea809", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_3:3.2.9", + "sha256": "3f7a1cab9d46d6f57c694e0ddc65db009f7cd0951bbf3a3c3a660c2f52a28dee", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_3:3.2.9", + "sha256": "28a649d8f73fbd7a9d02e702a5f23577b4f6e301840d002d5574728a6ba5c473", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_3_2.bzl b/third_party/repositories/scala_3_2.bzl index 51c78200d..0fb302339 100644 --- a/third_party/repositories/scala_3_2.bzl +++ b/third_party/repositories/scala_3_2.bzl @@ -621,4 +621,71 @@ artifacts = { "artifact": "org.typelevel:kind-projector_2.13.12:0.13.2", "sha256": "4bd985e53ac950a1f130981f7ec9a2c5dffe4c2f588fc695180c6105f4a9557f", }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.13.0", + "sha256": "66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.22.0", + "sha256": "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3", + }, + "org_jline_jline_reader": { + "artifact": "org.jline:jline-reader:3.19.0", + "sha256": "5a794c15884538c312a37c1b49cf025a013d8303ad31eadb53d4f8ae091ef355", + "deps": [ + "@org_jline_jline_terminal", + ], + }, + "org_jline_jline_terminal": { + "artifact": "org.jline:jline-terminal:3.19.0", + "sha256": "abdbeafa38c4ccd82578c1f3d08ea48af439eff194d23aa3bae18fbe93b4dcf0", + }, + "org_jline_jline_terminal_jna": { + "artifact": "org.jline:jline-terminal-jna:3.19.0", + "sha256": "4a86975ba94756eaf70dea642d8d4c32535b65479050b56c476dc8c6b0519331", + "deps": [ + "@net_java_dev_jna_jna", + "@org_jline_jline_terminal", + ], + }, + "org_scala_sbt_util_interface": { + "artifact": "org.scala-sbt:util-interface:1.3.0", + "sha256": "89028234b4621ac92761676a00e2e47598fcf5232a9bb994a7ed6dee94eb5aa2", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_3:3.2.9", + "sha256": "20a310d96298a2cde22e1d990f6ef61320ff38f273902aa31592e04e02d902ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_3:3.2.9", + "sha256": "bae00b7ce007b8cc86ffddb44246f5aa8e47055414337ddf322a9ae7c95ea809", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_3:3.2.9", + "sha256": "3f7a1cab9d46d6f57c694e0ddc65db009f7cd0951bbf3a3c3a660c2f52a28dee", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_3:3.2.9", + "sha256": "28a649d8f73fbd7a9d02e702a5f23577b4f6e301840d002d5574728a6ba5c473", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_3_3.bzl b/third_party/repositories/scala_3_3.bzl index ce0e24f71..8771befe1 100644 --- a/third_party/repositories/scala_3_3.bzl +++ b/third_party/repositories/scala_3_3.bzl @@ -622,4 +622,78 @@ artifacts = { "artifact": "org.typelevel:kind-projector_2.13.12:0.13.2", "sha256": "4bd985e53ac950a1f130981f7ec9a2c5dffe4c2f588fc695180c6105f4a9557f", }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.14.0", + "sha256": "34ed1e1f27fa896bca50dbc4e99cf3732967cec387a7a0d5e3486c09673fe8c6", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.22.0", + "sha256": "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3", + }, + "org_jline_jline_native": { + "artifact": "org.jline:jline-native:3.25.1", + "sha256": "42d5bbe1f546dea248b8c901da7deb9943f76290379552923c9763495bb9f172", + }, + "org_jline_jline_reader": { + "artifact": "org.jline:jline-reader:3.25.1", + "sha256": "26333a275de502adf1dd9e6ea50aa0b4021412c71490df9ed5e88a648886ee89", + "deps": [ + "@org_jline_jline_terminal", + ], + }, + "org_jline_jline_terminal": { + "artifact": "org.jline:jline-terminal:3.25.1", + "sha256": "c0f5d70901255da66a94e59778b265d19f9308342578e34c88fc92d1b0c65fef", + "deps": [ + "@org_jline_jline_native", + ], + }, + "org_jline_jline_terminal_jna": { + "artifact": "org.jline:jline-terminal-jna:3.25.1", + "sha256": "58ca9d719c373206af15775ee3cd5f268136ea0d0c4e009c3e96a6d4612d5c66", + "deps": [ + "@net_java_dev_jna_jna", + "@org_jline_jline_terminal", + ], + }, + "org_scala_sbt_util_interface": { + "artifact": "org.scala-sbt:util-interface:1.9.8", + "sha256": "1302b1a265688b7bc31796d41f93fbe548e5daf36ea4dc848ee0a6b15fc53904", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_3:3.2.9", + "sha256": "20a310d96298a2cde22e1d990f6ef61320ff38f273902aa31592e04e02d902ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_3:3.2.9", + "sha256": "bae00b7ce007b8cc86ffddb44246f5aa8e47055414337ddf322a9ae7c95ea809", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_3:3.2.9", + "sha256": "3f7a1cab9d46d6f57c694e0ddc65db009f7cd0951bbf3a3c3a660c2f52a28dee", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_3:3.2.9", + "sha256": "28a649d8f73fbd7a9d02e702a5f23577b4f6e301840d002d5574728a6ba5c473", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_3_4.bzl b/third_party/repositories/scala_3_4.bzl index 251fed81c..ca48f6b04 100644 --- a/third_party/repositories/scala_3_4.bzl +++ b/third_party/repositories/scala_3_4.bzl @@ -622,4 +622,78 @@ artifacts = { "artifact": "org.typelevel:kind-projector_2.13.12:0.13.2", "sha256": "4bd985e53ac950a1f130981f7ec9a2c5dffe4c2f588fc695180c6105f4a9557f", }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.14.0", + "sha256": "34ed1e1f27fa896bca50dbc4e99cf3732967cec387a7a0d5e3486c09673fe8c6", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.22.0", + "sha256": "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3", + }, + "org_jline_jline_native": { + "artifact": "org.jline:jline-native:3.25.1", + "sha256": "42d5bbe1f546dea248b8c901da7deb9943f76290379552923c9763495bb9f172", + }, + "org_jline_jline_reader": { + "artifact": "org.jline:jline-reader:3.25.1", + "sha256": "26333a275de502adf1dd9e6ea50aa0b4021412c71490df9ed5e88a648886ee89", + "deps": [ + "@org_jline_jline_terminal", + ], + }, + "org_jline_jline_terminal": { + "artifact": "org.jline:jline-terminal:3.25.1", + "sha256": "c0f5d70901255da66a94e59778b265d19f9308342578e34c88fc92d1b0c65fef", + "deps": [ + "@org_jline_jline_native", + ], + }, + "org_jline_jline_terminal_jna": { + "artifact": "org.jline:jline-terminal-jna:3.25.1", + "sha256": "58ca9d719c373206af15775ee3cd5f268136ea0d0c4e009c3e96a6d4612d5c66", + "deps": [ + "@net_java_dev_jna_jna", + "@org_jline_jline_terminal", + ], + }, + "org_scala_sbt_util_interface": { + "artifact": "org.scala-sbt:util-interface:1.9.8", + "sha256": "1302b1a265688b7bc31796d41f93fbe548e5daf36ea4dc848ee0a6b15fc53904", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_3:3.2.9", + "sha256": "20a310d96298a2cde22e1d990f6ef61320ff38f273902aa31592e04e02d902ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_3:3.2.9", + "sha256": "bae00b7ce007b8cc86ffddb44246f5aa8e47055414337ddf322a9ae7c95ea809", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_3:3.2.9", + "sha256": "3f7a1cab9d46d6f57c694e0ddc65db009f7cd0951bbf3a3c3a660c2f52a28dee", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_3:3.2.9", + "sha256": "28a649d8f73fbd7a9d02e702a5f23577b4f6e301840d002d5574728a6ba5c473", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, } diff --git a/third_party/repositories/scala_3_5.bzl b/third_party/repositories/scala_3_5.bzl index 33c876225..4bb029528 100644 --- a/third_party/repositories/scala_3_5.bzl +++ b/third_party/repositories/scala_3_5.bzl @@ -622,4 +622,78 @@ artifacts = { "artifact": "org.typelevel:kind-projector_2.13.12:0.13.2", "sha256": "4bd985e53ac950a1f130981f7ec9a2c5dffe4c2f588fc695180c6105f4a9557f", }, + "io_github_java_diff_utils_java_diff_utils": { + "artifact": "io.github.java-diff-utils:java-diff-utils:4.12", + "sha256": "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5", + }, + "net_java_dev_jna_jna": { + "artifact": "net.java.dev.jna:jna:5.14.0", + "sha256": "34ed1e1f27fa896bca50dbc4e99cf3732967cec387a7a0d5e3486c09673fe8c6", + }, + "org_jline_jline": { + "artifact": "org.jline:jline:3.22.0", + "sha256": "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3", + }, + "org_jline_jline_native": { + "artifact": "org.jline:jline-native:3.25.1", + "sha256": "42d5bbe1f546dea248b8c901da7deb9943f76290379552923c9763495bb9f172", + }, + "org_jline_jline_reader": { + "artifact": "org.jline:jline-reader:3.25.1", + "sha256": "26333a275de502adf1dd9e6ea50aa0b4021412c71490df9ed5e88a648886ee89", + "deps": [ + "@org_jline_jline_terminal", + ], + }, + "org_jline_jline_terminal": { + "artifact": "org.jline:jline-terminal:3.25.1", + "sha256": "c0f5d70901255da66a94e59778b265d19f9308342578e34c88fc92d1b0c65fef", + "deps": [ + "@org_jline_jline_native", + ], + }, + "org_jline_jline_terminal_jna": { + "artifact": "org.jline:jline-terminal-jna:3.25.1", + "sha256": "58ca9d719c373206af15775ee3cd5f268136ea0d0c4e009c3e96a6d4612d5c66", + "deps": [ + "@net_java_dev_jna_jna", + "@org_jline_jline_terminal", + ], + }, + "org_scala_sbt_util_interface": { + "artifact": "org.scala-sbt:util-interface:1.9.8", + "sha256": "1302b1a265688b7bc31796d41f93fbe548e5daf36ea4dc848ee0a6b15fc53904", + }, + "io_bazel_rules_scala_scalatest_diagrams": { + "artifact": "org.scalatest:scalatest-diagrams_3:3.2.9", + "sha256": "20a310d96298a2cde22e1d990f6ef61320ff38f273902aa31592e04e02d902ed", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_propspec": { + "artifact": "org.scalatest:scalatest-propspec_3:3.2.9", + "sha256": "bae00b7ce007b8cc86ffddb44246f5aa8e47055414337ddf322a9ae7c95ea809", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_refspec": { + "artifact": "org.scalatest:scalatest-refspec_3:3.2.9", + "sha256": "3f7a1cab9d46d6f57c694e0ddc65db009f7cd0951bbf3a3c3a660c2f52a28dee", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, + "io_bazel_rules_scala_scalatest_wordspec": { + "artifact": "org.scalatest:scalatest-wordspec_3:3.2.9", + "sha256": "28a649d8f73fbd7a9d02e702a5f23577b4f6e301840d002d5574728a6ba5c473", + "deps": [ + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scalatest_core", + ], + }, }