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",
+ ],
+ },
}