diff --git a/.gitattributes b/.gitattributes index a15657cec..2d4fe8c53 100644 --- a/.gitattributes +++ b/.gitattributes @@ -34,3 +34,12 @@ crates/socket-patch-cli/tests/fixtures/legacy-ledgers/** -text # include_str! and written into user repos byte for byte; a CRLF checkout would change it. crates/socket-patch-core/src/vendor/jvm/socket-patch.settings.gradle -text crates/socket-patch-core/src/patch/redirect/socket-patch.hosted.settings.gradle -text + +# sbt resolution evidence is real sbt output (JSON, Ivy XML and the 0.13 +# binary update cache); the evidence parser's tests read it byte for byte. +crates/socket-patch-core/tests/fixtures/sbt/** -text + +# The sbt harness scripts run under bash on the Windows legs too +# (sbt-compatibility.yml); a CRLF checkout breaks them ($'\r'). +scripts/sbt-warm-seed.sh text eol=lf +scripts/sbt-compat-matrix.sh text eol=lf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d626633d..21f15c7f7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -508,13 +508,14 @@ jobs: # the highest base that's forward-compatible with debian:12. needs: docker-base runs-on: ubuntu-22.04 - timeout-minutes: 30 + # sbt's image bakes three JDKs and warm sbt / Mill / scala-cli caches. + timeout-minutes: ${{ matrix.ecosystem == 'sbt' && 45 || 30 }} permissions: contents: read strategy: fail-fast: false matrix: - ecosystem: [npm, pypi, gem, cargo, golang, maven, composer, nuget, deno] + ecosystem: [npm, pypi, gem, cargo, golang, maven, composer, nuget, deno, sbt] steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -594,18 +595,29 @@ jobs: # Vendor build-proof capstones ride the same image as their # ecosystem's main suite (extend the case as new vendor suites land). EXTRA="" + # libtest arguments after `--`. + FILTER="" case "${{ matrix.ecosystem }}" in composer) EXTRA="--test docker_e2e_vendor_composer" ;; gem) EXTRA="--test docker_e2e_vendor_gem" ;; maven) EXTRA="--test docker_e2e_vendor_maven" ;; nuget) EXTRA="--test docker_e2e_vendor_nuget" ;; pypi) EXTRA="--test docker_e2e_vendor_pypi_pm" ;; + # The blocking sbt slice: the agent cells on 1.2.8 (Ivy) and + # 1.13.0 (Coursier, plus the `useCoursier := false` Ivy cell). + # Mill, scala-cli and the other sbt lines run nightly in + # e2e-docker and in sbt-compatibility.yml. + sbt) + export SOCKET_PATCH_SBT_DOCKER_VERSIONS="1.2.8 1.13.0" + export SOCKET_PATCH_DOCKER_E2E_REQUIRED=1 + FILTER="agent_sbt_ --test-threads=1" ;; esac - # shellcheck disable=SC2086 # EXTRA is intentionally word-split + # shellcheck disable=SC2086 # EXTRA and FILTER are intentionally word-split cargo llvm-cov \ --features docker-e2e \ --no-report \ - --test docker_e2e_${{ matrix.ecosystem }} $EXTRA + --test docker_e2e_${{ matrix.ecosystem }} $EXTRA \ + -- $FILTER - name: Generate per-ecosystem lcov run: | @@ -1127,6 +1139,12 @@ jobs: - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_agent_ gradle_hosted_'} - {os: ubuntu-latest, suite: 'e2e_vendor_gradle_build e2e_vendor_jvm_build', jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_vendor_ gradle_multi_project'} - {os: windows-latest, suite: e2e_vendor_jvm_build, jvm_tool: gradle, gradle: '8.14.3', java: '17', test_filter: '--ignored gradle_multi_project'} + # Real-sbt hosted (socket-patch.sbt) + vendored + # (socket-patch-vendor.sbt) capstones on the current 1.x line. The + # other sbt lines, JDK 21, the agent cells beyond coverage-docker's, + # Mill, scala-cli and macOS / Windows are sbt-compatibility.yml. + - {os: ubuntu-latest, suite: e2e_sbt_build, jvm_tool: sbt, sbt: '1.13.0', test_filter: '--ignored --test-threads=1'} + - {os: ubuntu-latest, suite: e2e_sbt_vendor_build, jvm_tool: sbt, sbt: '1.13.0', test_filter: '--ignored --test-threads=1'} # Real .NET SDK capstones: hosted + vendored nuget, one leg per SDK # major (the suite pins the major through a sandbox global.json): # the oldest and newest here, 7-9 on ubuntu in e2e-full. @@ -1343,6 +1361,25 @@ jobs: distribution: temurin java-version: ${{ matrix.java || '17' }} + - name: Setup sbt (sbt legs) + if: matrix.sbt != '' + # The sbt launcher script; it boots whatever `sbt.version` each + # fixture's project/build.properties pins. + uses: sbt/setup-sbt@6158cb0903b8ceeae04f830055f3155e1b6a5ad7 # v1.5.11 + with: + sbt-runner-version: 1.13.0 + disk-cache: false + + - name: Warm the sbt seed (sbt legs) + if: matrix.sbt != '' + # Boots the pinned sbt once into a seed the suites hard-link into + # each test's private caches (SOCKET_PATCH_SBT_E2E_SEED), and names + # the launcher (SOCKET_PATCH_SBT_E2E_SBT). + shell: bash + env: + SBT_TEST_VERSION: ${{ matrix.sbt }} + run: scripts/sbt-warm-seed.sh "$SBT_TEST_VERSION" "$RUNNER_TEMP/sbt-seed" >> "$GITHUB_ENV" + - name: Install Maven ${{ matrix.maven || '3.9.16' }} if: steps.jvm.outputs.maven == 'true' # Straight from the Apache archive (sha512-verified), so a leg gets @@ -1488,6 +1525,8 @@ jobs: SOCKET_PATCH_DOTNET_E2E_VERSION: ${{ matrix.dotnet }} SOCKET_PATCH_DENO_E2E_REQUIRED: ${{ matrix.deno != '' && '1' || '' }} SOCKET_PATCH_DENO_E2E_VERSION: ${{ matrix.deno }} + SOCKET_PATCH_SBT_E2E_REQUIRED: ${{ matrix.sbt != '' && '1' || '' }} + SOCKET_PATCH_SBT_E2E_VERSION: ${{ matrix.sbt }} E2E_SUITE: ${{ matrix.suite }} E2E_TEST_FILTER: ${{ matrix.test_filter || '--ignored' }} E2E_JVM_TOOL: ${{ matrix.jvm_tool }} @@ -1634,13 +1673,13 @@ jobs: if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.head_ref == 'release/v5-prerelease' needs: docker-base runs-on: ubuntu-latest - timeout-minutes: 35 + timeout-minutes: ${{ matrix.ecosystem == 'sbt' && 45 || 35 }} permissions: contents: read strategy: fail-fast: false matrix: - ecosystem: [npm, pypi, gem, cargo, golang, maven, composer, nuget, deno] + ecosystem: [npm, pypi, gem, cargo, golang, maven, composer, nuget, deno, sbt] steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -1689,13 +1728,20 @@ jobs: # run only in coverage-docker. run: | EXTRA="" + FILTER="" case "${{ matrix.ecosystem }}" in composer) EXTRA="--test docker_e2e_vendor_composer" ;; nuget) EXTRA="--test docker_e2e_vendor_nuget" ;; pypi) EXTRA="--test docker_e2e_vendor_pypi_pm" ;; + # Every sbt / Mill / scala-cli agent cell (the full sbt version + # x mode matrix is sbt-compatibility.yml). + sbt) + export SOCKET_PATCH_SBT_DOCKER_VERSIONS="1.2.8 1.13.0" + export SOCKET_PATCH_DOCKER_E2E_REQUIRED=1 + FILTER="--test-threads=1" ;; esac - # shellcheck disable=SC2086 # EXTRA is intentionally word-split - cargo test -p socket-patch-cli --features docker-e2e --test "docker_e2e_${{ matrix.ecosystem }}" $EXTRA + # shellcheck disable=SC2086 # EXTRA and FILTER are intentionally word-split + cargo test -p socket-patch-cli --features docker-e2e --test "docker_e2e_${{ matrix.ecosystem }}" $EXTRA -- $FILTER # ---------------------------------------------------------------------- # Per-release real-toolchain matrices for the manifest-less VEX work that diff --git a/.github/workflows/sbt-compatibility.yml b/.github/workflows/sbt-compatibility.yml new file mode 100644 index 000000000..22ea35660 --- /dev/null +++ b/.github/workflows/sbt-compatibility.yml @@ -0,0 +1,308 @@ +name: sbt / Mill / scala-cli compatibility + +# Real sbt releases through every mode, plus Mill and scala-cli, all driven +# by scripts/sbt-compat-matrix.sh (docs/testing/sbt-compatibility.md): +# +# - docker: the six probed sbt lines x {agent, hosted, vendored} in the +# tests/docker/Dockerfile.sbt image. sbt <= 1.3.13 runs on JDK 8 (sbt +# 1.3.x is the last line whose launcher still boots there and the first +# on Coursier), later lines on JDK 17, plus JDK 21 legs for 1.13.0 and +# 2.0.9. 0.13.18 = the 0.13 syntax line; 1.2.8 = last Ivy-default 1.x +# (the offline-ordering boundary); 1.3.13 = first Coursier line; 1.9.9 = +# mid 1.x; 1.13.0 = current 1.x; 2.0.9 = sbt 2. +# - scala-tools: the Mill agent cells (0.11.13 and 0.12.17 over `build.sc`, +# 1.1.10 over `build.mill`; the image installs all three) and the +# scala-cli agent + vendored cells. +# - native: sbt 1.13.0 hosted + vendored on macOS and Windows runners with +# a host JDK and the sbt launcher (no Docker there). +# +# ci.yml runs the small blocking slice on every PR (agent 1.2.8 + 1.13.0 in +# coverage-docker, hosted + vendored 1.13.0 on ubuntu in e2e). + +on: + pull_request: + # Everything the agent, hosted and vendored cells run through, shared + # engine code included (as composer-compatibility.yml does). + paths: + - '.github/workflows/sbt-compatibility.yml' + - 'scripts/sbt-compat-matrix.sh' + - 'scripts/sbt-warm-seed.sh' + - 'docs/testing/sbt-compatibility.md' + - 'tests/docker/Dockerfile.sbt' + - 'tests/docker/Dockerfile.base' + - 'Cargo.toml' + - 'Cargo.lock' + - 'crates/*/Cargo.toml' + - 'crates/socket-patch-core/src/formats/**' + - 'crates/socket-patch-core/src/crawlers/**' + - 'crates/socket-patch-core/src/hosted/**' + - 'crates/socket-patch-core/src/patch/**' + - 'crates/socket-patch-core/src/manifest/**' + - 'crates/socket-patch-core/src/api/**' + - 'crates/socket-patch-core/src/utils/**' + - 'crates/socket-patch-core/src/vendor/**' + - 'crates/socket-patch-core/src/vex/**' + - 'crates/socket-patch-cli/src/**' + - 'crates/socket-patch-cli/tests/docker_e2e_sbt.rs' + - 'crates/socket-patch-cli/tests/e2e_sbt_build.rs' + - 'crates/socket-patch-cli/tests/e2e_sbt_vendor_build.rs' + - 'crates/socket-patch-cli/tests/e2e_scala_cli_vendor.rs' + - 'crates/socket-patch-cli/tests/sbt_build_common/**' + - 'crates/socket-patch-cli/tests/sbt_vendor_build_common/**' + - 'crates/socket-patch-cli/tests/sbt_e2e_shared/**' + - 'crates/socket-patch-cli/tests/sbt_common/**' + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: sbt-compat-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +env: + SOCKET_NO_CONFIG: '1' + SOCKET_NO_UPDATE_CHECK: '1' + +jobs: + image: + # Builds the sbt image once (base image first: Dockerfile.sbt is + # `FROM socket-patch-test-base:latest`) and hands it to every leg. + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Set up Docker Buildx + # `driver: docker` so `FROM socket-patch-test-base:latest` resolves + # against the host daemon (as in ci.yml's coverage-docker job). + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + with: + driver: docker + + # No `actions/cache`: this job builds Docker images (zizmor + # cache-poisoning audit), as in ci.yml's docker jobs. + + - name: Build base image + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 + with: + context: . + file: tests/docker/Dockerfile.base + tags: socket-patch-test-base:latest + load: true + + - name: Build sbt image + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 + with: + context: tests/docker + file: tests/docker/Dockerfile.sbt + tags: socket-patch-test-sbt:latest + load: true + + - name: Save sbt image + run: | + mkdir -p sbt-image + docker save --output sbt-image/socket-patch-test-sbt.tar socket-patch-test-sbt:latest + + - uses: ./.github/actions/upload-artifact + with: + name: sbt-image + path: sbt-image/socket-patch-test-sbt.tar + if-no-files-found: error + retention-days: 3 + + linux-bins: + # The Linux socket-patch and the real-tool test binaries (docker_e2e_sbt's + # host side too, so no leg compiles), built once in the script's pinned + # rust container. Absolute paths are kept (`tar -P`): + # the test binaries carry their compile-time paths, and every leg checks + # out to the same workspace path. + runs-on: ubuntu-latest + timeout-minutes: 40 + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Build + run: | + set -euo pipefail + scripts/sbt-compat-matrix.sh --build-only > sbt-bins.txt + cat sbt-bins.txt + mkdir -p sbt-bins + tar -cPf sbt-bins/sbt-linux-bins.tar -T sbt-bins.txt + + - uses: ./.github/actions/upload-artifact + with: + name: sbt-linux-bins + path: sbt-bins/sbt-linux-bins.tar + if-no-files-found: error + retention-days: 3 + + docker: + name: sbt ${{ matrix.sbt }} / jdk ${{ matrix.jdk }} / ${{ matrix.group }} + needs: [image, linux-bins] + runs-on: ubuntu-latest + timeout-minutes: 45 + strategy: + fail-fast: false + matrix: + group: [agent, hosted, vendored] + sbt: ['0.13.18', '1.2.8', '1.3.13', '1.9.9', '1.13.0', '2.0.9'] + jdk: ['8', '17'] + exclude: + - {sbt: '0.13.18', jdk: '17'} + - {sbt: '1.2.8', jdk: '17'} + - {sbt: '1.3.13', jdk: '17'} + - {sbt: '1.9.9', jdk: '8'} + - {sbt: '1.13.0', jdk: '8'} + - {sbt: '2.0.9', jdk: '8'} + include: + - {group: agent, sbt: '1.13.0', jdk: '21'} + - {group: hosted, sbt: '1.13.0', jdk: '21'} + - {group: vendored, sbt: '1.13.0', jdk: '21'} + - {group: agent, sbt: '2.0.9', jdk: '21'} + - {group: hosted, sbt: '2.0.9', jdk: '21'} + - {group: vendored, sbt: '2.0.9', jdk: '21'} + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Download the sbt image and Linux binaries + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: sbt-* + merge-multiple: true + path: sbt-artifacts + + - name: Load the sbt image and Linux binaries + run: | + set -euo pipefail + docker load --input sbt-artifacts/socket-patch-test-sbt.tar + tar -xPf sbt-artifacts/sbt-linux-bins.tar + rm -rf sbt-artifacts + + - name: Run the ${{ matrix.group }} group + env: + SBT_GROUP: ${{ matrix.group }} + SBT_VERSION: ${{ matrix.sbt }} + SBT_JDK: ${{ matrix.jdk }} + run: scripts/sbt-compat-matrix.sh --group "$SBT_GROUP" --version "$SBT_VERSION" --jdk "$SBT_JDK" --skip-build + + - name: Upload the raw logs + if: failure() + uses: ./.github/actions/upload-artifact + with: + name: sbt-logs-${{ matrix.group }}-${{ matrix.sbt }}-jdk${{ matrix.jdk }} + path: target/linux/sbt-matrix-logs/ + if-no-files-found: ignore + retention-days: 7 + + scala-tools: + # Mill 0.11.13 / 0.12.17 / 1.1.10 agent; scala-cli 1.17.1 agent + + # vendored (the versions the image installs). + name: ${{ matrix.group }} ${{ matrix.version }} + needs: [image, linux-bins] + runs-on: ubuntu-latest + timeout-minutes: 45 + strategy: + fail-fast: false + matrix: + include: + - {group: mill, version: '0.11.13'} + - {group: mill, version: '0.12.17'} + - {group: mill, version: '1.1.10'} + - {group: scala-cli, version: '1.17.1'} + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Download the sbt image and Linux binaries + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: sbt-* + merge-multiple: true + path: sbt-artifacts + + - name: Load the sbt image and Linux binaries + run: | + set -euo pipefail + docker load --input sbt-artifacts/socket-patch-test-sbt.tar + tar -xPf sbt-artifacts/sbt-linux-bins.tar + rm -rf sbt-artifacts + + - name: Run the ${{ matrix.group }} group + env: + SBT_GROUP: ${{ matrix.group }} + TOOL_VERSION: ${{ matrix.version }} + run: scripts/sbt-compat-matrix.sh --group "$SBT_GROUP" --version "$TOOL_VERSION" --skip-build + + - name: Upload the raw logs + if: failure() + uses: ./.github/actions/upload-artifact + with: + name: sbt-logs-${{ matrix.group }}-${{ matrix.version }} + path: target/linux/sbt-matrix-logs/ + if-no-files-found: ignore + retention-days: 7 + + native: + # Hosted + vendored on sbt 1.13.0 with sbt on the host: the launcher + # from sbt/setup-sbt, a Temurin JDK 17, the tests' own native runner. + # The warm-seed step boots sbt once so the tests share its caches. + name: sbt 1.13.0 ${{ matrix.suite }} / ${{ matrix.os }} + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest] + suite: [e2e_sbt_build, e2e_sbt_vendor_build] + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - run: rustup show + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + key: sbt-compat + save-if: ${{ github.ref == 'refs/heads/main' }} + - uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1 + with: + distribution: temurin + java-version: '17' + - uses: sbt/setup-sbt@6158cb0903b8ceeae04f830055f3155e1b6a5ad7 # v1.5.11 + with: + sbt-runner-version: 1.13.0 + disk-cache: false + - name: Keep temp dirs on the seed's volume + # The tests hard-link the warm seed into each temp dir; on Windows + # %TEMP% (C:) and $RUNNER_TEMP (D:) are different volumes, where + # every link would fall back to a full copy. + shell: bash + run: | + { + echo "TMPDIR=$RUNNER_TEMP" + echo "TEMP=$RUNNER_TEMP" + echo "TMP=$RUNNER_TEMP" + } >> "$GITHUB_ENV" + - name: Warm the sbt seed + shell: bash + run: scripts/sbt-warm-seed.sh 1.13.0 "$RUNNER_TEMP/sbt-seed" >> "$GITHUB_ENV" + - name: Real-sbt ${{ matrix.suite }} + shell: bash + env: + SOCKET_PATCH_SBT_E2E_VERSION: 1.13.0 + SOCKET_PATCH_SBT_E2E_REQUIRED: '1' + SBT_SUITE: ${{ matrix.suite }} + run: cargo test -p socket-patch-cli --test "$SBT_SUITE" -- --ignored --test-threads=1 diff --git a/.gitignore b/.gitignore index c2de49e76..422a0dd0a 100644 --- a/.gitignore +++ b/.gitignore @@ -144,6 +144,9 @@ vite.config.ts.timestamp-* # Rust target/ +# sbt resolution-evidence fixtures are copies of real sbt `target/` trees. +!crates/socket-patch-core/tests/fixtures/sbt/evidence/**/target/ +!crates/socket-patch-core/tests/fixtures/sbt/evidence/**/target/out/ # npm binaries (populated at publish time) npm/socket-patch/bin/socket-patch-* diff --git a/CHANGELOG.md b/CHANGELOG.md index 25dcd0cc1..c93e56e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -119,6 +119,42 @@ and `vendor` (committed patched packages), with `list` for inspection. See the trust-lockfile configuration. Explicit user settings are respected. - Path targeting on scan and rollback, hosted update detection from lockfiles, and configurable API request concurrency. +- sbt, Mill and scala-cli projects (`build.sbt`, `build.mill`, + `build.mill.yaml`, `build.sc`, `project.scala`) count as Maven projects: a + local scan crawls the Maven repository for them, socket.yml path filters + match those files as root markers, and the in-memory hosted scan warns + `ecosystem_unsupported_in_memory` for them. +- Agent mode finds and patches Maven artifacts in Coursier caches (sbt 1.3+, + sbt 2, Mill, scala-cli) and Ivy caches (sbt 0.13–1.2, `useCoursier := false`), + at the locations `COURSIER_CACHE`, `.jvmopts` / `.sbtopts` / `SBT_OPTS` / + `JAVA_OPTS` options or the OS defaults name, and resyncs Coursier's checksum + sidecars after apply and rollback so Coursier keeps the patched bytes. A + GAV cached in several of these roots (or also in `~/.m2`) is patched and + restored in every one, through the same every-copy fan-out as Gradle's + caches (an Ivy module's classifier jars under `srcs/` / `docs/` + included), and VEX re-hashes every such copy. Locally these caches are crawled only for an sbt / + Mill / scala-cli project (a Maven or Gradle project keeps `~/.m2` alone), + and a Coursier directory holding only a pom is no copy. +- Hosted sbt: `scan` / `get --mode hosted` wire Maven patches into an sbt + build (0.13.18 to 2.0) through one generated `socket-patch.sbt`, gated on + sbt's own resolution records (each project dated by its own records) and + verified again at every sbt load, which also fails a build that declares a + pinned GA newer than the patched base; + `rollback` restores it offline and VEX attests a pin only after + `sbt update` shows it resolved. Mill and scala-cli get paste-able snippets + (`redirect_mill_manual_snippet`, `redirect_scala_cli_manual_snippet`). +- Vendored sbt: `vendor` wires an sbt 0.13.18+ build root through a generated + `socket-patch-vendor.sbt` over the committed suffixed tree + `.socket/vendor/maven2`, editing no user file; revert, rollback, `--check` + and repair cover it. New `vendor_sbt_*` refusal and warning codes and + `vendor_jvm_build_ambiguous` are listed in `CLI_CONTRACT.md`. +- Vendored scala-cli directory builds (`project.scala`): `vendor` writes only + owned files (a root `socket-patch.scala` including a guard inside the + committed same-GAV `.socket/vendor/coursier/` tree), gated on scala-cli's own + Bloop resolution, failing closed when the tree is deleted, and refusing builds + whose own repositories would shadow it (`vendor_scala_cli_*`, + `vendor_coursier_tree_conflict`). Mill vendoring stays docs-only + (docs/design/sbt-support.md). See [ecosystem support](docs/ecosystems.md) and the [compatibility guides](docs/testing/README.md) for format boundaries, integrity @@ -295,6 +331,21 @@ limits, and required install commands. - Documentation now separates usage, configuration, migration, compatibility, and development guidance; completed plans, prototype research, and historical run reports are removed from the maintained docs. +- sbt support scaffolding: the shared sbt build model and resolution gate, + Coursier / Ivy cache layouts in the JVM cache seam, real sbt resolution + evidence fixtures, and hooks for the hosted, vendored, VEX and sidecar + lanes (docs/design/sbt-support.md). +- The generated `socket-patch.sbt` / `socket-patch-vendor.sbt` templates are + frozen by a six-version sbt probe (docs/design/sbt-template-probe.md), with a + byte-exact renderer and strict parser for them. +- sbt resolution evidence: parsers for the update-cache JSON, Ivy reports and + scala-cli Bloop files, a capped FIFO-safe evidence walk with staleness, the + hosted evidence document and the vendored sbt gate + (docs/design/sbt-evidence-probe.md). +- CI runs real sbt: `sbt-compatibility.yml` covers six sbt lines in every mode + (JDK 8 / 17 / 21), Mill, scala-cli and macOS / Windows, and `ci.yml` blocks + on the sbt agent cells (1.2.8, 1.13.0) and hosted + vendored sbt 1.13.0 + (docs/testing/sbt-compatibility.md). ## [4.0.0] — 2026-08-20 diff --git a/README.md b/README.md index 023900184..af6b393c0 100644 --- a/README.md +++ b/README.md @@ -98,13 +98,16 @@ Vendored mode stores **patched dependencies**, not the entire dependency graph. Other dependencies still need their normal registry, mirror, or offline cache. Hosted and vendored installs do not need an install hook or the Socket Patch CLI. -The CLI supports npm, PyPI, Cargo, Go, RubyGems, Maven, Composer, NuGet, and Deno. +The CLI supports npm, PyPI, Cargo, Go, RubyGems, Maven (including sbt, Mill and +scala-cli builds), Composer, NuGet, and Deno. Mode and package-manager support vary: Deno uses agent mode, for example. Check the [ecosystem support matrix](docs/ecosystems.md) before choosing a mode. Vendored Maven reactors and Gradle 6.8+ builds are supported. See [JVM vendoring](docs/design/maven-vendoring.md) for supported project shapes, -cache behavior, and offline checks. +cache behavior, and offline checks. sbt 0.13.18+ builds are wired through one +generated `socket-patch.sbt` (hosted) or `socket-patch-vendor.sbt` (vendored); +see [Scala build tools](docs/ecosystems.md#scala-build-tools-sbt-mill-scala-cli). ## Common commands diff --git a/crates/socket-patch-cli/CLI_CONTRACT.md b/crates/socket-patch-cli/CLI_CONTRACT.md index 90bb865b7..1bdaf4d68 100644 --- a/crates/socket-patch-cli/CLI_CONTRACT.md +++ b/crates/socket-patch-cli/CLI_CONTRACT.md @@ -163,7 +163,9 @@ For a **9.0 root lock**, the CLI ensures `pnpm-workspace.yaml` carries `trustLoc `scan --mode hosted` swaps the in-place apply for the registry-redirect pipeline: discover → resolve hosted-patch references (grant token + integrity + per-dep registry override) → rewrite ONLY the patched dependencies' lockfile / registry-config entries to point at the hosted packages. A dep counts as **redirected** only when its hosted-artifact URL (or per-dep registry index URL) actually landed in a project file — a granted reference whose rewriter found nothing to edit is neither counted nor attested. **No ledger (v5.0)**: hosted mode writes ONLY the lockfile / registry-config edits — `.socket/vendor/redirect-state.json` is never written (on success or failure), and a pre-v5 one on disk is ignored (never read for planning, never quarantined, left byte-identical). The lockfiles are the only record of a hosted patch: `list`, `vex`, `rollback`, `remove`, `vendor` and `repair` all discover the hosted pins from them (a hosted URL counts only on `https://patch.socket.dev` or the `--patch-server-url` / `SOCKET_PATCH_SERVER_URL` origin), and commit-ready output is just the lockfile / config changes. Cargo and golang are confirmed only by their rewriter's own report (`confirmed_cargo_uuids` / `confirmed_golang_uuids`): a golang dep counts only when its go.mod `replace M V => patch.socket.dev/gopatch/ ` and both go.sum lines are in place, never because the patch-server origin or leftover go.sum lines appear somewhere. Gradle is confirmed the same way (`confirmed_gradle_uuids`): only when the final files hold the owned script, the index row, the live apply line in every build's settings file and the suffixed version in every lock entry of the GA (see [Gradle builds](#gradle-builds-v50)). A golang module that go.mod does not require and go.sum does not list at the patched version is outside the build graph and is refused with `redirect_golang_not_in_module_graph` (nothing written). Only the exact module `patch.socket.dev/gopatch/` is socket-owned; any other module path is refused with `redirect_golang_untrusted_module_path`. A vendored golang module is taken over like cargo and the npm family: its vendor wiring, committed copy and ledger entry are reverted first (`redirect_takeover_reverted_vendored`). A vendored PyPI package (requirements.txt, Poetry, Pipenv, uv, Hatch, PDM, pylock) is taken over the same way: its vendored wiring is restored to the recorded registry entry, its ledger entry and wheel are removed, and only then is it redirected. The Python rewriters treat any non-registry source as user-authored, so without the revert they refused socket-patch's own vendored source and left the project vendored. A takeover revert that leaves vendored wiring in place is refused with `redirect_vendored_revert_failed`. That covers a drift-skipped record (`vendor_lock_entry_drifted`) and a reverted file that still references the artifact (`vendor_revert_residual_reference`). The ledger entry and artifact are kept, and the package stays vendored and skipped. `--dry-run` predicts the same refusal from the same signals instead of previewing `redirect_would_revert_vendored`. A taken-over package whose wiring was reverted but that was then not pinned to hosted now installs the unpatched registry release in both modes. Causes include a refused lock, unavailable hosted wheel metadata, or a vendored ledger update that failed after the revert (refused with `redirect_vendored_revert_failed`). It is reported as `redirect_takeover_unpatched` with `status: "partial_failure"` and exit 1, never as success. That warning also prints under `--silent`. Human output prints no `Migrated …` progress line for the package and no "keep the hosted patches" next steps. Re-runs over already-rewritten output plan from the current lock text and are idempotent (exit 0, lock unchanged). **Lock (v5.0)**: the hosted engine acquires `<.socket>/apply.lock` around its first wet write (the takeover pre-reverts) — not on `--dry-run`, and not when the run would write nothing (zero redirects, all skipped) — so previews and no-op runs never create `.socket/`; contention is `lock_held` and a lock-file I/O fault (a read-only project root, a file squatting on `.socket/`) is `lock_io` — both exit 1, refused BEFORE any project file is written, and rendered like every other lock holder: human `Error (): ` on stderr (+ the `--lock-timeout` hint for a live holder); JSON keeps the hosted shape — top-level `status: "error"`, `errorCode: "lock_held" | "lock_io"`, a string `error`, and `redirect: {mode: "hosted"}` retained (NOT the vendored `error: {code, message}` object). **Takeover symlink pre-check (v5.0)**: a vendored→hosted takeover whose recorded wiring file is a symlink is refused up front with `redirect_symlinked_file_unsupported` — wet and `--dry-run` alike, before any revert — so "nothing was written" holds. **Human mode (v5.0)**: hosted `scan` prints the results table and update detection like the other modes, then rewrites without a prompt (scan never prompts); `--dry-run` previews through the engine, and a detail fetch that leaves nothing to redirect enters the engine as a no-op (`Redirected 0 packages; rewrote 0 files.`, no lock, no `.socket/`). The detail fetch prints the same progress counter and per-package `Warning: could not fetch details for …` lines as the agent arm. An EMPTY hosted discovery prints `No patches available for installed packages.` and exits 0 without entering the engine; a discovery whose every offer is paid-tier for an org without paid access prints the table's paid nudge, then `No downloadable patches (paid subscription required).`, and exits 0 without entering the engine (parity with the agent/vendored arms). JSON output gains a `redirect` sub-object: `{ mode: "hosted", redirected, rewrittenFiles, skipped, warnings, dryRun }` (`mode` is additive so consumers can dispatch without inferring it). Rewriter warnings carry stable `redirect_*` codes (e.g. `redirect_npm_no_lockfile`, `redirect_gradle_manual_snippet`, `redirect_golang_unsupported`); new codes are additive (MINOR). v5.0 additive codes: `redirect_composer_no_lockfile` / `redirect_gem_no_gemfile` (composer / gem: neither manifest nor lock present — once per run, after the intake gates), `redirect_gem_bundle_gemfile_unsupported` (gem: `BUNDLE_GEMFILE` — `BUNDLE_GEMFILE:` in the bundler app config, which outranks the environment variable as in `Bundler::Settings`, else the environment variable — names a manifest other than the project's `Gemfile` / `gems.rb`, so no gem is redirected or attested; a value naming one of those two selects that pair even when the other spelling is present), `redirect_maven_no_pom` (no `pom.xml` and no Gradle build), `redirect_nuget_lock_unparseable` (a present-but-corrupt `packages.lock.json` — warned once, nothing mutated; an absent lock still proceeds), `redirect_cargo_lock_pkg_ambiguous` (several same-name+version `[[package]]` blocks and none carries the index `source` — transactional skip). Also v5.0: a registry override of the wrong kind (or none at all) warns the arm's missing-override code for nuget/gem/golang. Refusals stay fail-closed with a diagnosis that names the actual cause: a yarn-berry lock entry resolving through a non-`npm:` protocol keeps `redirect_yarn_berry_unsupported_protocol` with the entry's ACTUAL protocol in the detail — except socket-patch's OWN vendored wiring (a `file:` range into `.socket/vendor/`), which gets the distinct `redirect_yarn_berry_vendored_entry` code whose detail names the retirement path (`remove ` per package, or `vendor --revert` which unwinds every vendored package, then re-run `scan --mode hosted`). Both leave the entry byte-identical; neither changes exit code or status. **yarn berry line endings (v5.0)**: yarn writes a NEW `yarn.lock` with the OS line ending (`os.EOL` — CRLF on Windows) and keeps an existing lock's majority ending on every later write, and a `core.autocrlf` checkout turns an LF lock CRLF on any OS — so a uniformly CRLF lock is rewritten in its own ending: every untouched byte (a leading BOM included) round-trips (and `rollback`'s upstream restore keeps the lock's own ending). A lock that MIXES CRLF and LF (or holds a bare CR) has no single ending to keep — yarn's own `--immutable` check rejects it too (YN0028) — so it is refused untouched with `redirect_yarn_berry_mixed_line_endings` (the detail names `yarn install`, which normalizes it). This replaces v4's `redirect_yarn_berry_crlf_unsupported`, which refused every CRLF lock and is no longer emitted. A vendored→hosted takeover runs these berry gates (mixed line endings, unsupported `cacheKey`, a non-zero `.yarnrc.yml` `compressionLevel`) BEFORE reverting a vendored berry purl — wet and `--dry-run` alike — so a refused purl keeps its vendored wiring, ledger entry and artifact byte-identical and is skipped with the gate's code (never announced as `redirect_takeover_reverted_vendored` and then left unpatched in both modes). -The rewriter reads a fixed set of candidate files from the project root: the npm-family locks (`package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `shrinkwrap.yaml`, `yarn.lock`, plus `.yarnrc.yml` for the berry cache-config gate, `bun.lock` / `bun.lockb`, and `vlt-lock.json` with `vlt.json` and `node_modules/.vlt-lock.json` read only), `requirements.txt` / `uv.lock` / `Pipfile.lock` (pipfile-spec 6; see the Pipenv section below) / `poetry.lock` (every Poetry lock generation from 1.0 on — the 0.12 `[metadata.hashes]` layout is refused because that installer ignores URL sources; a Poetry < 1.4 writer additionally gets `redirect_poetry_stale_install_risk`, see `docs/testing/poetry-compatibility.md`) / `pdm.lock` (PDM lock formats `2` and `4.3`–`4.5.1`; the identity-losing `3.1` / `4.0`–`4.2` formats and unknown future formats are refused with `redirect_pdm_refused`, and a lock-format-`2` writer additionally gets `redirect_pdm_legacy_sync_required`, see `docs/testing/pdm-compatibility.md`; when `uv.lock` or `poetry.lock` sits beside it they drive and `pdm.lock` is left alone), `Cargo.toml` / `Cargo.lock` / `.cargo/config.toml` (plus the legacy extensionless `.cargo/config` — cargo reads that spelling in preference when both exist, so the managed `[registries.…]` block is written into whichever one is present; **cargo also reads every workspace-member manifest** — the `[workspace] members` globs minus `exclude` — and every in-root path-dependency manifest, recursively, reached without crossing a symbolic link and never under `.socket/`, and pins the crate in each one that declares it, so those `/Cargo.toml` files can appear in `rewrittenFiles`. A crate is redirected only when every declaration pins and every other `Cargo.lock` package depending on it is a planned member: one a registry or git crate — or a path package outside the root or behind a link — also depends on is refused `redirect_cargo_transitive_dependents` (a pin reaches only the declarations it sits on), a crate no manifest declares keeps `redirect_cargo_toml_dep_not_found` with a transitive-only detail naming `--mode vendored`, a crate every declaration of which requires another version (no requirement accepts the patched version) is refused `redirect_cargo_toml_dep_unrewritable`, and so is a requirement that also matches another locked version of the crate — each a transactional skip, never recorded or attested. With NO `Cargo.lock` there is no resolved graph to ask, so the dependents question is answered from the manifests instead: a crate declared beside any other dependency — anything but a path dependency on a manifest this run also pins, or a `workspace = true` inheritor of a table it scans — or beside a workspace member this run did not read (a `members` glob, or a member outside the project or behind a symbolic link, which member discovery drops) is refused `redirect_cargo_lockless_dependents`, whose detail names the remedies (commit a lockfile, or `--mode vendored`); a project whose only dependency is the patched crate has nothing that could pull it in and still redirects. All-CRLF manifests, locks and configs are rewritten with CRLF kept (mixed endings keep refusing where the grammar does not match), and `remove` / rollback match the recorded fragments across a later CRLF↔LF checkout conversion), `composer.lock`, `nuget.config` / `packages.lock.json`, `Gemfile` / `Gemfile.lock`, `pom.xml` (+ `.mvn/maven.config` / `.mvn/checksums/checksums.sha256` for maven Trusted Checksums merge, and, for a Gradle build, every settings, build, `buildSrc`, included-build, applied and plugin-source script, version catalog and lock file the script graph reaches, plus `gradle/verification-metadata.xml`, `gradle/wrapper/gradle-wrapper.properties` and the owned `.socket/gradle/` files). **npm-family flavor coverage**: package-lock / npm-shrinkwrap, pnpm (root OR any nested `*/pnpm-lock.yaml`), yarn classic, **yarn berry** (the pin yarn writes for a root `resolutions` entry: the root `package.json` — edited only beside a berry `yarn.lock` — gains one `"@npm:": ""` selector per locked range (`redirect_yarn_berry_resolution` edits), and only that `yarn.lock` entry is re-keyed `"@"` with the same `resolution:` + `yarnBerry10c0` checksum (`redirect_yarn_berry_entry`), moved to yarn's key order; never an `npm:` locator, whose fetcher sends npm registry auth to the patch host, nor a tarball locator under an `npm:` key, which hardened mode rejects (YN0078). An older release's `npm:::__archiveUrl=` pin is still recognized and is re-pinned on the next run; rollback rebuilds the key from the selectors and drops them. Refused, nothing written: a user-authored `resolutions` entry for the package `redirect_yarn_berry_resolutions_conflict`, no root manifest `redirect_yarn_berry_manifest_missing`, a builtin `patch:` entry wrapping the same descriptor `redirect_yarn_berry_shared_descriptor`, an artifact URL yarn cannot fetch as a tarball `redirect_yarn_berry_artifact_url_unsupported`; cacheKey `10c0` and `.yarnrc.yml compressionLevel 0` gated by `redirect_yarn_berry_cache_unsupported`), and **bun** (text `bun.lock` lockfileVersion 0, 1 or 2 — 0 is the `--save-text-lockfile` opt-in lock of Bun 1.1.39–1.1.45, 1 the 1.2–1.3 default, 2 the 1.4+ default; all three emit one `packages` grammar, so the registry 4-tuple → URL 3-tuple rewrite is version-independent and the lock's own version line is kept. Any other or missing version, or a `packages` section outside bun's single-line grammar, is refused `redirect_bun_lock_unsupported` — the detail is the shared version gate's text (a newer version: update socket-patch, re-locking would reproduce it; no integer: re-lock with Bun ≥ 1.2), identical to the vendored refusal. A version-0 lock holding `workspace:` packages is refused `redirect_bun_workspace_unsupported` (its 2-tuple workspace grammar cannot keep the hosted tuple through a frozen install); the remedy is to delete `bun.lock` and re-run `bun install` with Bun ≥ 1.2, which writes lockfileVersion 1 (accepted). A plain in-place `bun install` bumps the version only when a workspace depends on another workspace (e.g. root → member — the shape the matrix measured); otherwise Bun 1.2.0 keeps version 0 and Bun 1.2.23+ fail to resolve, so the in-place bump is not the documented remedy. Bun lock version, grammar and workspace compatibility are checked before a vendored takeover, including during dry-run: these refusals preserve the existing lock, artifact and vendor ledger. Version-1 and version-2 workspace locks are rewritten, nested versions included. A granted dep with no rewritable entry warns `redirect_bun_entry_not_found`, a grant without a sha512 `redirect_bun_missing_sha512`; a CRLF lock keeps `\r\n` on the rewritten line, and a hosted URL left by an earlier grant of the same `name@version` is re-pinned in place. **Digest-less re-saves (Bun 1.1.39–1.3.9)**: every text-lock Bun below 1.3.10 re-saves a URL tuple WITHOUT its `sha512` whenever the lock is re-saved for another reason (`bun add`, `bun install` after a package.json or workspace change), leaving the 2-tuple `["name@", {meta}]` — the spec Bun installs from is intact. The CLI treats that spelling as its own wiring: a repeat hosted run counts the dep as redirected (no `redirect_bun_entry_not_found`) and HEALS the line back to the 3-tuple with the current `sha512`, recording the heal as a further `redirect_bun_lock_package` edit whose `original` is the 2-tuple (a stale URL is re-pinned from either spelling); `rollback`, scoped `rollback ` / `remove ` and the vendored takeover accept the digest-less spelling of a recorded `new` line (same key, spec and meta, only the trailing `"sha512-…"` missing) and restore the recorded original over it, so the chain always unwinds to the pristine registry line. Anything else — another uuid/token, another version, a re-laid meta object — is still drift. **Native `bun.lockb`**: when no text `bun.lock` exists, binary format versions 1, 2 and 3 are read and rewritten directly. Socket Patch does not invoke Bun or convert the project to a text lockfile. Exact matching package records are rewritten to hosted tarballs with the granted integrity, preserving dependency resolution IDs, workspace/dependency topology and unrelated package metadata; binary pointers and the package metadata hash are updated. Per-package `redirect_bun_lockb_package` snapshots support scoped rollback, repeat runs, superseding grants and hosted ↔ vendored takeover. A regular binary lock is discoverable even with no Bun runtime or `node_modules`; a dry run previews the same binary edits without writing them. A malformed, unreadable, unsupported or unverified binary structure is `redirect_bun_lockb_invalid` (exit 0, `redirected: 0`), and it refuses the npm rewrite before any takeover or sibling npm-family lock mutation. A symlinked binary write target is `redirect_symlinked_file_unsupported` (exit 1, including dry-run). `bun.lock` wins when both spellings exist. Binary-only projects do not receive `redirect_npm_no_lockfile`. Measured boundaries and the real-Bun matrix: `docs/testing/bun-compatibility.md`), and **vlt** (`vlt-lock.json` without `lockfileVersion`, `0` or `1`; see the vlt hosted-mode contract below). **Rush monorepos**: when `rush.json` is present the rewriter also reads `common/config/rush/pnpm-lock.yaml` and each `common/config/subspaces//pnpm-lock.yaml` (sorted for determinism) under their repo-relative keys and repoints them in place; editing them emits `redirect_rush_repo_state_stale` when `common/config/rush/repo-state.json` exists (the `pnpmShrinkwrapHash` desync is refreshed by `rush update`, which the redirect survives). **maven** is fail-closed via version suffixing: a `mavenSuffixedVersion` + `mavenPomSha256` override pins the Socket-only `-socket.` by rewriting the literal `` (`redirect_maven_dep_version`) or adding a `` entry (`redirect_maven_dep_management_added`), plus optional Trusted Checksums (`redirect_maven_trusted_checksums`, conflicts as `redirect_maven_trusted_checksums_conflict`; when `.mvn/wrapper/maven-wrapper.properties` pins a Maven older than 3.9.4, which ignores those files, the additive warning `redirect_maven_trusted_checksums_unenforced`); a `${property}` version is refused (`redirect_maven_dep_unpinned`), a non-matching literal skipped (`redirect_maven_dep_version_mismatch`), and an override without a suffixed version falls back to same-GAV repository injection (`redirect_maven_same_gav_fallback`, NOT fail-closed). **gradle** (v5.0) is automated wiring, no longer a pasted snippet: the owned settings script `.socket/gradle/socket-patch.hosted.settings.gradle` with its index `.socket/gradle/hosted-index.tsv`, one apply line per build's settings file, every lock entry of the GA moved to the suffixed version, and the suffixed component in an existing `gradle/verification-metadata.xml`. A refused dep writes nothing and keeps `redirect_gradle_manual_snippet` as its fallback; same-GAV grants are refused (`redirect_gradle_same_gav_unsupported`). Rules, refusals and codes: [Gradle builds](#gradle-builds-v50). +The rewriter reads a fixed set of candidate files from the project root: the npm-family locks (`package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `shrinkwrap.yaml`, `yarn.lock`, plus `.yarnrc.yml` for the berry cache-config gate, `bun.lock` / `bun.lockb`, and `vlt-lock.json` with `vlt.json` and `node_modules/.vlt-lock.json` read only), `requirements.txt` / `uv.lock` / `Pipfile.lock` (pipfile-spec 6; see the Pipenv section below) / `poetry.lock` (every Poetry lock generation from 1.0 on — the 0.12 `[metadata.hashes]` layout is refused because that installer ignores URL sources; a Poetry < 1.4 writer additionally gets `redirect_poetry_stale_install_risk`, see `docs/testing/poetry-compatibility.md`) / `pdm.lock` (PDM lock formats `2` and `4.3`–`4.5.1`; the identity-losing `3.1` / `4.0`–`4.2` formats and unknown future formats are refused with `redirect_pdm_refused`, and a lock-format-`2` writer additionally gets `redirect_pdm_legacy_sync_required`, see `docs/testing/pdm-compatibility.md`; when `uv.lock` or `poetry.lock` sits beside it they drive and `pdm.lock` is left alone), `Cargo.toml` / `Cargo.lock` / `.cargo/config.toml` (plus the legacy extensionless `.cargo/config` — cargo reads that spelling in preference when both exist, so the managed `[registries.…]` block is written into whichever one is present; **cargo also reads every workspace-member manifest** — the `[workspace] members` globs minus `exclude` — and every in-root path-dependency manifest, recursively, reached without crossing a symbolic link and never under `.socket/`, and pins the crate in each one that declares it, so those `/Cargo.toml` files can appear in `rewrittenFiles`. A crate is redirected only when every declaration pins and every other `Cargo.lock` package depending on it is a planned member: one a registry or git crate — or a path package outside the root or behind a link — also depends on is refused `redirect_cargo_transitive_dependents` (a pin reaches only the declarations it sits on), a crate no manifest declares keeps `redirect_cargo_toml_dep_not_found` with a transitive-only detail naming `--mode vendored`, a crate every declaration of which requires another version (no requirement accepts the patched version) is refused `redirect_cargo_toml_dep_unrewritable`, and so is a requirement that also matches another locked version of the crate — each a transactional skip, never recorded or attested. With NO `Cargo.lock` there is no resolved graph to ask, so the dependents question is answered from the manifests instead: a crate declared beside any other dependency — anything but a path dependency on a manifest this run also pins, or a `workspace = true` inheritor of a table it scans — or beside a workspace member this run did not read (a `members` glob, or a member outside the project or behind a symbolic link, which member discovery drops) is refused `redirect_cargo_lockless_dependents`, whose detail names the remedies (commit a lockfile, or `--mode vendored`); a project whose only dependency is the patched crate has nothing that could pull it in and still redirects. All-CRLF manifests, locks and configs are rewritten with CRLF kept (mixed endings keep refusing where the grammar does not match), and `remove` / rollback match the recorded fragments across a later CRLF↔LF checkout conversion), `composer.lock`, `nuget.config` / `packages.lock.json`, `Gemfile` / `Gemfile.lock`, `pom.xml` (+ `.mvn/maven.config` / `.mvn/checksums/checksums.sha256` for maven Trusted Checksums merge, and, for a Gradle build, every settings, build, `buildSrc`, included-build, applied and plugin-source script, version catalog and lock file the script graph reaches, plus `gradle/verification-metadata.xml`, `gradle/wrapper/gradle-wrapper.properties` and the owned `.socket/gradle/` files), and the sbt build files (`socket-patch.sbt`, `socket-patch-vendor.sbt`, `build.sbt`, `project/build.properties`, `.sbtopts`, `.jvmopts`; `build.sbt.lock` and the Mill / scala-cli build files `build.mill`, `build.mill.yaml`, `build.sc`, `.mill-version`, `project.scala` for their presence only) — read, never edited; `socket-patch.sbt` is the only sbt file hosted mode writes (see **Hosted sbt** below). **npm-family flavor coverage**: package-lock / npm-shrinkwrap, pnpm (root OR any nested `*/pnpm-lock.yaml`), yarn classic, **yarn berry** (the pin yarn writes for a root `resolutions` entry: the root `package.json` — edited only beside a berry `yarn.lock` — gains one `"@npm:": ""` selector per locked range (`redirect_yarn_berry_resolution` edits), and only that `yarn.lock` entry is re-keyed `"@"` with the same `resolution:` + `yarnBerry10c0` checksum (`redirect_yarn_berry_entry`), moved to yarn's key order; never an `npm:` locator, whose fetcher sends npm registry auth to the patch host, nor a tarball locator under an `npm:` key, which hardened mode rejects (YN0078). An older release's `npm:::__archiveUrl=` pin is still recognized and is re-pinned on the next run; rollback rebuilds the key from the selectors and drops them. Refused, nothing written: a user-authored `resolutions` entry for the package `redirect_yarn_berry_resolutions_conflict`, no root manifest `redirect_yarn_berry_manifest_missing`, a builtin `patch:` entry wrapping the same descriptor `redirect_yarn_berry_shared_descriptor`, an artifact URL yarn cannot fetch as a tarball `redirect_yarn_berry_artifact_url_unsupported`; cacheKey `10c0` and `.yarnrc.yml compressionLevel 0` gated by `redirect_yarn_berry_cache_unsupported`), and **bun** (text `bun.lock` lockfileVersion 0, 1 or 2 — 0 is the `--save-text-lockfile` opt-in lock of Bun 1.1.39–1.1.45, 1 the 1.2–1.3 default, 2 the 1.4+ default; all three emit one `packages` grammar, so the registry 4-tuple → URL 3-tuple rewrite is version-independent and the lock's own version line is kept. Any other or missing version, or a `packages` section outside bun's single-line grammar, is refused `redirect_bun_lock_unsupported` — the detail is the shared version gate's text (a newer version: update socket-patch, re-locking would reproduce it; no integer: re-lock with Bun ≥ 1.2), identical to the vendored refusal. A version-0 lock holding `workspace:` packages is refused `redirect_bun_workspace_unsupported` (its 2-tuple workspace grammar cannot keep the hosted tuple through a frozen install); the remedy is to delete `bun.lock` and re-run `bun install` with Bun ≥ 1.2, which writes lockfileVersion 1 (accepted). A plain in-place `bun install` bumps the version only when a workspace depends on another workspace (e.g. root → member — the shape the matrix measured); otherwise Bun 1.2.0 keeps version 0 and Bun 1.2.23+ fail to resolve, so the in-place bump is not the documented remedy. Bun lock version, grammar and workspace compatibility are checked before a vendored takeover, including during dry-run: these refusals preserve the existing lock, artifact and vendor ledger. Version-1 and version-2 workspace locks are rewritten, nested versions included. A granted dep with no rewritable entry warns `redirect_bun_entry_not_found`, a grant without a sha512 `redirect_bun_missing_sha512`; a CRLF lock keeps `\r\n` on the rewritten line, and a hosted URL left by an earlier grant of the same `name@version` is re-pinned in place. **Digest-less re-saves (Bun 1.1.39–1.3.9)**: every text-lock Bun below 1.3.10 re-saves a URL tuple WITHOUT its `sha512` whenever the lock is re-saved for another reason (`bun add`, `bun install` after a package.json or workspace change), leaving the 2-tuple `["name@", {meta}]` — the spec Bun installs from is intact. The CLI treats that spelling as its own wiring: a repeat hosted run counts the dep as redirected (no `redirect_bun_entry_not_found`) and HEALS the line back to the 3-tuple with the current `sha512`, recording the heal as a further `redirect_bun_lock_package` edit whose `original` is the 2-tuple (a stale URL is re-pinned from either spelling); `rollback`, scoped `rollback ` / `remove ` and the vendored takeover accept the digest-less spelling of a recorded `new` line (same key, spec and meta, only the trailing `"sha512-…"` missing) and restore the recorded original over it, so the chain always unwinds to the pristine registry line. Anything else — another uuid/token, another version, a re-laid meta object — is still drift. **Native `bun.lockb`**: when no text `bun.lock` exists, binary format versions 1, 2 and 3 are read and rewritten directly. Socket Patch does not invoke Bun or convert the project to a text lockfile. Exact matching package records are rewritten to hosted tarballs with the granted integrity, preserving dependency resolution IDs, workspace/dependency topology and unrelated package metadata; binary pointers and the package metadata hash are updated. Per-package `redirect_bun_lockb_package` snapshots support scoped rollback, repeat runs, superseding grants and hosted ↔ vendored takeover. A regular binary lock is discoverable even with no Bun runtime or `node_modules`; a dry run previews the same binary edits without writing them. A malformed, unreadable, unsupported or unverified binary structure is `redirect_bun_lockb_invalid` (exit 0, `redirected: 0`), and it refuses the npm rewrite before any takeover or sibling npm-family lock mutation. A symlinked binary write target is `redirect_symlinked_file_unsupported` (exit 1, including dry-run). `bun.lock` wins when both spellings exist. Binary-only projects do not receive `redirect_npm_no_lockfile`. Measured boundaries and the real-Bun matrix: `docs/testing/bun-compatibility.md`), and **vlt** (`vlt-lock.json` without `lockfileVersion`, `0` or `1`; see the vlt hosted-mode contract below). **Rush monorepos**: when `rush.json` is present the rewriter also reads `common/config/rush/pnpm-lock.yaml` and each `common/config/subspaces//pnpm-lock.yaml` (sorted for determinism) under their repo-relative keys and repoints them in place; editing them emits `redirect_rush_repo_state_stale` when `common/config/rush/repo-state.json` exists (the `pnpmShrinkwrapHash` desync is refreshed by `rush update`, which the redirect survives). **maven** is fail-closed via version suffixing: a `mavenSuffixedVersion` + `mavenPomSha256` override pins the Socket-only `-socket.` by rewriting the literal `` (`redirect_maven_dep_version`) or adding a `` entry (`redirect_maven_dep_management_added`), plus optional Trusted Checksums (`redirect_maven_trusted_checksums`, conflicts as `redirect_maven_trusted_checksums_conflict`; when `.mvn/wrapper/maven-wrapper.properties` pins a Maven older than 3.9.4, which ignores those files, the additive warning `redirect_maven_trusted_checksums_unenforced`); a `${property}` version is refused (`redirect_maven_dep_unpinned`), a non-matching literal skipped (`redirect_maven_dep_version_mismatch`), and an override without a suffixed version falls back to same-GAV repository injection (`redirect_maven_same_gav_fallback`, NOT fail-closed). **gradle** (v5.0) is automated wiring, no longer a pasted snippet: the owned settings script `.socket/gradle/socket-patch.hosted.settings.gradle` with its index `.socket/gradle/hosted-index.tsv`, one apply line per build's settings file, every lock entry of the GA moved to the suffixed version, and the suffixed component in an existing `gradle/verification-metadata.xml`. A refused dep writes nothing and keeps `redirect_gradle_manual_snippet` as its fallback; same-GAV grants are refused (`redirect_gradle_same_gav_unsupported`). Rules, refusals and codes: [Gradle builds](#gradle-builds-v50). + +**Hosted sbt (v5.0, additive)**: an sbt build root (`project/build.properties` naming an `sbt.version`, 0.13.18 or later) is wired through ONE generated root file, `socket-patch.sbt` — no user file is edited. It pins every granted Maven patch build-wide (a `ThisBuild` `dependencyOverrides +=` of the Socket-only `-socket.` version plus a `file:` resolver over `.socket/sbt-hosted/maven2/`, moved ahead of the default repositories on sbt 0.13 / 1.x so an unreachable one never blocks it offline), downloads the pinned pom and jar there on the first sbt load (sha256-checked, gitignored by the file itself), and installs a load-time verifier that fails `update` when any project resolves another version or a pinned artifact whose bytes are not pinned. Edits: `redirect_sbt_pin` (added), `redirect_sbt_pin_updated` (an existing row replaced: same GA and base under a new uuid, or the same uuid with new served values; `original` names the previous uuid and version), `redirect_sbt_pin_rechecked` (an existing row re-verified after the build's dependencies changed: its dependency digest is recorded anew, `original`/`new` are `{deps}`). The load-time verifier also fails `update` when a project declares a pinned GA at a version newer than the pin's base (the build-wide override would otherwise force it back down). A new pin is gated on sbt's own resolution records under `target/` (never the machine-wide cache): run-level stops wire nothing, warn once and exit 0 — `redirect_sbt_no_resolution_evidence` (none; run `sbt update` first; always the in-memory engine's answer), `redirect_sbt_resolution_incomplete` (a declared project left no evidence, or the project definitions cannot be read statically), `redirect_sbt_resolution_stale` (a build source is newer than some project's evidence: each project is dated by its own newest record, so a partial `sbt /update` does not vouch for the others). Per-patch refusals (never confirmed): `redirect_sbt_missing_override` (no `maven2` override or no suffixed version), `redirect_sbt_integrity_missing` (jar or pom sha256 missing), `redirect_sbt_unsafe_value` (a value unsafe in a Scala literal, or an index URL not naming the uuid), `redirect_sbt_version_conflict` (some project resolves another version, or a build source declares the GA newer than the patch's base), `redirect_sbt_override_conflict` (two patches for one GA in a run, or another base already pinned), `redirect_sbt_vendored_conflict` (the GA is pinned by `socket-patch-vendor.sbt`, or that file cannot be parsed — then every Maven patch), `redirect_sbt_owned_file_modified` / `redirect_sbt_owned_file_foreign` (`socket-patch.sbt` edited, or not socket-patch's — every Maven patch), `redirect_sbt_unsupported_version`, `redirect_sbt_build_root_unknown` (sbt files but no versioned build root — every Maven patch), `redirect_sbt_overrides_assignment` / `redirect_sbt_resolvers_assignment` (a build source reassigns `dependencyOverrides` / `resolvers` with `:=`, `~=` or `--=`), `redirect_sbt_dependency_lock_present` (a `build.sbt.lock`), `redirect_sbt_scala_runtime_unsupported` (`org.scala-lang`), `redirect_sbt_classifier_unsupported`; a GA no library configuration resolves is skipped silently (`redirect_sbt_meta_build_only` when only the meta-build resolves it). Advisories: `redirect_sbt_version_untested` (sbt 2.1+, still wired), `redirect_sbt_override_build_repos` (`sbt.override.build.repos=true`), `redirect_maven_pom_ignored_sbt_build` (a `pom.xml` beside the sbt build, which sbt never reads; the Maven rewriter still edits it for the Maven build). A re-run keeps an existing row and re-checks it. When the build's dependency digest changed since the pin, evidence resolved after the change (fresh, newer than the generated file) re-verifies it and the row's digest is refreshed (`redirect_sbt_pin_rechecked`); the uuid is NOT confirmed on `redirect_sbt_pin_declared_newer` (a build source now declares the GA newer than the pin's base; the row stays, sbt's load-time verifier fails the build, and the remedy is `socket-patch rollback` or declaring the base again), `redirect_sbt_pin_unverifiable` (the digest changed and the evidence predates the change, or the digest cannot be computed: run `sbt update`, then re-run socket-patch), `redirect_sbt_override_shadowed` (the evidence still resolves the base version) or `redirect_sbt_resolved_elsewhere` (the pinned version resolves from outside the pin repository from a file whose sha256 is not the pinned jar's; a copy holding the pinned bytes, such as the Ivy cache a second checkout reads, is fine — at most 64 pinned artifact files of up to 256 MiB are hashed, anything else counts as elsewhere), and also when a build source now reassigns `dependencyOverrides` / `resolvers` or a `build.sbt.lock` appeared (the same `redirect_sbt_overrides_assignment` / `redirect_sbt_resolvers_assignment` / `redirect_sbt_dependency_lock_present` codes; the row stays and sbt's load-time verifier fails the build). For a pure sbt root (no `pom.xml` / Gradle script beside it), maven confirmation is decided only by the sbt rewriter's report; on a mixed root a uuid the sbt rewriter refused is still confirmed by the Maven rewriter's own `pom.xml` pin (the generated sbt files never prove a pin by substring). **Mill and scala-cli** are guidance only: per Maven patch `redirect_mill_manual_snippet` / `redirect_scala_cli_manual_snippet` carry a paste-able snippet (repository + forced suffixed version), nothing is written or confirmed, and a pure Mill / scala-cli root gets no `redirect_maven_no_pom`; there, a Maven patch the server sent without a `maven2` registry override gets `redirect_maven_missing_override` instead of a snippet (with a `pom.xml` beside the Mill / scala-cli files the pom rewriter reports it). `rollback` / `remove` restore `socket-patch.sbt` offline (the rows removed, the file deleted with its last pin; the gitignored downloads are left). Manifest-less VEX reads every strictly parsed pin as a hosted reference but grants it the lockfile basis only when the local evidence shows every recorded version of the GA is the pinned one and every recorded artifact hashes to a pinned sha256 (else `sbt_resolution_unverified`). **Gem stale-install guard (additive warning — the canonical narrative; other mentions point here)**: the gem hosted rewrite is pure Gemfile/lock text, so a gem ALREADY materialized under the project's bundle paths keeps its upstream bytes — the next `bundle install` prints `Using ` and never refetches, on **every** bundler major (live-verified 2026-08-19 on 1.17.3 / 2.7.2 / 4.0.18: bundler 4's CHECKSUMS verify at download time only, and nothing is downloaded; `bundle install --force`/`--redownload` re-install from the stale cached `.gem` instead of re-fetching — bundler 1 silently, bundler 4 with an exit-37 checksum refusal that still leaves the upstream bytes installed; the **verified** remedy is removing the installed dir + cache `.gem` + `specifications` entry, then `bundle install`). After the rewrite, a hosted run therefore probes the installed-gem discovery paths (the same ruby-crawler discovery `apply` uses, honoring `--global`/`--global-prefix` like scan's own discovery) for each confirmed gem redirect and judges the materialization against the patch record's `afterHash` file map. Judgment rules: records are found **by uuid** among this run's fetched records (v5.0: hosted mode persists no records, so a purl whose `/patches/view` fetch failed this run is not judged; the warning re-fires on every re-scan whose fetch succeeds, until the stale materialization is gone); a materialization with every file at `afterHash` is already patched and never warns (an agent→hosted migration stays quiet by construction), and when several confirmed variant purls resolve to one installed dir, ANY of them judging it patched keeps it quiet; staleness needs **positive evidence** — at least one record file whose bytes were actually read and hash to neither state's expectation — so missing or unreadable files never produce a warning. Warnings emit `redirect_gem_stale_install` (JSON `redirect.warnings[]` + a code-tagged stderr line) in three flavors: a PROJECT-LOCAL dir gets the verified delete-list remedy (installed dir, cache `.gem`, `specifications` entry — plus the project's committed `/.gem` when present and not proven to be the patched artifact, since bundler installs from its cache dir in preference to fetching); a SHARED gem-env home gets a caveat that the home is shared machine-wide and prefers migrating the project to a local bundle path over deleting shared files; and a committed cache-dir archive whose sha256 differs from the patched artifact's warns standalone even with no installed dir at all (a fresh checkout with a committed stale cache re-materializes the upstream bytes forever). A stale-flagged purl is additionally **excluded from the same run's `--vex` `assume_applied` set** — the envelope must never attest a CVE its own warning says is live; the purl falls back to normal installed-tree verification (a patched install still attests, a stale one is omitted). The cache dir is bundler's `cache_path` setting (`Bundler.app_cache`), resolved in `Bundler::Settings` priority: `BUNDLE_CACHE_PATH:` in the bundler app config (`$BUNDLE_APP_CONFIG/config`, else `.bundle/config`) first, then the `BUNDLE_CACHE_PATH` environment variable, else `vendor/cache`; a relative value is read against the project root. With `BUNDLE_IGNORE_CONFIG` set (any value) bundler reads no config file, so the app config is skipped here too and only the environment and the default count — the same holds for the `BUNDLE_GEMFILE:` app-config setting. The probe is read-only (nothing is deleted) and skipped on `--dry-run` — deliberately explicit, since nothing was rewritten. Exit code and `status` are unchanged (warning-only, the hosted-refusal posture); a same-run `--vex` may still fail on "nothing to attest" per the embedded-VEX contract. @@ -219,7 +221,7 @@ patches: **Paths.** Path lists are gitignore patterns with the npm `ignore` package's semantics (the backend's `projectIgnorePaths` matcher): case-insensitive, anchored at the repo root, a leading or middle `/` anchors, a bare name matches at any depth, a trailing `/` matches directories only, `!` negates, the last match wins, and a negation cannot re-include anything under an ignored directory (evaluation walks top-down). Backslash is gitignore's escape character, not a separator. Patterns with a `..` segment, a drive letter, a NUL byte, or over 1024 bytes are rejected. -- They are matched against a project root's **marker files**, repo-relative: the lockfiles in the root's directory (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock(b)`, `vlt-lock.json`, `rush.json`, `uv.lock`, `poetry.lock`, `pdm.lock`, `Pipfile.lock`, `requirements.txt`, `*.py.lock`/`pylock*.toml`, `Cargo.lock`, `go.mod`, `go.sum`, `composer.lock`, `Gemfile.lock`, `gems.locked`, plus the Maven/NuGet markers). A root is ignored iff **every** marker is ignored; with `includePaths`, it is included iff **any** marker matches; a disk root with no lockfile uses its manifests (`package.json`, `pyproject.toml`, `setup.py`, `Cargo.toml`, `composer.json`, `Gemfile`, `pom.xml`, `build.gradle`) instead, and one with neither is matched as its directory. So `/package-lock.json`, `**/yarn.lock` and `examples/**` mean what they mean to the scanner; `includePaths: ["/*", "!/*/"]` targets only the repo-root project. +- They are matched against a project root's **marker files**, repo-relative: the lockfiles in the root's directory (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock(b)`, `vlt-lock.json`, `rush.json`, `uv.lock`, `poetry.lock`, `pdm.lock`, `Pipfile.lock`, `requirements.txt`, `*.py.lock`/`pylock*.toml`, `Cargo.lock`, `go.mod`, `go.sum`, `composer.lock`, `Gemfile.lock`, `gems.locked`, plus the Maven/NuGet markers). A root is ignored iff **every** marker is ignored; with `includePaths`, it is included iff **any** marker matches; a disk root with no lockfile uses its manifests (`package.json`, `pyproject.toml`, `setup.py`, `Cargo.toml`, `composer.json`, `Gemfile`, and the JVM build files: `pom.xml`, `build.gradle(.kts)`, `settings.gradle(.kts)`, `build.sbt`, `build.mill`, `build.mill.yaml`, `build.sc`, `project.scala`) instead, and one with neither is matched as its directory. So `/package-lock.json`, `**/yarn.lock` and `examples/**` mean what they mean to the scanner; `includePaths: ["/*", "!/*/"]` targets only the repo-root project. - Evaluation order (one combined list): the **built-in defaults** `test/ tests/ fixtures/ __fixtures__/ testdata/`, then `projectIgnorePaths`, then `patches.ignorePaths`. Re-include a default with a negation (`ignorePaths: ["!/e2e/tests/"]`). The defaults apply only to **discovered** roots: hosted/vendored PATH-glob matches and roots the in-memory engine detects. A root you name — `--cwd`, a literal PATH, an in-memory `projectRoots` entry — skips them (the other lists still apply). `node_modules .git .socket .yarn vendor` stay structural excludes of in-memory root detection; no policy negates them. - A workspace member that shares its root's lockfile is part of that root's project: exclude it with `ignorePackages`, not paths. - A hosted/vendored PATH that resolves outside the repository root is a usage error (exit 2): one policy per invocation. @@ -407,6 +409,9 @@ A reverted lockfile plus a leftover ledger or artifact therefore stops attesting | `lockfile_unparseable` | A supported file is not valid for its format. Nothing is discovered from it, and its Socket mentions are dead. | | `patched_ref_invalid` | A Socket-shaped reference failed validation or is not live wiring: unsafe coordinates, a non-canonical uuid, a leaf naming another package, a path escaping the root, an inert or orphaned entry. | | `patched_ref_unattributable` | A Socket patch uuid cannot be tied to exactly one artifact / version. Examples: a maven repository no pin names, a nuget source without a mapping, a lock contested by another lock. | +| `sbt_owned_file_modified` | `socket-patch.sbt` / `socket-patch-vendor.sbt` is not byte-for-byte what socket-patch generates; none of its pins is discovered. | +| `sbt_resolution_unverified` | An sbt pin the build's local resolution evidence (`target/`, after `sbt update`) does not verify: the reference stays, without the lockfile basis. | +| `vendored_tree_missing` | A `socket-patch-vendor.sbt` pin whose `.socket/vendor/maven2/` file is missing or modified. | Human mode also prints `Note:` lines: superseded records, fetch failures, `--offline` withholding fetches, conflict details, and why a claim is dead. While patch records are fetched, a terminal shows a transient `Fetching patch records... (n/N)` status line on stderr (never under `--json` / `--silent`). @@ -467,6 +472,47 @@ are patched by `socket-patch apply` like every other ecosystem: `.socket/` patches so a clone builds the patched bytes with no further step. `socket-patch apply --check` is a read-only audit of the committed redirect. +### sbt / Mill / scala-cli caches in agent mode + +A JVM project root (any `JVM_PROJECT_MARKERS` file, `build.sbt` / `build.mill` / `build.sc` / +`project.scala` included) makes agent-mode Maven discovery crawl the Maven local repository. Locally, only +an sbt / Mill / scala-cli project (`build.sbt`, `project/build.properties`, `build.mill`, `build.mill.yaml`, +`build.sc`, `project.scala` or `.scala-build/`; a Maven or Gradle build never reads these caches) also crawls, +after it in order and first copy winning the crawl dedup (`--global` always): every **Coursier** cache (`$COURSIER_CACHE`; `-Dcoursier.cache=` +in `$JAVA_OPTS`, `$SBT_OPTS`, `/.jvmopts`, `/.sbtopts`, `-J` prefix allowed; `-Dsbt.coursier.home=` +→ `/cache`; the OS default `$XDG_CACHE_HOME/coursier/v1` or `~/.cache/coursier/v1`, +`~/Library/Caches/Coursier/v1`, `%LOCALAPPDATA%\Coursier\{Cache,cache}\v1`; legacy `~/.coursier/cache/v1`), +each expanded to its per-repository Maven2 roots (`/https///`, found from poms whose +own coordinates spell their path); then every **Ivy** cache (`-Dsbt.ivy.home=` / `-Divy.home=` → +`/cache`, then `~/.ivy2/cache`, whose package directory is the module's `jars/` / `bundles/` / `orbits/`). +Every existing location is kept (an empty value counts as unset; a relative one resolves against the +project); an Ivy home whose path does not end in `<…ivy…>/cache` is skipped. The crawl is **not scoped** to +the build: as for `~/.m2`, every cached GAV is queried and patched. `--global-prefix` names exactly one +root, its layout read from its path. Patch keys are whole files in the package directory (`-.jar`), +the same parity as `~/.m2`. A GAV cached in several roots (say `~/.m2`, a Coursier cache and an Ivy cache) +is patched and restored in **every** root, one summary event per copy, since the build loads whichever its +resolver picks: the Coursier and Ivy copies join the Maven every-copy fan-out of +[Gradle builds](#gradle-builds-v50) as consumed copies (never `~/.m2` copies a Gradle-only build ignores), and +`vex` re-hashes each of them. Each per-repository root of a Coursier cache holding the GAV is its own copy; a +root reached twice through a symlink counts once. An Ivy copy is the module's `jars/` (`bundles/`, `orbits/`) +directory, and each patch file is looked up in every artifact type directory of the module, so a +`?classifier=sources` record patches `srcs/--sources.jar`. A Coursier version directory holding only its `.pom` (a +version Coursier considered and evicted; it downloads jars only for the versions it picks) is no copy and +is never a target. + +Coursier keeps hidden checksum sidecars beside each cached file and silently re-downloads a file whose +`.__sha1` disagrees with it, so after apply **and** rollback the CLI resyncs them: every +`.__{sha1,sha256,sha512,md5}` and its `.computed` digest is deleted, then the sha1 / sha256 / sha512 ones +that existed are rewritten to the new bytes (digest first, then checksum; each step atomic, so no +interruption leaves a stale checksum). md5 stays deleted (not restored by rollback); `.checked` is left +alone. The envelope's `sidecars[]` carries one `maven` record listing those files (`rewritten` / `deleted`, +paths relative to the package directory); a resync that fails is the usual `sidecar_fixup_failed` record +with the patch still applied, and the next `apply` / `rollback` (every file already at its target) retries +it when the sidecars show the resync unfinished (a sha checksum or digest disagreeing with the bytes, or md5 +left without a matching sha1); a copy Coursier left consistent, such as a pristine one a rollback finds +already original, is not touched and gets no record. `~/.m2` and Ivy copies produce no record. No new codes. A running sbt server, Bloop or Metals may hold +the old classpath: restart it after an agent apply. + ### Monorepo / multi-project discovery model How the `scan`/`apply` crawlers find subprojects differs by ecosystem, and @@ -1645,6 +1691,127 @@ vendoring option so scan/get/repair receive it too; omission preserves the ledger's recorded choice. Switching existing auto-config wiring to `none` requires reverting it first. `none` cannot be combined with a repository ban. +### sbt resolution evidence (hosted and vendored sbt) + +Hosted and vendored sbt pins are gated on sbt's own resolution records under +`target/` (the update-cache JSON on sbt 1.0–2.x, the Ivy reports on 0.13–1.2 +and `useCoursier := false`; scala-cli's `.scala-build/.bloop/*.json`), never on +the machine-wide cache, and sbt is never run. The walk looks for `target/` to +depth 6, skips `.git`, `node_modules`, `.socket`, `.bsp`, `.idea`, `.metals`, +`.bloop`, `.scala-build` and a top-level `out/`, never follows a symbolic link, +reads FIFO-safely, and stops at 512 files / 64 MiB / 8 MiB per file. Over a cap, +or with an unreadable or malformed record, there is no evidence at all. The +in-memory hosted engine never has evidence. Evidence is stale when a build +source (`*.sbt`, `project/*.scala`, `project/build.properties`) is newer than +the newest library record (the meta-build's records, which every sbt load +rewrites, never count); the remedy is `sbt update` (`sbt clean update` if the +warning persists). An sbt 2 project whose id is the meta-build's +(`-build`) shares its record directory with the meta-build and is +never trusted (its evidence counts as missing). + +Vendored codes (emitted before planning): + +| Code | Kind | Meaning | +|---|---|---| +| `vendor_sbt_no_resolution_evidence` | `skipped`, exit 0 | No readable evidence (the detail names a cap or read error) | +| `vendor_sbt_resolution_incomplete` | `skipped`, exit 0 | A declared project has no evidence, or the project definitions cannot be read statically | +| `vendor_sbt_resolution_stale` | `skipped`, exit 0 | A build source is newer than some project's evidence | +| `vendor_sbt_meta_build_only` | `skipped`, exit 0 | Only the meta-build (sbt plugins) resolves the GA | +| `vendor_jvm_not_resolved` | `skipped`, exit 0 | No project of the build resolves the GA; nothing to vendor | +| `vendor_sbt_pin_declared_newer` | refusal | A build source now declares an existing pin's GA newer than its base (the override would force it back down; sbt's load-time verifier fails the build). Revert the patch, or declare the base again | +| `vendor_sbt_version_conflict` | refusal | Some project resolves another version than the patch's base | +| `vendor_sbt_scala_runtime_unsupported` | refusal | `org.scala-lang` / `org.scala-lang.*` | +| `vendor_sbt_classifier_unsupported` | refusal | A classified artifact other than `sources` / `javadoc` is resolved | +| `vendor_sbt_pin_unverifiable` | advisory | An existing pin's dependency digest no longer matches the build and the evidence predates the change (fresh evidence re-verifies the pin and records the new digest) | +| `vendor_sbt_override_shadowed` | advisory | An existing pin's base version is still resolved somewhere | +| `vendor_sbt_resolved_elsewhere` | advisory | An existing pin's suffixed version resolves from outside `.socket/vendor/maven2` from a file whose sha256 is not the pinned jar's (a copy with the pinned bytes, e.g. the Ivy cache, is fine) | + +A run-level skip is a `skipped` event carrying the code (never counted +applied). A GA no project resolves is `vendor_jvm_not_resolved` (`SOCKET_DEBUG` +also logs `vendor_sbt_not_resolved`). Vendoring over a hosted sbt pin (a +takeover, or an eject) runs this gate BEFORE the hosted pin is restored: a pin +the gate would stop is refused (`failed` with the gate's code; an eject is +refused whole, `eject_refused`) and stays hosted. An eject whose vendored run +leaves any ejected package without a ledger entry is `eject_incomplete` and +restores the pre-eject files. The pin's dependency digest is the one over every +build source the evidence walk reads (the hosted definition). + +**Vendored sbt.** An sbt build root (`project/build.properties` naming an +`sbt.version` of 0.13.18 or later) routes to the JVM backend as well. It writes +no user file: the generated root `socket-patch-vendor.sbt` pins the sha256 of +each tree file, resolves from the reactor-style suffixed tree +`.socket/vendor/maven2///-socket./` (its resolver moved ahead of the +default repositories on 0.13 / 1.x, so the tree resolves with the network down) (re-included by its own +`.gitignore`, `!*`, and kept byte-exact by `.gitattributes`) and forces the +suffixed version with `dependencyOverrides +=`. Its load-time check and +post-resolution verifier fail the sbt build closed on a tampered tree or a +replaced pin. Ledger records: `sbt_build_fragment` (`file`, `pin:`), the +tree root's `jvm_owned_file`s, and the usual tree/upstream records. Revert drops +the patch's rows in any order and deletes the generated file, after a strict +parse proves it socket-patch's, once no pins remain; an edited file is +`vendor_lock_entry_drifted` and keeps the tree while it still names the patch. +A project already vendored through the Maven reactor, the single-pom path or the +Gradle backend stays on it when sbt files appear. A generated file left without +a ledger is `vendor_ledger_missing` for `vendor --check`. Refusals (nothing written): +`vendor_sbt_build_root_unknown` (no `sbt.version`; a subproject directory +inside an sbt build is `vendor_jvm_shape_unsupported` with +`reason: not_build_root`), `vendor_sbt_unsupported_version`, +`vendor_jvm_build_ambiguous` (a `` `pom.xml`, Gradle or Mill files +beside the sbt build), `vendor_sbt_owned_file_modified`, +`vendor_sbt_owned_file_foreign` (rename your own file), +`vendor_sbt_hosted_conflict` (the hosted `socket-patch.sbt` pins the GA, or +cannot be read), `vendor_sbt_override_conflict` (another base version of the +GA is pinned), `vendor_sbt_unsafe_value`, and, for a new pin only, +`vendor_sbt_overrides_assignment` / `vendor_sbt_resolvers_assignment` +(`dependencyOverrides` / `resolvers` assigned with `:=` or `~=` in `build.sbt`, +`project/plugins.sbt`, `project/Dependencies.scala`, `project/Build.scala` or a +declared subproject's `build.sbt`) and `vendor_sbt_dependency_lock_present`. +Warnings (still wired): `vendor_sbt_pom_ignored` (a single-module `pom.xml` +beside the build), `vendor_sbt_version_untested` (sbt 2.1 and later), +`vendor_sbt_override_build_repos` (`sbt.override.build.repos=true` in +`.sbtopts`, `.jvmopts` or `project/build.properties`: the build fails closed +at load), and `vendor_sbt_pin_unverifiable` (the build's dependency literals +changed since the pin was written and no evidence resolved since; the pin is +kept). The next steps name the generated root file to commit +(`socket-patch-vendor.sbt`, or `socket-patch.scala` for scala-cli) and +`sbt update` / `scala-cli compile --test .`. + +### Vendored scala-cli builds + +A root holding `project.scala` (or the owned `socket-patch.scala`) and no +`pom.xml`, Gradle or Mill build file is a scala-cli directory build. Vendoring +writes only owned files: the root `socket-patch.scala`, the guard +`.socket/vendor/coursier/socket-patch.scala`, the same-GAV tree +`.socket/vendor/coursier////` (jar, upstream pom, `.sha1` files, +marker) with its `.gitignore` (`!*`) and `.gitattributes`, and +`.socket/vendor/coursier-index.tsv`. Ledger entries use ecosystem `jvm`: +`coursier_index_fragment` (the index), `jvm_owned_file` (the two `.scala` +files and the tree's git files) and the usual tree/upstream records. +The gate reads scala-cli's Bloop project files under `.scala-build/.bloop/`; +it never runs scala-cli. See [the sbt / Mill / scala-cli design](../../docs/design/sbt-support.md). + +| Code | Action | Meaning | +|---|---|---| +| `vendor_scala_cli_resolution_missing` | `skipped` (warning, exit 0) | No Bloop project of this workspace under `.scala-build/.bloop/` (fresh clone, or only `--server=false` builds). Nothing is written; remedy: `scala-cli compile --test .` with the default Bloop server, then re-run. A GAV the committed tree already serves (`coursier-index.tsv` lists it) is never skipped for missing or stale evidence: it is re-planned in sync. | +| `vendor_scala_cli_resolution_stale` | `skipped` (warning, exit 0) | An input the evidence lists, or a source anywhere in the directory input it does not list, is newer than the last Bloop compile, or the evidence is a single-file run's (it does not list `project.scala`). Remedy: `scala-cli compile --test .`, then re-run. | +| `vendor_scala_cli_not_resolved` | `skipped` (warning, exit 0) | The build does not resolve the patched GA; nothing to vendor. | +| `vendor_scala_cli_version_conflict` | `failed` | The build resolves the GA at another version than the patch's base. | +| `vendor_scala_cli_classifier_unsupported` | `failed` | The build also resolves a classified artifact of the GA (other than `sources` / `javadoc`), which the tree's plain jar cannot serve. | +| `vendor_scala_cli_scala_runtime_unsupported` | `failed` | The GA is the Scala runtime (`org.scala-lang`), selected by `//> using scala`. | +| `vendor_scala_cli_repository_shadowed` | `failed` | An input (any source the evidence lists, inside the project or not, or any `.scala`/`.sc`/`.java` file of the directory) declares a repository (`//> using repository`/`repositories`/`repo`, or a `-r` / `--repository` option), which scala-cli consults before the tree, or pins a dependency of the patched group to a direct `,url=`, which bypasses every repository, or a build after wiring resolved the GA outside the tree (a command-line `-r`). Remedy: move the repository to `COURSIER_REPOSITORIES` (consulted after the tree) or use hosted mode. | +| `vendor_scala_cli_path_unsupported` | `failed` | The project path holds `%` or a non-ASCII character, which scala-cli's `file://${.}` URL cannot carry (it percent-decodes, and fails the build on non-ASCII). | +| `vendor_scala_cli_windows_unsupported` | `failed` | Windows: `file://${.}` is unverified there. | +| `vendor_scala_cli_owned_file_modified` | `failed` | `socket-patch.scala` or the guard exists with other bytes (a CRLF checkout of the owned text counts as unmodified). | +| `vendor_coursier_tree_conflict` | `failed` | The patch's version directory holds another patch's marker that the index does not list. | +| `vendor_scala_cli_directives_split` | warning | `project.scala` exists, so scala-cli warns "Using directives detected in multiple files"; `project.scala` is never edited. | + +Revert removes the patch's index rows and tree; the last one out also deletes +the index, both `.scala` files and the tree's git files. A modified owned file +is left alone (`vendor_lock_entry_drifted`), and while a left-behind +`socket-patch.scala` still includes the guard, the guard and the tree stay +(`kept_artifact`). Single-file runs (`scala-cli run main.scala`) ignore the +directory wiring: pass `-r file://$PWD/.socket/vendor/coursier`. + ## Gradle builds (v5.0) Gradle is part of the `maven` ecosystem: Gradle-resolved artifacts are Maven PURLs diff --git a/crates/socket-patch-cli/src/commands/apply.rs b/crates/socket-patch-cli/src/commands/apply.rs index cfd788a2a..ba2b8d9e6 100644 --- a/crates/socket-patch-cli/src/commands/apply.rs +++ b/crates/socket-patch-cli/src/commands/apply.rs @@ -2557,23 +2557,27 @@ async fn apply_maven_base(m: &MavenBase<'_>) -> MavenApplied { // a mavenLocal() artifact in files-2.1, so this is also exactly what a // build reading the module from mavenLocal() looks like: warn, not // refuse. `vex` re-hashes the Gradle cache copy that build makes. + // Only the `~/.m2` copies are named: a Coursier / Ivy copy beside them + // (an sbt build in the same root) is no Maven local repository. + let m2_copies: Vec = copies + .consumed + .iter() + .filter(|c| c.starts_with(&m.scope.env.m2_repo)) + .map(|p| p.display().to_string()) + .collect(); if matches!( m.scope.gate, Some(socket_patch_core::crawlers::maven_crawler::M2Gate::Declared(_)) | Some(socket_patch_core::crawlers::maven_crawler::M2Gate::Undetermined(_)) - ) && copies.consumed.iter().all(|c| !is_gradle_version_dir(c)) + ) && !m2_copies.is_empty() + && copies.consumed.iter().all(|c| !is_gradle_version_dir(c)) { out.warn( "gradle_m2_may_be_unconsumed", format!( "{}: the only patched copy is in the Maven local repository ({}). This Gradle build reads it only when no repository declared before mavenLocal() has the module; otherwise its next build downloads the unpatched jar. Run the build once and apply again so the Gradle cache copy is patched too.", normalize_purl(m.base_purl), - copies - .consumed - .iter() - .map(|p| p.display().to_string()) - .collect::>() - .join(", ") + m2_copies.join(", ") ), ); } @@ -2646,16 +2650,22 @@ async fn apply_maven_base(m: &MavenBase<'_>) -> MavenApplied { // holds are applied against the version dir, where they are // not found and fail the copy as they would on `~/.m2` (the // build still loads the held jar, so a silent skip would leave - // it unpatched behind a clean exit). - let (targets, absent) = if is_gradle_version_dir(copy) { + // it unpatched behind a clean exit). An Ivy copy expands the + // same way over its module's type dirs (`jars/`, `srcs/`, …). + let (targets, absent) = if gradle_cache::expands(copy) { let detailed = gradle_cache::installed_copies_detailed(copy, &patch.files); if detailed.targets.is_empty() { continue; } + // Only a Gradle hash dir's name proves its bytes are the + // pristine download; an Ivy type dir no variant matches is + // skipped as a `~/.m2` or Coursier copy is. for (dir, _) in &detailed.targets { - held.entry(dir.clone()) - .or_default() - .push((*variant).clone()); + if maven_sidecars::is_gradle_hash_dir(dir) { + held.entry(dir.clone()) + .or_default() + .push((*variant).clone()); + } } let absent: HashMap = detailed .missing @@ -2751,11 +2761,12 @@ async fn apply_maven_base(m: &MavenBase<'_>) -> MavenApplied { } out.matched.sort(); out.matched.dedup(); - // Nothing attempted. Gradle version dirs that hold none of a record's - // files (a pom-only entry, another classifier) are not installs of it: - // the variants stay unmatched (`package_not_installed`). A `~/.m2` copy - // no variant matches is a different distribution: an error, as before. - let gradle_only = copies.consumed.iter().all(|c| is_gradle_version_dir(c)); + // Nothing attempted. Gradle version dirs and Ivy artifact dirs that + // hold none of a record's files (a pom-only entry, another classifier) + // are not installs of it: the variants stay unmatched + // (`package_not_installed`). A `~/.m2` copy no variant matches is a + // different distribution: an error, as before. + let gradle_only = copies.consumed.iter().all(|c| gradle_cache::expands(c)); if !attempted && !out.failed && !gradle_only { out.failed = true; if args.prints_errors() { @@ -3302,6 +3313,75 @@ mod tests { ); } + /// A Maven GAV in two caches: only the second (Coursier) copy holds the + /// classifier jar, with a locally modified sibling file. The variant + /// gate runs per copy, as the apply loop attempts it per copy, so the + /// sibling's afterHash blob is queued although the first copy lacks the + /// classifier. + #[tokio::test] + async fn mismatch_blob_gaps_gates_each_maven_copy() { + use socket_patch_core::hash::git_sha256::compute_git_sha256_from_bytes; + + let dir = tempfile::tempdir().unwrap(); + let m2 = dir.path().join("m2/g/a/1"); + let csr = dir.path().join("csr/https/h/g/a/1"); + for copy in [&m2, &csr] { + tokio::fs::create_dir_all(copy).await.unwrap(); + tokio::fs::write(copy.join("a-1.jar"), b"jar\n") + .await + .unwrap(); + } + tokio::fs::write(csr.join("a-1-tests.jar"), b"tests\n") + .await + .unwrap(); + tokio::fs::write(csr.join("z-tests.txt"), b"locally modified\n") + .await + .unwrap(); + let blobs = dir.path().join("blobs"); + tokio::fs::create_dir_all(&blobs).await.unwrap(); + let mut base = HashMap::new(); + base.insert( + "a-1.jar".to_string(), + PatchFileInfo { + before_hash: compute_git_sha256_from_bytes(b"jar\n"), + after_hash: "1".repeat(64), + }, + ); + let mut manifest = manifest_with_record("pkg:maven/g/a@1", base); + let mut tests = HashMap::new(); + tests.insert( + "a-1-tests.jar".to_string(), + PatchFileInfo { + before_hash: compute_git_sha256_from_bytes(b"tests\n"), + after_hash: "2".repeat(64), + }, + ); + tests.insert( + "z-tests.txt".to_string(), + PatchFileInfo { + before_hash: compute_git_sha256_from_bytes(b"pristine\n"), + after_hash: "3".repeat(64), + }, + ); + manifest.patches.insert( + "pkg:maven/g/a@1?classifier=tests".to_string(), + PatchRecord { + uuid: "22222222-2222-4222-8222-222222222222".to_string(), + exported_at: "2024-01-01T00:00:00Z".to_string(), + files: tests, + vulnerabilities: HashMap::new(), + description: "fixture".to_string(), + license: "MIT".to_string(), + tier: "free".to_string(), + }, + ); + let mut all_packages = HashMap::new(); + all_packages.insert("pkg:maven/g/a@1".to_string(), vec![m2.clone(), csr.clone()]); + let needed = + mismatch_blob_gaps(&manifest, &all_packages, &HashSet::new(), &blobs, false).await; + assert_eq!(needed, HashSet::from(["3".repeat(64)])); + } + /// The counterpart guard: a sibling variant that does NOT describe the /// installed distribution (its representative file mismatches) is /// skipped by the apply loop, so its blobs must not be queued — that diff --git a/crates/socket-patch-cli/src/commands/rollback.rs b/crates/socket-patch-cli/src/commands/rollback.rs index 44e57512d..227bb20ea 100644 --- a/crates/socket-patch-cli/src/commands/rollback.rs +++ b/crates/socket-patch-cli/src/commands/rollback.rs @@ -2893,9 +2893,7 @@ async fn maven_rollback_targets( groups: &[((String, PathBuf), Vec<&String>, bool)], manifest: &PatchManifest, ) -> (Vec, Vec) { - use socket_patch_core::crawlers::gradle_cache::{ - installed_copies_detailed, is_gradle_version_dir, - }; + use socket_patch_core::crawlers::gradle_cache::{expands, installed_copies_detailed}; use socket_patch_core::patch::jvm_jar::{self, RecordShape}; let mut targets = Vec::new(); @@ -2928,7 +2926,9 @@ async fn maven_rollback_targets( }); } } - RecordShape::Leaf if is_gradle_version_dir(copy) => { + // A Gradle version dir, or an Ivy artifact dir whose + // module keeps classifier jars in sibling type dirs. + RecordShape::Leaf if expands(copy) => { for (dir, files) in installed_copies_detailed(copy, files).targets { out.push(CopyTarget { purl: purl.to_string(), diff --git a/crates/socket-patch-cli/src/commands/scan/hosted.rs b/crates/socket-patch-cli/src/commands/scan/hosted.rs index 0864fcd6e..7d1eab0c9 100644 --- a/crates/socket-patch-cli/src/commands/scan/hosted.rs +++ b/crates/socket-patch-cli/src/commands/scan/hosted.rs @@ -2090,9 +2090,33 @@ const TAKEOVER_INFO_CODES: &[&str] = &[ /// Lowercase tool names that must keep their spelling at the start of a /// sentence (`pnpm >=11 rejects…` must not become `Pnpm`). const LOWERCASE_TOOLS: &[&str] = &[ - "npm", "pnpm", "yarn", "bun", "cargo", "pip", "pipenv", "uv", "poetry", "pdm", "hatch", "go", - "gem", "bundler", "bundle", "composer", "mvn", "gradle", "dotnet", "deno", "rush", "vlt", - "vlx", "vlr", + "npm", + "pnpm", + "yarn", + "bun", + "cargo", + "pip", + "pipenv", + "uv", + "poetry", + "pdm", + "hatch", + "go", + "gem", + "bundler", + "bundle", + "composer", + "mvn", + "gradle", + "dotnet", + "deno", + "rush", + "vlt", + "vlx", + "vlr", + "sbt", + "mill", + "scala-cli", ]; /// Capitalize the first letter of a message for an `Error:`/`Warning:` @@ -2376,6 +2400,8 @@ fn format_next_steps(files: &[String], edits: &[socket_patch_core::patch::redire .any(|f| f == "package-lock.json" || f == "npm-shrinkwrap.json"); let hint = if npm { " (e.g. `npm ci`)".to_string() + } else if let Some(sbt) = socket_patch_core::patch::redirect::sbt::next_step_hint(files) { + sbt.to_string() } else { crate::commands::composer_hints::hosted_reinstall_hint(files, edits).unwrap_or_default() }; @@ -3941,6 +3967,18 @@ mod tests { "gradle/wrapper/gradle-wrapper.properties", ".socket/gradle/hosted-index.tsv", ".socket/gradle/socket-patch.hosted.settings.gradle", + "socket-patch.sbt", + "socket-patch-vendor.sbt", + "build.sbt", + "project/build.properties", + ".sbtopts", + ".jvmopts", + "build.sbt.lock", + "build.mill", + "build.mill.yaml", + "build.sc", + ".mill-version", + "project.scala", ] ); } diff --git a/crates/socket-patch-cli/src/commands/vendor.rs b/crates/socket-patch-cli/src/commands/vendor.rs index e6dc4e2ed..b8f0f0f0f 100644 --- a/crates/socket-patch-cli/src/commands/vendor.rs +++ b/crates/socket-patch-cli/src/commands/vendor.rs @@ -111,6 +111,7 @@ pub struct VendorArgs { /// request is still fully satisfied when these are the only non-successes. fn refusal_is_benign(code: &str) -> bool { matches!(code, "vendor_unsupported_ecosystem" | "already_vendored") + || socket_patch_core::vendor::jvm::sbt_gate::SKIP_CODES.contains(&code) } /// Dispatch one purl to its ecosystem backend. `pkg_path` is the crawler's @@ -257,10 +258,7 @@ pub(crate) async fn dispatch_revert_one_opts( /// dependency graph? `None` = cannot determine — callers must keep the /// entry (fail-safe): ecosystems other than npm and cargo have no in-use /// probe yet, and a missing/unreadable lockfile proves nothing. -pub(crate) async fn dispatch_in_use_one( - entry: &VendorEntry, - project_root: &Path, -) -> Option { +pub(crate) async fn dispatch_in_use_one(entry: &VendorEntry, project_root: &Path) -> Option { match entry.ecosystem.as_str() { "npm" => vendor::npm_flavor::vendored_entry_in_use(entry, project_root).await, // Cargo probes the lock entry's shape: detached + `[patch]` pointing @@ -930,8 +928,10 @@ async fn run_check(args: &VendorArgs) -> i32 { ".socket/vendor/maven2", ".socket/vendor/gradle", ".socket/vendor/gradle-index.tsv", + socket_patch_core::vendor::jvm::sbt::BUILD_FILE, ] .iter() + .chain(socket_patch_core::vendor::jvm::coursier_tree::ORPHAN_PATHS) .any(|rel| root.join(rel).exists()) { return emit_eject_refusal(&args.common, "vendor_ledger_missing", "JVM artifacts exist without a vendor ledger; restore .socket/vendor/state.json from version control"); @@ -1093,13 +1093,22 @@ impl EjectSnapshot { &build.files, )); } + rels.extend( + socket_patch_core::vendor::jvm::coursier_tree::CAPTURED_FILES + .iter() + .map(|s| s.to_string()), + ); let mut files = Vec::with_capacity(rels.len()); for rel in rels { - let bytes = match tokio::fs::read(root.join(&rel)).await { - Ok(bytes) => Some(bytes), - Err(e) if e.kind() == std::io::ErrorKind::NotFound => None, - Err(e) => return Err(e), - }; + // FIFO-safe: a FIFO or device planted at a captured name + // (scala-cli / Coursier owned files included) fails the + // snapshot, and with it the eject, instead of blocking open(2). + let bytes = + match socket_patch_core::utils::fs::read_regular_to_bytes(&root.join(&rel)).await { + Ok(bytes) => Some(bytes), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => None, + Err(e) => return Err(e), + }; files.push((rel, bytes)); } Ok(EjectSnapshot { @@ -1273,24 +1282,38 @@ async fn run_eject(args: &VendorArgs, pins: Vec) -> i32 { }, ) .await; - let refused: Vec<(String, String)> = plan + let mut refused: Vec<(String, &'static str, String)> = plan .refused() - .map(|(pin, why)| (pin.purl.clone(), why.to_string())) + .map(|(pin, why)| (pin.purl.clone(), "redirect_revert_failed", why.to_string())) .collect(); + // An sbt / scala-cli pin is vendored only past the build-evidence gate + // (no `target/` evidence in a fresh clone, stale evidence, …). Run it + // now, while the hosted pin still serves the patch: a pin the gate + // would stop after the restore would end neither hosted nor vendored. + for pin in &pins { + if let Err((code, detail)) = + socket_patch_core::vendor::maven_repo::jvm_gate_preflight(&common.cwd, &pin.purl).await + { + refused.push(( + pin.purl.clone(), + code, + format!("kept hosted: the vendored gate would not vendor it ({detail})"), + )); + } + } if !refused.is_empty() { let mut env = Envelope::new(Command::Vendor); env.dry_run = common.dry_run; - for (purl, why) in &refused { + for (purl, code, why) in &refused { report_vendor_failure(common, purl, why); env.record( - PatchEvent::new(PatchAction::Failed, purl.clone()) - .with_error("redirect_revert_failed", why.clone()), + PatchEvent::new(PatchAction::Failed, purl.clone()).with_error(*code, why.clone()), ); } env.mark_error(EnvelopeError::new( "eject_refused", - "not every hosted pin can be restored to its upstream registry entry; nothing was \ - changed", + "not every hosted pin can be restored to its upstream registry entry and vendored; \ + nothing was changed", )); if common.json { println!("{}", env.to_pretty_json()); @@ -1426,6 +1449,34 @@ async fn run_eject(args: &VendorArgs, pins: Vec) -> i32 { ) .await; exit = i32::from(applied); + // Backstop: every ejected pin must now be vendored. A package the + // backend skipped (a vendored gate condition the pre-pass did not + // see) would otherwise leave the project neither hosted nor + // vendored while the run succeeds. + if exit == 0 { + let ledger = load_state(&common.cwd).await.ok(); + let missing: Vec<&str> = pins + .iter() + .map(|p| p.purl.as_str()) + .filter(|purl| { + ledger + .as_ref() + .is_none_or(|l| lookup_entry(&l.entries, purl).is_none()) + }) + .collect(); + if !missing.is_empty() { + let detail = format!( + "{} {} not vendored, so the eject is undone", + missing.join(", "), + if missing.len() == 1 { "was" } else { "were" } + ); + if !common.json { + eprintln!("Error: {detail}"); + } + env.mark_error(EnvelopeError::new("eject_incomplete", detail)); + exit = 1; + } + } } if exit != 0 { match snapshot.restore().await { @@ -2469,6 +2520,26 @@ pub(crate) async fn vendor_records_reusing( continue; } } + // The vendored sbt / scala-cli gate, before the restore: a + // pin it would stop stays hosted (never neither). + if let Err((code, detail)) = + socket_patch_core::vendor::maven_repo::jvm_gate_preflight( + &common.cwd, + candidate, + ) + .await + { + has_errors = true; + let detail = format!( + "kept the hosted pin: the vendored gate would not vendor it ({detail})" + ); + env.record( + PatchEvent::new(PatchAction::Failed, candidate.clone()) + .with_error(code, detail.clone()), + ); + report_vendor_failure(common, candidate, &detail); + continue; + } let vlt_lock = socket_patch_core::utils::fs::read_regular_to_string( &common .cwd @@ -2540,11 +2611,16 @@ pub(crate) async fn vendor_records_reusing( // backend would refuse a `vendor_lock_entry_not_found` // the wet run never sees: the advisory already states the // plan, so the preview stops here. - if restore - .reverted_files - .iter() - .any(|f| f == "bun.lock" || f == "bun.lockb") - { + // + // Likewise `socket-patch.sbt`: it still pins the GA on + // disk, so the sbt planner would refuse the + // `vendor_sbt_hosted_conflict` the wet run (which + // restores first) never sees. + if restore.reverted_files.iter().any(|f| { + f == "bun.lock" + || f == "bun.lockb" + || f == socket_patch_core::formats::sbt::owned_file::HOSTED_FILE + }) { continue; } } else { @@ -2776,6 +2852,8 @@ pub(crate) async fn vendor_records_reusing( wired_flavors.insert(flavor.to_string()); } else if entry.ecosystem == "composer" { wired_flavors.insert("composer".to_string()); + } else if let Some(tool) = jvm_wiring_tool(&entry.wiring) { + wired_flavors.insert(tool.to_string()); } let (save_failed, stale) = record_vendor_entry( common, env, &mut state, candidate, entry, detached, record, @@ -2975,22 +3053,26 @@ pub(crate) async fn vendor_records_reusing( // package.json `pnpm.overrides` mirror is ignored), so pnpm-wired // runs must name that file among the committables: a checkout // that loses it silently unvendors on the next install. - let commit = if wired_flavors.contains("pnpm") { - ".socket/vendor/, package.json, pnpm-lock.yaml, and pnpm-workspace.yaml to \ - make the patches portable (pnpm >=11 reads the vendored override only from \ - pnpm-workspace.yaml)" - } else if wired_flavors.contains("vlt") { - VLT_COMMIT_HINT - } else { - ".socket/vendor/ and the updated lockfiles to make the patches portable" - }; + let commit = commit_hint(&wired_flavors); let mut installs: Vec<&str> = wired_flavors .iter() .filter_map(|f| flavor_install_command(f)) .collect(); installs.sort_unstable(); installs.dedup(); - let reinstall = if installs.is_empty() { + let jvm_only = !installs.is_empty() + && wired_flavors + .iter() + .filter(|f| flavor_install_command(f).is_some()) + .all(|f| JVM_TOOLS.contains(&f.as_str())); + let reinstall = if jvm_only { + let cmds: Vec = installs.iter().map(|c| format!("`{c}`")).collect(); + format!( + "Run {} so the build resolves the vendored artifacts (the generated root \ + file points it at .socket/vendor/)", + cmds.join(" and ") + ) + } else if installs.is_empty() { "Reinstall from the updated lockfile so the installed packages pick up the \ vendored artifacts" .to_string() @@ -3018,7 +3100,7 @@ pub(crate) async fn vendor_records_reusing( extra.extend(super::composer_hints::vendored_reinstall_hints(&packages)); } } - for line in crate::ui::next_steps(commit, &reinstall, &extra) { + for line in crate::ui::next_steps(&commit, &reinstall, &extra) { println!("{line}"); } } @@ -3027,6 +3109,60 @@ pub(crate) async fn vendor_records_reusing( has_errors } +/// The pseudo-flavors of vendored JVM builds whose wiring is a generated +/// root file rather than a lockfile. +const JVM_TOOLS: &[&str] = &["sbt", "scala-cli"]; + +/// `sbt` / `scala-cli` when `wiring` is that vendored backend's (a ledger +/// entry of either records ecosystem `maven` and no flavor). +fn jvm_wiring_tool(wiring: &[vendor::state::WiringRecord]) -> Option<&'static str> { + use socket_patch_core::vendor::jvm::{COURSIER_INDEX_KIND, SBT_FRAGMENT_KIND}; + if wiring.iter().any(|w| w.kind == SBT_FRAGMENT_KIND) { + Some("sbt") + } else if wiring.iter().any(|w| w.kind == COURSIER_INDEX_KIND) { + Some("scala-cli") + } else { + None + } +} + +/// The "Commit …" next step for the flavors a run wired. sbt and scala-cli +/// wire through a generated root file, never a lockfile: committing only +/// `.socket/` would leave CI resolving the unpatched upstream silently. +fn commit_hint(wired: &HashSet) -> String { + if wired.contains("pnpm") { + return ".socket/vendor/, package.json, pnpm-lock.yaml, and pnpm-workspace.yaml to make \ + the patches portable (pnpm >=11 reads the vendored override only from \ + pnpm-workspace.yaml)" + .to_string(); + } + if wired.contains("vlt") { + return VLT_COMMIT_HINT.to_string(); + } + let mut roots: Vec<&str> = Vec::new(); + if wired.contains("sbt") { + roots.push(socket_patch_core::vendor::jvm::sbt::BUILD_FILE); + } + if wired.contains("scala-cli") { + roots.push(socket_patch_core::vendor::jvm::scala_cli::ROOT_FILE); + } + let lockfiles = wired.iter().any(|f| !JVM_TOOLS.contains(&f.as_str())) || roots.is_empty(); + match (roots.is_empty(), lockfiles) { + (true, _) => { + ".socket/vendor/ and the updated lockfiles to make the patches portable".into() + } + (false, false) => format!( + "{} and .socket/vendor/ to make the patches portable (without the root file the \ + build resolves the unpatched upstream)", + roots.join(", ") + ), + (false, true) => format!( + "{}, .socket/vendor/ and the updated lockfiles to make the patches portable", + roots.join(", ") + ), + } +} + /// What a vlt-wired run commits (the "Commit …" next step). const VLT_COMMIT_HINT: &str = "package.json (and workspace package.json files), \ vlt-lock.json and .socket/vendor/ (the .gitignore there re-includes the payload and keeps \ @@ -3048,6 +3184,9 @@ fn flavor_install_command(flavor: &str) -> Option<&'static str> { "pnpm" | "pnpm-legacy" => Some("pnpm install"), "bun" => Some("bun install"), "vlt" => Some("vlt install"), + // Not an install: the JVM build re-resolves from the vendored tree. + "sbt" => Some("sbt update"), + "scala-cli" => Some("scala-cli compile --test ."), _ => None, } } @@ -5256,6 +5395,55 @@ mod scope_and_hint_tests { assert_eq!(flavor_install_command("vlt"), Some("vlt install")); assert_eq!(flavor_install_command("cargo"), None); assert_eq!(flavor_install_command(""), None); + assert_eq!(flavor_install_command("sbt"), Some("sbt update")); + assert_eq!( + flavor_install_command("scala-cli"), + Some("scala-cli compile --test .") + ); + } + + #[test] + fn jvm_commit_hint_names_the_generated_root_file() { + let set = |fs: &[&str]| fs.iter().map(|f| f.to_string()).collect::>(); + let sbt = commit_hint(&set(&["sbt"])); + assert!( + sbt.starts_with("socket-patch-vendor.sbt and .socket/vendor/"), + "{sbt}" + ); + assert!(!sbt.contains("lockfiles"), "{sbt}"); + let cli = commit_hint(&set(&["scala-cli"])); + assert!( + cli.starts_with("socket-patch.scala and .socket/vendor/"), + "{cli}" + ); + let both = commit_hint(&set(&["sbt", "package-lock"])); + assert!( + both.contains("socket-patch-vendor.sbt") && both.contains("lockfiles"), + "{both}" + ); + assert_eq!( + commit_hint(&set(&[])), + ".socket/vendor/ and the updated lockfiles to make the patches portable" + ); + let wiring = |kind: &str| { + vec![vendor::state::WiringRecord { + file: "x".into(), + kind: kind.into(), + action: vendor::state::WiringAction::Added, + key: None, + original: None, + new: None, + }] + }; + assert_eq!( + jvm_wiring_tool(&wiring(socket_patch_core::vendor::jvm::SBT_FRAGMENT_KIND)), + Some("sbt") + ); + assert_eq!( + jvm_wiring_tool(&wiring(socket_patch_core::vendor::jvm::COURSIER_INDEX_KIND)), + Some("scala-cli") + ); + assert_eq!(jvm_wiring_tool(&wiring("pom_fragment")), None); } #[test] @@ -5875,3 +6063,28 @@ mod ui_format_tests { ); } } + +#[cfg(all(test, unix))] +mod eject_snapshot_tests { + use super::*; + + /// A FIFO at a captured path fails the snapshot fast instead of + /// wedging the eject in a blocking open(2). + #[tokio::test] + async fn snapshot_fails_closed_on_a_fifo() { + let tmp = tempfile::tempdir().unwrap(); + let rel = socket_patch_core::vendor::jvm::coursier_tree::CAPTURED_FILES[0]; + let path = tmp.path().join(rel); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + let c = std::ffi::CString::new(path.to_str().unwrap()).unwrap(); + assert_eq!(unsafe { libc::mkfifo(c.as_ptr(), 0o644) }, 0); + let taken = tokio::time::timeout( + std::time::Duration::from_secs(10), + EjectSnapshot::take(tmp.path(), &[]), + ) + .await + .expect("a FIFO must not wedge the eject snapshot"); + let err = taken.err().expect("a FIFO must fail the snapshot"); + assert_eq!(err.kind(), std::io::ErrorKind::InvalidInput); + } +} diff --git a/crates/socket-patch-cli/src/commands/vex.rs b/crates/socket-patch-cli/src/commands/vex.rs index 97a0f6a48..de9bb37d6 100644 --- a/crates/socket-patch-cli/src/commands/vex.rs +++ b/crates/socket-patch-cli/src/commands/vex.rs @@ -819,15 +819,15 @@ async fn vex_copy_sets( manifest: &PatchManifest, copies: &HashMap>, ) -> HashMap> { - use socket_patch_core::crawlers::gradle_cache::{ - installed_copies_detailed, is_gradle_version_dir, - }; + use socket_patch_core::crawlers::gradle_cache::{expands, installed_copies_detailed}; use socket_patch_core::patch::jvm_jar::{self, RecordShape}; let holds = |purl: &str, path: &PathBuf| { let Some(record) = manifest.patches.get(purl) else { return true; }; - if !is_gradle_version_dir(path) { + // A Gradle version dir or an Ivy artifact dir holding none of the + // record's files is no copy of it. + if !expands(path) { return true; } match jvm_jar::classify(purl, &record.files) { @@ -879,12 +879,14 @@ async fn withhold_unpatched_jvm_copies( common: &GlobalArgs, warnings: &mut Vec, ) { - use socket_patch_core::crawlers::gradle_cache::is_gradle_version_dir; + use socket_patch_core::crawlers::gradle_cache::{self, is_gradle_version_dir}; use socket_patch_core::patch::jvm_jar::{self, RecordShape}; + // A Gradle version dir or an Ivy artifact dir expands into several + // directories, so even a lone copy can be partly unpatched: name it. let mut unpatched = std::mem::take(&mut outcome.unpatched_copies); unpatched.retain(|(purl, path)| { - is_gradle_version_dir(path) || copies.get(purl).is_some_and(|c| c.len() > 1) + gradle_cache::expands(path) || copies.get(purl).is_some_and(|c| c.len() > 1) }); let mut derived: Vec<(String, PathBuf)> = Vec::new(); let mut unchecked: Vec = Vec::new(); diff --git a/crates/socket-patch-cli/src/commands/vex_consumed.rs b/crates/socket-patch-cli/src/commands/vex_consumed.rs index 0d2989e53..2e7977f9b 100644 --- a/crates/socket-patch-cli/src/commands/vex_consumed.rs +++ b/crates/socket-patch-cli/src/commands/vex_consumed.rs @@ -578,11 +578,14 @@ async fn maven_copies(options: &CrawlerOptions, purl: &str, wiring: &HostedWirin let target = format!("pkg:maven/{group}/{artifact}@{suffixed}"); let crawler = MavenCrawler::new(); let mut paths = Vec::new(); - for repo in crawler - .get_maven_copy_paths(options) - .await - .unwrap_or_default() - { + // A hosted sbt build resolves the pin from its own download dir first. + let sbt_hosted = socket_patch_core::hosted::sbt_reads::hosted_repo_dirs(&options.cwd); + for repo in sbt_hosted.into_iter().chain( + crawler + .get_maven_copy_paths(options) + .await + .unwrap_or_default(), + ) { let found = crawler .find_by_purls(&repo, std::slice::from_ref(&target)) .await diff --git a/crates/socket-patch-cli/src/ecosystem_dispatch.rs b/crates/socket-patch-cli/src/ecosystem_dispatch.rs index 973ddcde6..3fa846d41 100644 --- a/crates/socket-patch-cli/src/ecosystem_dispatch.rs +++ b/crates/socket-patch-cli/src/ecosystem_dispatch.rs @@ -654,6 +654,8 @@ pub(crate) struct MavenCopies { /// by Gradle, never written. pub read_only: Vec, /// `~/.m2` copies a Gradle-only build never reads (no `mavenLocal()`). + /// A Coursier or Ivy copy (sbt, Mill, scala-cli) is never one: the + /// `mavenLocal()` gate is about `~/.m2` alone. pub m2_ignored: Vec, } @@ -710,12 +712,11 @@ impl JvmScope { /// Split the copies the resolver found for one purl. pub(crate) fn split(&self, paths: &[PathBuf]) -> MavenCopies { - use socket_patch_core::crawlers::gradle_cache::is_gradle_version_dir; let mut out = MavenCopies::default(); for path in paths { if self.is_read_only(path) { out.read_only.push(path.clone()); - } else if !is_gradle_version_dir(path) && !self.m2_consumed() { + } else if path.starts_with(&self.env.m2_repo) && !self.m2_consumed() { out.m2_ignored.push(path.clone()); } else { out.consumed.push(path.clone()); diff --git a/crates/socket-patch-cli/tests/common/jvm_env.rs b/crates/socket-patch-cli/tests/common/jvm_env.rs index 3130ca743..9e5082f5e 100644 --- a/crates/socket-patch-cli/tests/common/jvm_env.rs +++ b/crates/socket-patch-cli/tests/common/jvm_env.rs @@ -30,16 +30,16 @@ pub const AMBIENT: &[&str] = &[ "GRADLE_USER_HOME", "GRADLE_RO_DEP_CACHE", "GRADLE_HOME", + // The Coursier / Ivy lookups (sbt, Mill, scala-cli) read these: an + // ambient value would aim a test's crawl at a real cache. + "COURSIER_CACHE", + "SBT_OPTS", ]; /// The cache roots a test may hand the CLI explicitly (they survive /// `prebuilt_common::prepare_command`'s scrub and are served by its fixture /// server). -pub const EXPLICIT: &[&str] = &[ - "GRADLE_USER_HOME", - "GRADLE_RO_DEP_CACHE", - // sbt (Coursier / Ivy) registers COURSIER_CACHE here. -]; +pub const EXPLICIT: &[&str] = &["GRADLE_USER_HOME", "GRADLE_RO_DEP_CACHE", "COURSIER_CACHE"]; /// Toolchain locations that default to a path under the real home (the /// list `cache_env::TOOLCHAIN_ROOTS` carries for package-manager children). diff --git a/crates/socket-patch-cli/tests/docker_e2e_sbt.rs b/crates/socket-patch-cli/tests/docker_e2e_sbt.rs new file mode 100644 index 000000000..3f502accf --- /dev/null +++ b/crates/socket-patch-cli/tests/docker_e2e_sbt.rs @@ -0,0 +1,580 @@ +//! Docker-driven real-tool chains for sbt, Mill and scala-cli +//! (`docs/design/sbt-support.md` §8.5; image `tests/docker/Dockerfile.sbt`). +//! +//! `agent_*`: the real tool resolves `commons-text 1.9` into its cache +//! (Coursier for sbt 1.3+ / 2, Mill and scala-cli; Ivy for sbt <= 1.2 and +//! `useCoursier := false`), then `socket-patch scan --sync` (agent mode, +//! against a wiremock patch API) patches that cache copy in place, as a +//! whole-file `commons-text-1.9.jar` key. Each cell prints a marker per leg +//! and the host asserts them: +//! +//! - `===PATCH OK===`: the jar the tool's classpath names is byte-identical +//! to the patched jar, after a `clean update` too; +//! - `===SIDECAR OK===` (Coursier only): `.__sha1` holds the patched +//! jar's sha1, md5 is gone, and with the cached `.computed` digests +//! deleted a `clean update` still keeps the patched bytes (a stale +//! `__sha1` would make Coursier silently re-download the pristine jar); +//! - `===ROLLBACK OK===`: `rollback` (fetching the before blob from the +//! mock) restores the pristine bytes +//! and the tool keeps them; +//! - `===E2E PASS===`. +//! +//! sbt versions come from `SOCKET_PATCH_SBT_DOCKER_VERSIONS` (default +//! `1.13.0`), Mill versions from `SOCKET_PATCH_MILL_DOCKER_VERSIONS` +//! (default `1.1.10`; the image installs 0.11.13, 0.12.17 and 1.1.10: +//! `build.mill` + `mvnDeps` on 1.x, `build.sc` + `ivyDeps` on 0.11 / +//! 0.12); JDK 8 for sbt <= 1.3.13, else 17, unless +//! `SOCKET_PATCH_SBT_DOCKER_JDK` (`8` / `17` / `21`) picks one for every +//! cell (`scripts/sbt-compat-matrix.sh --jdk`). A missing image or docker +//! skips unless `SOCKET_PATCH_DOCKER_E2E_REQUIRED=1`. Every container runs +//! `--rm -m 2g`; run the suite with `--test-threads=1`. +//! +//! The socket-patch inside the image is the base image's; to test a local +//! build, point `SOCKET_PATCH_DOCKER_BIN` at a Linux binary (mounted over +//! it), or use the coverage hook (`SOCKET_PATCH_COV_BIN`). +//! +//! ```sh +//! docker build -t socket-patch-test-sbt:latest -f tests/docker/Dockerfile.sbt tests/docker +//! SOCKET_PATCH_DOCKER_E2E_REQUIRED=1 SOCKET_PATCH_SBT_DOCKER_VERSIONS="1.2.8 1.13.0 2.0.9" \ +//! cargo test -p socket-patch-cli --features docker-e2e --test docker_e2e_sbt -- --test-threads=1 +//! ``` + +#![cfg(feature = "docker-e2e")] + +use std::io::{Read as _, Write as _}; +use std::process::Command; + +use base64::Engine as _; +use sha1::Sha1; +use sha2::{Digest, Sha256}; +use wiremock::matchers::{method, path, path_regex}; +use wiremock::{Mock, MockServer, ResponseTemplate}; + +/// The image (`SOCKET_PATCH_SBT_DOCKER_IMAGE` overrides the tag). +fn image() -> String { + std::env::var("SOCKET_PATCH_SBT_DOCKER_IMAGE") + .unwrap_or_else(|_| "socket-patch-test-sbt:latest".to_string()) +} +const ORG: &str = "test-org"; +const PURL: &str = "pkg:maven/org.apache.commons/commons-text@1.9"; +const UUID: &str = "5b7a0000-0000-4000-8000-0000000000a1"; +const JAR: &str = "commons-text-1.9.jar"; +const CENTRAL_JAR: &str = + "https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"; +/// The marker member the patched jar adds. +const MARKER: &str = "SOCKET_PATCHED.txt"; + +fn hex_of(bytes: &[u8]) -> String { + hex::encode(D::digest(bytes)) +} + +fn git_sha256(content: &[u8]) -> String { + let mut hasher = Sha256::new(); + hasher.update(format!("blob {}\0", content.len()).as_bytes()); + hasher.update(content); + hex::encode(hasher.finalize()) +} + +/// The pristine jar from Maven Central (checked against Central's `.sha1`) +/// and the patched one: every member copied raw, plus [`MARKER`]. +async fn jars() -> (Vec, Vec) { + let client = reqwest::Client::new(); + let get = |url: String| { + let client = client.clone(); + async move { + let resp = client.get(&url).send().await.expect("fetch from Central"); + assert!(resp.status().is_success(), "{url}: {}", resp.status()); + resp.bytes().await.expect("body").to_vec() + } + }; + let pristine = get(CENTRAL_JAR.to_string()).await; + let sha1 = String::from_utf8(get(format!("{CENTRAL_JAR}.sha1")).await).unwrap(); + assert_eq!(hex_of::(&pristine), sha1.trim(), "Central sha1"); + + let mut archive = zip::ZipArchive::new(std::io::Cursor::new(pristine.clone())).unwrap(); + let mut out = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); + for i in 0..archive.len() { + let file = archive.by_index_raw(i).unwrap(); + out.raw_copy_file(file).unwrap(); + } + out.start_file(MARKER, zip::write::SimpleFileOptions::default()) + .unwrap(); + out.write_all(b"socket-patch docker e2e\n").unwrap(); + let patched = out.finish().unwrap().into_inner(); + // Sanity: the marker is readable back. + let mut check = zip::ZipArchive::new(std::io::Cursor::new(patched.clone())).unwrap(); + let mut text = String::new(); + check + .by_name(MARKER) + .unwrap() + .read_to_string(&mut text) + .unwrap(); + assert!(text.contains("socket-patch")); + (pristine, patched) +} + +/// The authenticated patch API serving one whole-jar patch for +/// commons-text 1.9 (the patched blob inline, the pristine one by hash). +async fn mock_api(pristine: &[u8], patched: &[u8]) -> MockServer { + let listener = std::net::TcpListener::bind("0.0.0.0:0").expect("bind wiremock"); + let server = MockServer::builder().listener(listener).start().await; + let summary = serde_json::json!({ + "uuid": UUID, "purl": PURL, "tier": "free", "cveIds": [], "ghsaIds": [], + "severity": "medium", "title": "sbt agent e2e fixture" + }); + Mock::given(method("POST")) + .and(path(format!("/v0/orgs/{ORG}/patches/batch"))) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "packages": [{ "purl": PURL, "patches": [summary] }], + "canAccessPaidPatches": false, + }))) + .mount(&server) + .await; + Mock::given(method("GET")) + .and(path_regex(format!( + "^/v0/orgs/{ORG}/patches/by-package/.+$" + ))) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "patches": [{ + "uuid": UUID, "purl": PURL, "publishedAt": "2024-01-01T00:00:00Z", + "description": "sbt agent e2e fixture", "license": "MIT", "tier": "free", + "vulnerabilities": {} + }], + "canAccessPaidPatches": false, + }))) + .mount(&server) + .await; + // Rollback fetches the before blob (scan stores only the after blob). + Mock::given(method("GET")) + .and(path(format!( + "/v0/orgs/{ORG}/patches/blob/{}", + git_sha256(pristine) + ))) + .respond_with(ResponseTemplate::new(200).set_body_bytes(pristine.to_vec())) + .mount(&server) + .await; + let b64 = |b: &[u8]| base64::engine::general_purpose::STANDARD.encode(b); + Mock::given(method("GET")) + .and(path(format!("/v0/orgs/{ORG}/patches/view/{UUID}"))) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "uuid": UUID, "purl": PURL, "publishedAt": "2024-01-01T00:00:00Z", + "files": { + JAR: { + "beforeHash": git_sha256(pristine), + "afterHash": git_sha256(patched), + "blobContent": b64(patched), + } + }, + "vulnerabilities": {}, + "description": "sbt agent e2e fixture", "license": "MIT", "tier": "free", + }))) + .mount(&server) + .await; + server +} + +/// Which tool a cell drives. +#[derive(Clone, Copy, Debug)] +enum Tool { + /// sbt at this version; `ivy` forces `useCoursier := false`. + Sbt { + version: &'static str, + ivy: bool, + }, + /// Mill at this version (`mill-` in the image). + Mill { + version: &'static str, + }, + ScalaCli, +} + +impl Tool { + fn coursier(self) -> bool { + match self { + Tool::Sbt { version, ivy } => !ivy && !sbt_uses_ivy(version), + Tool::Mill { .. } | Tool::ScalaCli => true, + } + } +} + +/// sbt 0.13 and 1.0-1.2 resolve with Ivy. +fn sbt_uses_ivy(version: &str) -> bool { + version.starts_with("0.") + || ["1.0.", "1.1.", "1.2."] + .iter() + .any(|p| version.starts_with(p)) +} + +/// The JDK of an sbt cell: `SOCKET_PATCH_SBT_DOCKER_JDK` (`8` / `17` / +/// `21`) when set, else 8 for sbt <= 1.3.x and 17 after. +fn sbt_jdk(version: &str) -> &'static str { + match std::env::var("SOCKET_PATCH_SBT_DOCKER_JDK").as_deref() { + Ok("8") => return "/opt/jdk8", + Ok("17") => return "/opt/jdk17", + Ok("21") => return "/opt/jdk21", + Ok(other) if !other.is_empty() => { + panic!("SOCKET_PATCH_SBT_DOCKER_JDK={other}: expected 8, 17 or 21") + } + _ => {} + } + let old = version.starts_with("0.") + || ["1.0.", "1.1.", "1.2.", "1.3."] + .iter() + .any(|p| version.starts_with(p)); + if old { + "/opt/jdk8" + } else { + "/opt/jdk17" + } +} + +/// The in-container script for one cell. +fn script(tool: Tool, api_url: &str, pristine: &[u8], patched: &[u8]) -> String { + let setup = match tool { + Tool::Sbt { version, ivy } => { + let jdk = sbt_jdk(version); + let server = if version.starts_with("2.") { + " --server" + } else { + "" + }; + let cp = if version.starts_with("0.") { + "compile:dependencyClasspath" + } else { + "Compile/dependencyClasspath" + }; + let ivy_line = if ivy { + "ThisBuild / useCoursier := false" + } else { + "" + }; + format!( + r#"export JAVA_HOME={jdk} PATH={jdk}/bin:$PATH +echo "sbt.version={version}" > project/build.properties +cat > build.sbt <<'EOF' +autoScalaLibrary := false +crossPaths := false +libraryDependencies += "org.apache.commons" % "commons-text" % "1.9" +{ivy_line} +EOF +TOOL() {{ timeout 300 sbt -batch -no-colors -Dsbt.server.autostart=false{server} "$@"; }} +RESOLVE() {{ TOOL clean update "export {cp}"; }}"# + ) + } + Tool::Mill { version } if version.starts_with("0.") => { + // Mill 0.11 / 0.12: `build.sc`, `ivyDeps`, `.mill-version`; + // 0.11 spells the ticker flag `--disable-ticker`. + let ticker = if version.starts_with("0.11.") { + "--disable-ticker" + } else { + "--ticker false" + }; + format!( + r#"export JAVA_HOME=${{SOCKET_PATCH_JDK:-/opt/jdk17}} PATH=${{SOCKET_PATCH_JDK:-/opt/jdk17}}/bin:$PATH +echo "{version}" > .mill-version +cat > build.sc <<'EOF' +import mill._, scalalib._ +object foo extends ScalaModule {{ + def scalaVersion = "2.13.16" + def ivyDeps = Agg(ivy"org.apache.commons:commons-text:1.9") +}} +EOF +TOOL() {{ timeout 300 mill-{version} --no-server {ticker} "$@"; }} +RESOLVE() {{ rm -rf out; TOOL show foo.compileClasspath; }}"# + ) + } + Tool::Mill { version } => format!( + r#"export JAVA_HOME=${{SOCKET_PATCH_JDK:-/opt/jdk17}} PATH=${{SOCKET_PATCH_JDK:-/opt/jdk17}}/bin:$PATH +cat > build.mill <<'EOF' +//| mill-version: {version} +package build +import mill.*, scalalib.* +object foo extends ScalaModule {{ + def scalaVersion = "2.13.16" + def mvnDeps = Seq(mvn"org.apache.commons:commons-text:1.9") +}} +EOF +TOOL() {{ timeout 300 mill-{version} --no-daemon --ticker false "$@"; }} +RESOLVE() {{ rm -rf out; TOOL show foo.compileClasspath; }}"# + ), + Tool::ScalaCli => r#"export JAVA_HOME=${SOCKET_PATCH_JDK:-/opt/jdk17} PATH=${SOCKET_PATCH_JDK:-/opt/jdk17}/bin:$PATH +cat > project.scala <<'EOF' +//> using scala 3.3.6 +//> using dep org.apache.commons:commons-text:1.9 +EOF +echo '@main def m() = println("ok")' > Main.scala +TOOL() { timeout 300 scala-cli "$@"; } +RESOLVE() { rm -rf .scala-build; TOOL compile . --server=false --print-class-path; }"# + .to_string(), + }; + let cache_jar = if tool.coursier() { + format!("/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/{JAR}") + } else { + format!("/root/.ivy2/cache/org.apache.commons/commons-text/jars/{JAR}") + }; + let coursier = if tool.coursier() { "1" } else { "" }; + format!( + r#"#!/usr/bin/env bash +set -uo pipefail +PRISTINE='{pristine_sha}' +PATCHED='{patched_sha}' +PATCHED_SHA1='{patched_sha1}' +PRISTINE_SHA1='{pristine_sha1}' +CACHE_JAR='{cache_jar}' +COURSIER='{coursier}' +fail() {{ echo "FAIL: $*" >&2; exit 1; }} +s256() {{ sha256sum "$1" | cut -d' ' -f1; }} +mkdir -p /w/p/project && cd /w/p +{setup} +# The jar the tool's resolved classpath names (it must be the cache copy). +cp_jar() {{ + RESOLVE > /tmp/resolve.log 2>&1 || {{ tail -40 /tmp/resolve.log >&2; fail "resolve"; }} + local j + # sbt 2 prints Coursier paths as `${{CSR_CACHE}}/…`. + j=$(sed -e 's#[$]{{CSR_CACHE}}#/root/.cache/coursier/v1#g' /tmp/resolve.log \ + | grep -oE "/[^\":,\[( ]*/{jar}" | tail -1) + [ "$j" = "$CACHE_JAR" ] || {{ tail -20 /tmp/resolve.log >&2; fail "classpath names '$j', not $CACHE_JAR"; }} + echo "$j" +}} +J=$(cp_jar) || exit 1 +[ "$(s256 "$J")" = "$PRISTINE" ] || fail "cache jar is not the pristine Central jar" +echo "resolved $J" >&2 + +# Agent scan: crawls the tool's cache from the project's build files. +socket-patch scan --json --sync --yes --api-url '{api_url}' --api-token fake --org {org} \ + > /tmp/scan.out 2>/tmp/scan.err +rc=$? +cat /tmp/scan.err >&2 +[ $rc -eq 0 ] || {{ cat /tmp/scan.out >&2; fail "scan exit $rc"; }} +[ "$(s256 "$CACHE_JAR")" = "$PATCHED" ] || {{ cat /tmp/scan.out >&2; fail "scan did not patch the cache jar"; }} +J=$(cp_jar) || exit 1 +[ "$(s256 "$J")" = "$PATCHED" ] || fail "the tool re-fetched the pristine jar after a clean resolve" +jar tf "$J" | grep -qx '{marker}' || fail "marker member missing" +echo "===PATCH OK===" + +if [ -n "$COURSIER" ]; then + D=$(dirname "$CACHE_JAR") + [ "$(cat "$D/.{jar}__sha1")" = "$PATCHED_SHA1" ] || fail "__sha1 not resynced: $(cat "$D/.{jar}__sha1")" + [ ! -e "$D/.{jar}__md5" ] || fail "__md5 left behind" + rm -f "$D"/.*.computed + J=$(cp_jar) || exit 1 + [ "$(s256 "$J")" = "$PATCHED" ] || fail "Coursier reverted the patch once the cached digests were gone" + ls -a "$D" >&2 + echo "===SIDECAR OK===" +fi + +socket-patch rollback --json --api-url '{api_url}' --api-token fake --org {org} > /tmp/rb.out 2>/tmp/rb.err +rc=$? +cat /tmp/rb.err >&2 +[ $rc -eq 0 ] || {{ cat /tmp/rb.out >&2; fail "rollback exit $rc"; }} +[ "$(s256 "$CACHE_JAR")" = "$PRISTINE" ] || {{ cat /tmp/rb.out >&2; fail "rollback did not restore the jar"; }} +if [ -n "$COURSIER" ]; then + [ "$(cat "$(dirname "$CACHE_JAR")/.{jar}__sha1")" = "$PRISTINE_SHA1" ] || fail "__sha1 not resynced on rollback" +fi +J=$(cp_jar) || exit 1 +[ "$(s256 "$J")" = "$PRISTINE" ] || fail "the tool does not see the restored jar" +echo "===ROLLBACK OK===" +echo "===E2E PASS===" +"#, + pristine_sha = hex_of::(pristine), + patched_sha = hex_of::(patched), + patched_sha1 = hex_of::(patched), + pristine_sha1 = hex_of::(pristine), + org = ORG, + jar = JAR, + marker = MARKER, + ) +} + +fn required() -> bool { + std::env::var("SOCKET_PATCH_DOCKER_E2E_REQUIRED").is_ok_and(|v| v == "1") +} + +/// `true` when the cell should be skipped (no docker / no image). +#[must_use] +fn skip_if_no_image() -> bool { + let reason = match Command::new("docker") + .args(["image", "inspect", &image()]) + .output() + { + Err(_) => "`docker` not on PATH", + Ok(out) if !out.status.success() => "the sbt docker image is not present", + Ok(_) => return false, + }; + assert!( + !required(), + "SOCKET_PATCH_DOCKER_E2E_REQUIRED=1 but {reason}" + ); + eprintln!("skipping: {reason}"); + true +} + +/// The binary mounts: a local Linux build, or the coverage hook. +fn binary_mounts() -> Vec { + if let Ok(bin) = std::env::var("SOCKET_PATCH_DOCKER_BIN") { + return vec!["-v".into(), format!("{bin}:/usr/local/bin/socket-patch:ro")]; + } + let (Ok(bin), Ok(dir)) = ( + std::env::var("SOCKET_PATCH_COV_BIN"), + std::env::var("SOCKET_PATCH_COV_PROFRAW_DIR"), + ) else { + return Vec::new(); + }; + vec![ + "-v".into(), + format!("{bin}:/usr/local/bin/socket-patch:ro"), + "-v".into(), + format!("{dir}:/coverage"), + "-e".into(), + "LLVM_PROFILE_FILE=/coverage/docker-e2e-%p-%14m.profraw".into(), + ] +} + +/// Run one cell in a fresh container and assert its markers. +async fn run_cell(tool: Tool) { + if skip_if_no_image() { + return; + } + let (pristine, patched) = jars().await; + let server = mock_api(&pristine, &patched).await; + let api_url = format!("http://host.docker.internal:{}", server.address().port()); + let script = script(tool, &api_url, &pristine, &patched); + let out = tokio::task::spawn_blocking(move || { + Command::new("docker") + .args([ + "run", + "--rm", + "-m", + "2g", + "--add-host=host.docker.internal:host-gateway", + ]) + .args(binary_mounts()) + .args(["-e", &format!("SOCKET_PATCH_JDK={}", sbt_jdk("1.13.0"))]) + .args([image().as_str(), "bash", "-c", &script]) + .output() + .expect("docker run") + }) + .await + .unwrap(); + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + let mut want = vec!["===PATCH OK==="]; + if tool.coursier() { + want.push("===SIDECAR OK==="); + } + want.extend(["===ROLLBACK OK===", "===E2E PASS==="]); + for marker in want { + assert!( + stdout.contains(marker), + "{tool:?}: {marker} missing (exit {:?})\nstdout:\n{stdout}\nstderr:\n{stderr}", + out.status.code() + ); + } + assert!(out.status.success(), "{tool:?}\nstderr:\n{stderr}"); + eprintln!("{tool:?}: {}", stdout.trim().replace('\n', " ")); + // The scan reached the mock with the crawled purl. + let bodies: Vec = server + .received_requests() + .await + .expect("wiremock records requests") + .iter() + .filter(|r| r.url.path().ends_with("/patches/batch")) + .map(|r| String::from_utf8_lossy(&r.body).into_owned()) + .collect(); + assert!( + bodies.iter().any(|b| b.contains(PURL)), + "{tool:?}: the batch query never carried {PURL}" + ); +} + +/// The whitespace-separated versions `var` names, else `default`. +fn versions(var: &str, default: &str) -> Vec<&'static str> { + std::env::var(var) + .ok() + .filter(|v| !v.trim().is_empty()) + .unwrap_or_else(|| default.to_string()) + .split_whitespace() + .map(|v| &*Box::leak(v.to_string().into_boxed_str())) + .collect() +} + +fn sbt_versions() -> Vec<&'static str> { + versions("SOCKET_PATCH_SBT_DOCKER_VERSIONS", "1.13.0") +} + +/// The versions the image installs a `mill-` launcher for. +const MILL_VERSIONS: &[&str] = &["0.11.13", "0.12.17", "1.1.10"]; + +fn mill_versions() -> Vec<&'static str> { + let picked = versions("SOCKET_PATCH_MILL_DOCKER_VERSIONS", "1.1.10"); + for v in &picked { + assert!( + MILL_VERSIONS.contains(v), + "SOCKET_PATCH_MILL_DOCKER_VERSIONS: the image has no mill-{v} ({MILL_VERSIONS:?})" + ); + } + picked +} + +/// `all` split into the sbt versions `useCoursier := false` applies to +/// (1.3 – 1.x) and the rest: sbt <= 1.2 has no `useCoursier` (it resolves +/// through Ivy already), and sbt 2 dropped the setting with Ivy. +fn coursier_sbt_versions(all: &[&'static str]) -> (Vec<&'static str>, Vec<&'static str>) { + all.iter() + .partition(|v| !sbt_uses_ivy(v) && v.starts_with("1.")) +} + +#[tokio::test] +async fn agent_sbt_versions_patch_in_place() { + for version in sbt_versions() { + run_cell(Tool::Sbt { + version, + ivy: false, + }) + .await; + } +} + +/// `useCoursier := false` on each requested sbt 1.3 – 1.x version (the +/// setting arrived with Coursier in 1.3; older lines are Ivy already and +/// covered by `agent_sbt_versions_patch_in_place`; sbt 2 has no Ivy). +#[tokio::test] +async fn agent_sbt_use_coursier_false_patches_the_ivy_cache() { + let (coursier, ivy) = coursier_sbt_versions(&sbt_versions()); + for version in ivy { + eprintln!( + "SKIP useCoursier := false on sbt {version}: the setting exists on sbt 1.3 – 1.x \ + only (older lines resolve through Ivy already; sbt 2 has no Ivy)" + ); + } + for version in coursier { + run_cell(Tool::Sbt { version, ivy: true }).await; + } +} + +#[tokio::test] +async fn scala_tools_agent_mill_patches_in_place() { + for version in mill_versions() { + run_cell(Tool::Mill { version }).await; + } +} + +#[test] +fn version_selection() { + assert_eq!( + coursier_sbt_versions(&["0.13.18", "1.2.8", "1.3.13", "1.13.0", "2.0.9"]), + (vec!["1.3.13", "1.13.0"], vec!["0.13.18", "1.2.8", "2.0.9"]) + ); + let legacy = script(Tool::Mill { version: "0.11.13" }, "http://api", b"p", b"q"); + assert!(legacy.contains("build.sc") && legacy.contains("--disable-ticker")); + assert!(legacy.contains("mill-0.11.13 --no-server")); + let twelve = script(Tool::Mill { version: "0.12.17" }, "http://api", b"p", b"q"); + assert!(twelve.contains("--ticker false") && twelve.contains("ivyDeps")); + let one = script(Tool::Mill { version: "1.1.10" }, "http://api", b"p", b"q"); + assert!(one.contains("build.mill") && one.contains("//| mill-version: 1.1.10")); +} + +#[tokio::test] +async fn scala_tools_agent_scala_cli_patches_in_place() { + run_cell(Tool::ScalaCli).await; +} diff --git a/crates/socket-patch-cli/tests/e2e_maven.rs b/crates/socket-patch-cli/tests/e2e_maven.rs index 22d7e940d..5afaf4373 100644 --- a/crates/socket-patch-cli/tests/e2e_maven.rs +++ b/crates/socket-patch-cli/tests/e2e_maven.rs @@ -63,6 +63,16 @@ async fn run(args: &[&str], cwd: &Path, m2_repo: &Path, proxy_url: &str) -> Outp .current_dir(&cwd) // Point the crawler at the fake local repo. .env("MAVEN_REPO_LOCAL", &m2_repo) + // And keep it off the machine's Coursier / Ivy caches, which a + // Maven marker also makes it crawl (their homes are derived + // from these; none exists below the fixture). + .env("HOME", m2_repo.with_file_name("no-home")) + .env("USERPROFILE", m2_repo.with_file_name("no-home")) + .env("XDG_CACHE_HOME", m2_repo.with_file_name("no-xdg-cache")) + .env("LOCALAPPDATA", m2_repo.with_file_name("no-localappdata")) + .env_remove("COURSIER_CACHE") + .env_remove("SBT_OPTS") + .env_remove("JAVA_OPTS") // Keep the run hermetic: no ambient token, no inherited repo path. .env_remove("SOCKET_API_TOKEN") .env_remove("SOCKET_CLI_API_TOKEN") @@ -177,8 +187,7 @@ async fn scan_discovers_maven_artifacts() { // Must NOT have hit the empty-crawl path — that line *also* contains // the word "packages". assert!( - !combined.contains("No packages found") - && !combined.contains("No packages found"), + !combined.contains("No packages found") && !combined.contains("No packages found"), "scan reported zero packages — Maven discovery did not run:\n{combined}" ); assert!( diff --git a/crates/socket-patch-cli/tests/e2e_sbt/agent.rs b/crates/socket-patch-cli/tests/e2e_sbt/agent.rs new file mode 100644 index 000000000..aab015bdf --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt/agent.rs @@ -0,0 +1,938 @@ +//! Agent mode (`apply` / `rollback` / `scan` in place) over the caches sbt, +//! Mill and scala-cli resolve into: Coursier's (sbt 1.3+, with its hidden +//! checksum sidecars resynced) and Ivy's (sbt <= 1.2, or +//! `useCoursier := false`). Agent scans are not scoped to the build: the +//! whole cache is queried, as for `~/.m2`. Whole-file patch keys only +//! (`-.jar`), the same parity as `~/.m2` today. + +use std::path::{Path, PathBuf}; + +use serde_json::Value; +use sha1::{Digest as _, Sha1}; +use wiremock::matchers::{method, path}; +use wiremock::{Mock, MockServer, ResponseTemplate}; + +use super::common; +use super::sbt_common::{ + write_coursier_artifact, write_ivy_artifact, write_sbt_build, Gav, SbtHome, +}; + +const SLF4J: Gav<'static> = Gav { + group: "org.slf4j", + artifact: "slf4j-api", + version: "1.7.36", +}; + +const GSON: Gav<'static> = Gav { + group: "com.google.code.gson", + artifact: "gson", + version: "2.8.9", +}; + +const JAR: &str = "slf4j-api-1.7.36.jar"; +const ORIGINAL: &[u8] = b"PK\x03\x04 pristine slf4j-api 1.7.36\n"; +const PATCHED: &[u8] = b"PK\x03\x04 socket-patched slf4j-api 1.7.36\n"; +const CENTRAL: &str = "repo1.maven.org/maven2"; + +/// One test's isolated home and an sbt build depending on slf4j only. +struct Fixture { + _tmp: tempfile::TempDir, + home: SbtHome, + project: PathBuf, +} + +fn fixture() -> Fixture { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = tmp.path().join("project"); + write_sbt_build( + &project, + "1.9.9", + "libraryDependencies += \"org.slf4j\" % \"slf4j-api\" % \"1.7.36\"\n", + ); + Fixture { + _tmp: tmp, + home, + project, + } +} + +fn sha1_hex(bytes: &[u8]) -> String { + hex::encode(Sha1::digest(bytes)) +} + +/// A manifest patching `gav`'s jar as a whole file (`ORIGINAL` → +/// `PATCHED`), with both blobs staged so apply and rollback run offline. +fn stage_manifest(project: &Path, gav: Gav<'_>) { + let before = common::git_sha256(ORIGINAL); + let after = common::git_sha256(PATCHED); + let manifest = serde_json::json!({ + "patches": { + gav.purl(): { + "uuid": "5b7a0000-0000-4000-8000-000000000001", + "exportedAt": "2026-10-02T00:00:00Z", + "files": { + format!("{}-{}.jar", gav.artifact, gav.version): { + "beforeHash": before, + "afterHash": after, + } + }, + "vulnerabilities": {}, + "description": "sbt agent fixture", + "license": "MIT", + "tier": "free", + } + } + }); + let socket = project.join(".socket"); + std::fs::create_dir_all(socket.join("blobs")).unwrap(); + std::fs::write( + socket.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + std::fs::write(socket.join("blobs").join(&before), ORIGINAL).unwrap(); + std::fs::write(socket.join("blobs").join(&after), PATCHED).unwrap(); +} + +/// Run the CLI in the project under the fixture's isolated env, `extra` +/// overriding it; `(exit code, JSON envelope, stderr)`. +fn run(fx: &Fixture, args: &[&str], extra: &[(&str, String)]) -> (i32, Value, String) { + let mut env = fx.home.isolated_env(); + for (key, value) in extra { + env.retain(|(k, _)| k != key); + env.push((key.to_string(), value.clone())); + } + let env: Vec<(&str, &str)> = env.iter().map(|(k, v)| (k.as_str(), v.as_str())).collect(); + let (code, stdout, stderr) = common::run_with_env(&fx.project, args, &env); + let envelope = serde_json::from_str(stdout.trim()).unwrap_or_else(|e| { + panic!("{args:?}: envelope must parse ({e})\nstdout:\n{stdout}\nstderr:\n{stderr}") + }); + (code, envelope, stderr) +} + +fn maven_sidecars(envelope: &Value) -> Vec { + envelope["sidecars"] + .as_array() + .map(|records| { + records + .iter() + .filter(|r| r["ecosystem"] == "maven") + .cloned() + .collect() + }) + .unwrap_or_default() +} + +fn hidden(dir: &Path, suffix: &str) -> PathBuf { + dir.join(format!(".{JAR}{suffix}")) +} + +#[test] +fn agent_apply_patches_a_coursier_cache_copy_and_resyncs_its_sidecars() { + let fx = fixture(); + let dir = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + // The rest of what Coursier leaves: the cached digest, md5, `.checked`. + std::fs::write(hidden(&dir, "__sha1.computed"), Sha1::digest(ORIGINAL)).unwrap(); + std::fs::write(hidden(&dir, "__md5"), "00000000000000000000000000000000").unwrap(); + std::fs::write(hidden(&dir, ".checked"), b"").unwrap(); + stage_manifest(&fx.project, SLF4J); + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + assert_eq!(std::fs::read(dir.join(JAR)).unwrap(), PATCHED); + assert_eq!( + std::fs::read_to_string(hidden(&dir, "__sha1")).unwrap(), + sha1_hex(PATCHED) + ); + assert_eq!( + std::fs::read(hidden(&dir, "__sha1.computed")).unwrap(), + Sha1::digest(PATCHED).to_vec() + ); + assert!( + !hidden(&dir, "__md5").exists(), + "md5 is deleted, not rewritten" + ); + assert!(hidden(&dir, ".checked").exists(), ".checked is left alone"); + // The pom was not patched, so its sidecar is untouched. + let pom = ".slf4j-api-1.7.36.pom__sha1"; + assert_eq!( + std::fs::read_to_string(dir.join(pom)).unwrap(), + sha1_hex(SLF4J.pom().as_bytes()) + ); + let records = maven_sidecars(&env); + assert_eq!(records.len(), 1, "{env}"); + assert_eq!(records[0]["purl"], SLF4J.purl()); + let files = records[0]["files"].as_array().unwrap(); + for (path, action) in [ + (format!(".{JAR}__sha1"), "rewritten"), + (format!(".{JAR}__sha1.computed"), "rewritten"), + (format!(".{JAR}__md5"), "deleted"), + ] { + assert!( + files + .iter() + .any(|f| f["path"] == path && f["action"] == action), + "{path} {action}: {}", + records[0] + ); + } + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + assert_eq!(std::fs::read(dir.join(JAR)).unwrap(), ORIGINAL); + assert_eq!( + std::fs::read_to_string(hidden(&dir, "__sha1")).unwrap(), + sha1_hex(ORIGINAL), + "rollback resyncs the sidecars to the restored bytes" + ); + assert_eq!( + std::fs::read(hidden(&dir, "__sha1.computed")).unwrap(), + Sha1::digest(ORIGINAL).to_vec() + ); +} + +#[test] +fn agent_apply_patches_an_ivy_cache_copy() { + let fx = fixture(); + let jars = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let module = jars.parent().unwrap().to_path_buf(); + let ivy_xml = std::fs::read(module.join("ivy-1.7.36.xml")).unwrap(); + stage_manifest(&fx.project, SLF4J); + let sbt_opts = ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ); + + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&sbt_opts), + ); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), PATCHED); + assert_eq!( + std::fs::read(module.join("ivy-1.7.36.xml")).unwrap(), + ivy_xml + ); + assert!( + maven_sidecars(&env).is_empty(), + "Ivy keeps no sidecars: {env}" + ); + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[sbt_opts]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), ORIGINAL, "{env}"); +} + +#[test] +fn agent_m2_checksum_files_are_not_coursier_sidecars() { + let fx = fixture(); + let dir = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join(JAR), ORIGINAL).unwrap(); + std::fs::write(dir.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + std::fs::write(dir.join(format!("{JAR}.sha1")), sha1_hex(ORIGINAL)).unwrap(); + std::fs::write(dir.join("_remote.repositories"), b"#x\n").unwrap(); + stage_manifest(&fx.project, SLF4J); + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(std::fs::read(dir.join(JAR)).unwrap(), PATCHED); + // The `~/.m2` checksum file follows the patched bytes (the Maven + // sidecar arm), and no Coursier `.__` sidecar is made. + assert_eq!( + std::fs::read_to_string(dir.join(format!("{JAR}.sha1"))).unwrap(), + sha1_hex(PATCHED) + ); + assert!(!hidden(&dir, "__sha1").exists()); + let files: Vec = maven_sidecars(&env) + .iter() + .flat_map(|r| r["files"].as_array().cloned().unwrap_or_default()) + .filter_map(|f| f["path"].as_str().map(str::to_string)) + .collect(); + assert!(files.iter().all(|f| !f.contains("__")), "{env}"); +} + +/// A Coursier sidecar that cannot be resynced (here a directory squatting +/// `__sha1`) leaves the patch on disk with a `sidecar_fixup_failed` +/// advisory; once the obstacle is gone, the next apply (every file already +/// patched, nothing written) still resyncs the sidecars. +#[test] +fn agent_retry_resyncs_after_a_failed_fixup() { + let fx = fixture(); + let dir = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + std::fs::write(hidden(&dir, "__sha1.computed"), Sha1::digest(ORIGINAL)).unwrap(); + std::fs::remove_file(hidden(&dir, "__sha1")).unwrap(); + std::fs::create_dir(hidden(&dir, "__sha1")).unwrap(); + stage_manifest(&fx.project, SLF4J); + + let (_code, env, _stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(std::fs::read(dir.join(JAR)).unwrap(), PATCHED, "{env}"); + let records = maven_sidecars(&env); + assert_eq!(records.len(), 1, "{env}"); + assert_eq!( + records[0]["advisory"]["code"], "sidecar_fixup_failed", + "{env}" + ); + // The stale digest is still there: Coursier keeps the patch meanwhile. + assert_eq!( + std::fs::read(hidden(&dir, "__sha1.computed")).unwrap(), + Sha1::digest(ORIGINAL).to_vec() + ); + + std::fs::remove_dir(hidden(&dir, "__sha1")).unwrap(); + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "retry: {env}\n{stderr}"); + let records = maven_sidecars(&env); + assert_eq!(records.len(), 1, "{env}"); + assert!( + records[0].get("advisory").is_none_or(Value::is_null), + "{env}" + ); + assert_eq!( + std::fs::read_to_string(hidden(&dir, "__sha1")).unwrap(), + sha1_hex(PATCHED) + ); + assert_eq!( + std::fs::read(hidden(&dir, "__sha1.computed")).unwrap(), + Sha1::digest(PATCHED).to_vec() + ); +} + +/// A rollback that finds a Coursier copy already original (never patched) +/// leaves Coursier's own consistent sidecars, md5 included, byte for byte, +/// and reports no sidecar record. +#[test] +fn agent_rollback_of_a_pristine_coursier_copy_touches_nothing() { + let fx = fixture(); + let dir = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + std::fs::write(hidden(&dir, "__sha1.computed"), Sha1::digest(ORIGINAL)).unwrap(); + std::fs::write(hidden(&dir, "__md5"), "00000000000000000000000000000000").unwrap(); + stage_manifest(&fx.project, SLF4J); + let snapshot = || { + let mut files: Vec<(String, Vec)> = std::fs::read_dir(&dir) + .unwrap() + .map(|e| { + let e = e.unwrap(); + let name = e.file_name().to_string_lossy().into_owned(); + (name, std::fs::read(e.path()).unwrap()) + }) + .collect(); + files.sort(); + files + }; + let before = snapshot(); + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + assert_eq!(snapshot(), before, "{env}"); + assert!(maven_sidecars(&env).is_empty(), "{env}"); +} + +/// No scoping: the build declares slf4j only, yet the scan queries every +/// GAV in the caches it found (gson in Coursier, slf4j in Ivy), the same +/// whole-cache behavior as `~/.m2`. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn agent_scan_queries_every_cached_gav() { + let server = MockServer::start().await; + Mock::given(method("POST")) + .and(path("/patch/batch")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "packages": [], + "canAccessPaidPatches": false, + }))) + .mount(&server) + .await; + let fx = fixture(); + write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, GSON, b"gson"); + write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let sbt_opts = ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ); + let uri = server.uri(); + let (code, env, stderr) = tokio::task::spawn_blocking(move || { + let out = run(&fx, &["scan", "--json", "--proxy-url", &uri], &[sbt_opts]); + drop(fx); + out + }) + .await + .unwrap(); + assert_eq!(code, 0, "scan: {env}\n{stderr}"); + assert_eq!(env["scannedPackages"], 2, "{env}"); + let bodies: Vec = server + .received_requests() + .await + .unwrap_or_default() + .iter() + .map(|r| String::from_utf8_lossy(&r.body).into_owned()) + .collect(); + let all = bodies.join("\n"); + for purl in [SLF4J.purl(), GSON.purl()] { + assert!(all.contains(&purl), "batch must carry {purl}: {all}"); + } +} + +/// One GAV cached three times (`~/.m2`, a Coursier cache, an Ivy cache): +/// sbt reads whichever its resolver picks, so apply patches EVERY copy and +/// rollback restores every copy. Patching only the first root would leave +/// the copy the build loads vulnerable while reporting success. +#[test] +fn agent_apply_and_rollback_cover_every_cached_copy() { + let fx = fixture(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + let coursier = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + let ivy = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let copies = [m2.join(JAR), coursier.join(JAR), ivy.join(JAR)]; + stage_manifest(&fx.project, SLF4J); + let sbt_opts = ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ); + + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&sbt_opts), + ); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + for copy in &copies { + assert_eq!( + std::fs::read(copy).unwrap(), + PATCHED, + "{} not patched: {env}", + copy.display() + ); + } + // The Coursier copy's sidecars follow its bytes. + assert_eq!( + std::fs::read_to_string(hidden(&coursier, "__sha1")).unwrap(), + sha1_hex(PATCHED) + ); + // A re-run finds every copy patched. + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&sbt_opts), + ); + assert_eq!(code, 0, "re-apply: {env}\n{stderr}"); + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[sbt_opts]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + for copy in &copies { + assert_eq!( + std::fs::read(copy).unwrap(), + ORIGINAL, + "{} not restored: {env}", + copy.display() + ); + } + assert_eq!( + std::fs::read_to_string(hidden(&coursier, "__sha1")).unwrap(), + sha1_hex(ORIGINAL) + ); +} + +/// A Coursier version directory holding only the pom (a version Coursier +/// considered and evicted) is no copy: apply patches `~/.m2`'s jar and +/// exits 0, rollback restores it, instead of failing on a missing jar. +#[test] +fn agent_a_pom_only_coursier_directory_is_no_target() { + let fx = fixture(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + let coursier = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + std::fs::remove_file(coursier.join(JAR)).unwrap(); + std::fs::remove_file(hidden(&coursier, "__sha1")).unwrap(); + stage_manifest(&fx.project, SLF4J); + for (args, want) in [ + (&["apply", "--offline", "--json"][..], PATCHED), + (&["apply", "--offline", "--json", "--strict"][..], PATCHED), + (&["rollback", "--offline", "--json"][..], ORIGINAL), + ] { + let (code, env, stderr) = run(&fx, args, &[]); + assert_eq!(code, 0, "{args:?}: {env}\n{stderr}"); + assert_eq!(std::fs::read(m2.join(JAR)).unwrap(), want, "{args:?}"); + assert!(!coursier.join(JAR).exists(), "{args:?}"); + } +} + +/// A Maven (pom.xml) project never reads the Coursier or Ivy caches, so a +/// local apply leaves their copies alone. +#[test] +fn agent_a_maven_project_leaves_the_scala_caches_alone() { + let fx = fixture(); + let maven = fx.project.parent().unwrap().join("maven-project"); + std::fs::create_dir_all(&maven).unwrap(); + std::fs::write(maven.join("pom.xml"), "\n").unwrap(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + let coursier = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + stage_manifest(&maven, SLF4J); + let fx = Fixture { + _tmp: fx._tmp, + home: fx.home, + project: maven, + }; + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(std::fs::read(m2.join(JAR)).unwrap(), PATCHED); + assert_eq!(std::fs::read(coursier.join(JAR)).unwrap(), ORIGINAL); +} + +/// Classifier variants of one GAV in two caches: `~/.m2` holds only the +/// plain jar, the Coursier copy the `tests` classifier jar too. Each copy +/// narrows its variants on its own bytes, so rollback restores the +/// classifier jar in the Coursier cache (it is never narrowed away by the +/// `~/.m2` copy that lacks it) and the manifest keeps nothing behind. +#[test] +fn agent_rollback_narrows_classifier_variants_per_copy() { + const TESTS_JAR: &str = "slf4j-api-1.7.36-tests.jar"; + const TESTS_ORIGINAL: &[u8] = b"PK\x03\x04 pristine slf4j-api tests\n"; + const TESTS_PATCHED: &[u8] = b"PK\x03\x04 socket-patched slf4j-api tests\n"; + let fx = fixture(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + let coursier = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + std::fs::write(coursier.join(TESTS_JAR), TESTS_ORIGINAL).unwrap(); + let record = |uuid: &str, file: &str, before: &[u8], after: &[u8]| { + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-10-02T00:00:00Z", + "files": { file: { + "beforeHash": common::git_sha256(before), + "afterHash": common::git_sha256(after), + } }, + "vulnerabilities": {}, + "description": "sbt agent classifier fixture", + "license": "MIT", + "tier": "free", + }) + }; + let manifest = serde_json::json!({ "patches": { + SLF4J.purl(): record("5b7a0000-0000-4000-8000-000000000001", JAR, ORIGINAL, PATCHED), + format!("{}?classifier=tests", SLF4J.purl()): + record("5b7a0000-0000-4000-8000-000000000002", TESTS_JAR, TESTS_ORIGINAL, TESTS_PATCHED), + } }); + let socket = fx.project.join(".socket"); + std::fs::create_dir_all(socket.join("blobs")).unwrap(); + std::fs::write( + socket.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + for bytes in [ORIGINAL, PATCHED, TESTS_ORIGINAL, TESTS_PATCHED] { + std::fs::write(socket.join("blobs").join(common::git_sha256(bytes)), bytes).unwrap(); + } + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(std::fs::read(m2.join(JAR)).unwrap(), PATCHED); + assert_eq!(std::fs::read(coursier.join(JAR)).unwrap(), PATCHED); + assert_eq!( + std::fs::read(coursier.join(TESTS_JAR)).unwrap(), + TESTS_PATCHED + ); + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + assert_eq!(std::fs::read(m2.join(JAR)).unwrap(), ORIGINAL, "{env}"); + assert_eq!( + std::fs::read(coursier.join(JAR)).unwrap(), + ORIGINAL, + "{env}" + ); + assert_eq!( + std::fs::read(coursier.join(TESTS_JAR)).unwrap(), + TESTS_ORIGINAL, + "the classifier jar is restored where it lives: {env}" + ); +} + +/// `vex -O ` in the fixture's project: the statement count (0 when no +/// document was written) and the envelope. +fn vex_statements(fx: &Fixture, extra: &[(&str, String)]) -> (usize, Value) { + let doc = fx.project.join("vex.json"); + let _ = std::fs::remove_file(&doc); + let (_, env, _) = run( + fx, + &[ + "vex", + "-O", + doc.to_str().unwrap(), + "--product", + "pkg:maven/com.example/app@1.0", + "--offline", + "--json", + ], + extra, + ); + let statements = std::fs::read(&doc) + .ok() + .and_then(|b| serde_json::from_slice::(&b).ok()) + .and_then(|d| d["statements"].as_array().map(Vec::len)) + .unwrap_or(0); + (statements, env) +} + +/// VEX judges every copy an sbt build may load: with `~/.m2`, Coursier and +/// Ivy all patched it attests; one copy put back to its pristine bytes +/// (a re-download, say) withholds the statement. +#[test] +fn agent_vex_rehashes_every_cached_copy() { + let fx = fixture(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + let coursier = write_coursier_artifact(&fx.home.coursier_cache(), CENTRAL, SLF4J, ORIGINAL); + let ivy = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + stage_manifest(&fx.project, SLF4J); + // VEX attests only a record with vulnerability metadata. + let manifest_path = fx.project.join(".socket/manifest.json"); + let mut manifest: Value = + serde_json::from_slice(&std::fs::read(&manifest_path).unwrap()).unwrap(); + manifest["patches"][SLF4J.purl()]["vulnerabilities"] = serde_json::json!({ + "GHSA-5b7a-0000-0001": { + "cves": ["CVE-2026-0001"], "summary": "s", + "severity": "high", "description": "d" + } + }); + std::fs::write( + &manifest_path, + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + let sbt_opts = ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ); + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&sbt_opts), + ); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + let (statements, env) = vex_statements(&fx, std::slice::from_ref(&sbt_opts)); + assert!(statements > 0, "every copy patched: {env}"); + for copy in [coursier.join(JAR), ivy.join(JAR)] { + std::fs::write(©, ORIGINAL).unwrap(); + let (statements, env) = vex_statements(&fx, std::slice::from_ref(&sbt_opts)); + assert_eq!(statements, 0, "{} pristine: {env}", copy.display()); + std::fs::write(©, PATCHED).unwrap(); + } +} + +/// An Ivy module keeps a sources jar under `srcs/`, beside the `jars/` +/// directory the crawler reports: a `?classifier=sources` record is +/// patched and restored there. +#[test] +fn agent_an_ivy_sources_jar_under_srcs_is_patched_and_restored() { + const SOURCES_JAR: &str = "slf4j-api-1.7.36-sources.jar"; + const SOURCES_ORIGINAL: &[u8] = b"PK\x03\x04 pristine slf4j-api sources\n"; + const SOURCES_PATCHED: &[u8] = b"PK\x03\x04 socket-patched slf4j-api sources\n"; + let fx = fixture(); + let jars = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let srcs = jars.parent().unwrap().join("srcs"); + std::fs::create_dir_all(&srcs).unwrap(); + std::fs::write(srcs.join(SOURCES_JAR), SOURCES_ORIGINAL).unwrap(); + let record = |uuid: &str, file: &str, before: &[u8], after: &[u8]| { + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-10-02T00:00:00Z", + "files": { file: { + "beforeHash": common::git_sha256(before), + "afterHash": common::git_sha256(after), + } }, + "vulnerabilities": {}, + "description": "sbt agent Ivy sources fixture", + "license": "MIT", + "tier": "free", + }) + }; + let manifest = serde_json::json!({ "patches": { + SLF4J.purl(): record("5b7a0000-0000-4000-8000-000000000001", JAR, ORIGINAL, PATCHED), + format!("{}?classifier=sources", SLF4J.purl()): record( + "5b7a0000-0000-4000-8000-000000000003", + SOURCES_JAR, + SOURCES_ORIGINAL, + SOURCES_PATCHED, + ), + } }); + let socket = fx.project.join(".socket"); + std::fs::create_dir_all(socket.join("blobs")).unwrap(); + std::fs::write( + socket.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + for bytes in [ORIGINAL, PATCHED, SOURCES_ORIGINAL, SOURCES_PATCHED] { + std::fs::write(socket.join("blobs").join(common::git_sha256(bytes)), bytes).unwrap(); + } + let sbt_opts = ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ); + + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&sbt_opts), + ); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), PATCHED, "{env}"); + assert_eq!( + std::fs::read(srcs.join(SOURCES_JAR)).unwrap(), + SOURCES_PATCHED, + "{env}" + ); + + let (code, env, stderr) = run(&fx, &["rollback", "--offline", "--json"], &[sbt_opts]); + assert_eq!(code, 0, "rollback: {env}\n{stderr}"); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), ORIGINAL, "{env}"); + assert_eq!( + std::fs::read(srcs.join(SOURCES_JAR)).unwrap(), + SOURCES_ORIGINAL, + "{env}" + ); +} + +// ── mixed roots and Ivy type dirs (adaptation review) ─────────────────── + +const SOURCES_JAR: &str = "slf4j-api-1.7.36-sources.jar"; +const SOURCES_ORIGINAL: &[u8] = b"PK\x03\x04 pristine slf4j-api sources\n"; +const SOURCES_PATCHED: &[u8] = b"PK\x03\x04 socket-patched slf4j-api sources\n"; +const BASE_UUID: &str = "5b7a0000-0000-4000-8000-000000000001"; +const SOURCES_UUID: &str = "5b7a0000-0000-4000-8000-000000000003"; + +/// Write a manifest of `(purl, uuid, files)` records, each file +/// `(key, before, after)`, with GHSA metadata so VEX attests it, and stage +/// every blob. +/// A record file: `(key, before, after)`. +type RecordFile<'a> = (&'a str, &'a [u8], &'a [u8]); +/// A record: `(purl, uuid, files)`. +type Record<'a> = (String, &'a str, &'a [RecordFile<'a>]); + +fn stage_records(project: &Path, records: &[Record<'_>]) { + let socket = project.join(".socket"); + std::fs::create_dir_all(socket.join("blobs")).unwrap(); + let mut patches = serde_json::Map::new(); + for (purl, uuid, files) in records { + let mut entries = serde_json::Map::new(); + for (key, before, after) in *files { + for bytes in [before, after] { + std::fs::write(socket.join("blobs").join(common::git_sha256(bytes)), bytes) + .unwrap(); + } + entries.insert( + key.to_string(), + serde_json::json!({ + "beforeHash": common::git_sha256(before), + "afterHash": common::git_sha256(after), + }), + ); + } + patches.insert( + purl.clone(), + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-10-02T00:00:00Z", + "files": entries, + "vulnerabilities": { "GHSA-5b7a-0000-0001": { + "cves": ["CVE-2026-0001"], "summary": "s", + "severity": "high", "description": "d" + } }, + "description": "sbt agent review fixture", + "license": "MIT", + "tier": "free", + }), + ); + } + std::fs::write( + socket.join("manifest.json"), + serde_json::to_vec_pretty(&serde_json::json!({ "patches": patches })).unwrap(), + ) + .unwrap(); +} + +fn ivy_opts(fx: &Fixture) -> (&'static str, String) { + ( + "SBT_OPTS", + format!("-Dsbt.ivy.home={}", fx.home.ivy_home().display()), + ) +} + +fn warning_codes(envelope: &Value) -> Vec { + [&envelope["warnings"], &envelope["vex"]["warnings"]] + .into_iter() + .filter_map(Value::as_array) + .flatten() + .filter_map(|w| w["code"].as_str().map(str::to_string)) + .collect() +} + +/// An sbt build beside a Gradle build that never declares `mavenLocal()`: +/// the sbt build's own `Resolver.mavenLocal` reads `~/.m2`, so its copy is +/// patched, not refused as one "this Gradle build never reads". +#[test] +fn agent_mixed_sbt_and_gradle_root_patches_the_m2_copy() { + let fx = fixture(); + std::fs::write( + fx.project.join("build.sbt"), + "resolvers += Resolver.mavenLocal\n\ + libraryDependencies += \"org.slf4j\" % \"slf4j-api\" % \"1.7.36\"\n", + ) + .unwrap(); + std::fs::write( + fx.project.join("settings.gradle"), + "rootProject.name = 'app'\n", + ) + .unwrap(); + std::fs::write( + fx.project.join("build.gradle"), + "plugins { id 'java' }\nrepositories { mavenCentral() }\n", + ) + .unwrap(); + let m2 = fx.home.m2().join("org/slf4j/slf4j-api/1.7.36"); + std::fs::create_dir_all(&m2).unwrap(); + std::fs::write(m2.join(JAR), ORIGINAL).unwrap(); + std::fs::write(m2.join("slf4j-api-1.7.36.pom"), SLF4J.pom()).unwrap(); + stage_manifest(&fx.project, SLF4J); + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert!( + !env.to_string().contains("gradle_build_ignores_m2"), + "{env}" + ); + assert_eq!(std::fs::read(m2.join(JAR)).unwrap(), PATCHED, "{env}"); +} + +/// Base and `sources` variants, and an Ivy `srcs/` jar neither was made +/// for: the variant gate skips it as it would a `~/.m2` or Coursier copy. +/// Only a Gradle hash dir's name proves pristine bytes, so this is no +/// `gradle_copy_unexpected_bytes` failure. +#[test] +fn agent_an_ivy_srcs_jar_no_variant_matches_is_skipped() { + let fx = fixture(); + let jars = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let srcs = jars.parent().unwrap().join("srcs"); + std::fs::create_dir_all(&srcs).unwrap(); + let other: &[u8] = b"PK\x03\x04 some other sources build\n"; + std::fs::write(srcs.join(SOURCES_JAR), other).unwrap(); + stage_records( + &fx.project, + &[ + (SLF4J.purl(), BASE_UUID, &[(JAR, ORIGINAL, PATCHED)]), + ( + format!("{}?classifier=sources", SLF4J.purl()), + SOURCES_UUID, + &[(SOURCES_JAR, SOURCES_ORIGINAL, SOURCES_PATCHED)], + ), + ], + ); + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[ivy_opts(&fx)]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert!( + !env.to_string().contains("gradle_copy_unexpected_bytes"), + "{env}" + ); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), PATCHED, "{env}"); + assert_eq!(std::fs::read(srcs.join(SOURCES_JAR)).unwrap(), other); +} + +/// A `sources` record and an Ivy module with no `srcs/`: the Ivy copy +/// holds none of the record's files, so it is no install of it +/// (`package_not_installed`, as for a Gradle version dir), not a "no +/// matching variant found" failure; the other patch applies and the run +/// succeeds. +#[test] +fn agent_an_ivy_copy_without_the_classifier_is_not_installed() { + let fx = fixture(); + let jars = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let gson = write_ivy_artifact(&fx.home.ivy_home(), GSON, ORIGINAL); + stage_records( + &fx.project, + &[ + ( + format!("{}?classifier=sources", SLF4J.purl()), + SOURCES_UUID, + &[(SOURCES_JAR, SOURCES_ORIGINAL, SOURCES_PATCHED)], + ), + ( + GSON.purl(), + BASE_UUID, + &[("gson-2.8.9.jar", ORIGINAL, PATCHED)], + ), + ], + ); + + let (code, env, stderr) = run(&fx, &["apply", "--offline", "--json"], &[ivy_opts(&fx)]); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert!(env.to_string().contains("package_not_installed"), "{env}"); + assert_eq!(std::fs::read(jars.join(JAR)).unwrap(), ORIGINAL); + assert_eq!( + std::fs::read(gson.join("gson-2.8.9.jar")).unwrap(), + PATCHED, + "{env}" + ); +} + +/// One Ivy copy whose `jars/` jar is patched but whose `srcs/` jar went +/// back to its pristine bytes: VEX withholds the statement AND names the +/// copy (`vex_gradle_unpatched_copy`), as for a lone Gradle version dir. +#[test] +fn agent_vex_names_a_lone_partly_unpatched_ivy_copy() { + let fx = fixture(); + let jars = write_ivy_artifact(&fx.home.ivy_home(), SLF4J, ORIGINAL); + let srcs = jars.parent().unwrap().join("srcs"); + std::fs::create_dir_all(&srcs).unwrap(); + std::fs::write(srcs.join(SOURCES_JAR), SOURCES_ORIGINAL).unwrap(); + stage_records( + &fx.project, + &[( + SLF4J.purl(), + BASE_UUID, + &[ + (JAR, ORIGINAL, PATCHED), + (SOURCES_JAR, SOURCES_ORIGINAL, SOURCES_PATCHED), + ], + )], + ); + let opts = ivy_opts(&fx); + let (code, env, stderr) = run( + &fx, + &["apply", "--offline", "--json"], + std::slice::from_ref(&opts), + ); + assert_eq!(code, 0, "apply: {env}\n{stderr}"); + assert_eq!( + std::fs::read(srcs.join(SOURCES_JAR)).unwrap(), + SOURCES_PATCHED + ); + let (statements, env) = vex_statements(&fx, std::slice::from_ref(&opts)); + assert!(statements > 0, "every file patched: {env}"); + + std::fs::write(srcs.join(SOURCES_JAR), SOURCES_ORIGINAL).unwrap(); + let (statements, env) = vex_statements(&fx, std::slice::from_ref(&opts)); + assert_eq!(statements, 0, "{env}"); + assert!( + warning_codes(&env) + .iter() + .any(|c| c == "vex_gradle_unpatched_copy"), + "{env}" + ); +} diff --git a/crates/socket-patch-cli/tests/e2e_sbt/main.rs b/crates/socket-patch-cli/tests/e2e_sbt/main.rs new file mode 100644 index 000000000..ac1f0ca9a --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt/main.rs @@ -0,0 +1,18 @@ +//! sbt / Mill / scala-cli — the hermetic CLI suites, one module per mode +//! (`docs/design/sbt-support.md` §8.3). No sbt, no JVM, no network: the +//! fixtures write the on-disk shapes the real tools leave +//! (`tests/sbt_common/`), every child gets `SbtHome::isolated_env` so the +//! developer's real caches are never crawled or patched, and the patch API +//! is a wiremock stand-in. Run one mode with a module filter, e.g. +//! `cargo test -p socket-patch-cli --test e2e_sbt agent::`. +//! +//! ONE integration-test binary on purpose (each `tests/` file is its own +//! optimized link in CI's `test-release` job): every mode adds a module +//! here rather than a binary. + +#[path = "../common/mod.rs"] +mod common; +#[path = "../sbt_common/mod.rs"] +mod sbt_common; + +mod agent; diff --git a/crates/socket-patch-cli/tests/e2e_sbt_build.rs b/crates/socket-patch-cli/tests/e2e_sbt_build.rs new file mode 100644 index 000000000..7bf2b6dfc --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt_build.rs @@ -0,0 +1,827 @@ +//! Real-sbt hosted capstones (`sbt_hosted_*`): the real binary wires a +//! real sbt build through `socket-patch.sbt`, and sbt itself proves the +//! wiring patches, fails closed and unwinds. +//! +//! The fixture (`sbt_build_common`) is a Java-only build over a local +//! `file:` repository: the root aggregates `a` (and, per test, more +//! projects); the root depends on `top:1.0.0`, which depends on +//! `lib:1.0.0` (so the root reaches `lib` only transitively), and `a` +//! depends on `lib:1.0.0` directly. The patch replaces `lib:1.0.0`; a +//! wiremock stand-in serves the patch API and the hosted maven2 +//! repository at the production-shaped +//! `/patch-registry/maven///maven2` path. +//! +//! Every test first runs `sbt update` (the resolution evidence the hosted +//! gate reads), then `get --mode hosted`, then drives sbt again. +//! +//! `#[ignore]`: needs sbt (see `sbt_build_common` for the +//! `SOCKET_PATCH_SBT_E2E_*` selection, including running sbt in docker). + +#[path = "common/mod.rs"] +mod common; +#[path = "sbt_build_common/mod.rs"] +mod sbt_build_common; + +use std::path::{Path, PathBuf}; + +use sbt_build_common::*; +use socket_patch_core::formats::sbt::owned_file::{HOSTED_FILE, HOSTED_REPO_REL}; +use wiremock::matchers::{method, path}; +use wiremock::{Mock, MockServer, ResponseTemplate}; + +const SUITE: &str = "e2e_sbt_build"; +const ORG: &str = "test-org"; +const TOKEN: &str = "11111111-1111-4111-8111-111111111111"; +const UUID: &str = "5b6c7d8e-0000-4000-8000-0000000000c1"; +const UUID2: &str = "9a8b7c6d-0000-4000-8000-0000000000c2"; +const UUID_UTIL: &str = "4e3d2c1b-0000-4000-8000-0000000000c3"; +const BASE: &str = "1.0.0"; + +fn sv(uuid: &str, base: &str) -> String { + format!("{base}-socket.{}", &uuid[..8]) +} + +/// The patch-server stand-in, on its own runtime. +struct Server { + server: MockServer, + rt: tokio::runtime::Runtime, +} + +impl Server { + fn start() -> Self { + let rt = tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) + .enable_all() + .build() + .unwrap(); + // Docker reaches the host's loopback through host.docker.internal. + let listener = std::net::TcpListener::bind("0.0.0.0:0").unwrap(); + let server = rt.block_on(MockServer::builder().listener(listener).start()); + Server { server, rt } + } + + fn port(&self) -> u16 { + self.server.address().port() + } + + fn api(&self) -> String { + format!("http://127.0.0.1:{}", self.port()) + } + + /// The origin sbt fetches pins from (and the CLI's `--patch-server-url`). + fn origin(&self, sbt: &Sbt) -> String { + format!("http://{}:{}", sbt.host_from_sbt(), self.port()) + } + + fn reset(&self) { + self.rt.block_on(self.server.reset()); + } + + fn mount(&self, m: Mock) { + self.rt.block_on(m.mount(&self.server)); + } + + /// Grant `uuid` for `artifact:base`, serving `jar` (and the suffixed + /// pom) from the hosted repository. + fn grant(&self, sbt: &Sbt, uuid: &str, artifact: &str, base: &str, jar: &[u8], served: &[u8]) { + let purl = format!("pkg:maven/{GROUP}/{artifact}@{base}"); + let sv = sv(uuid, base); + let repo = format!("/patch-registry/maven/{TOKEN}/{uuid}/maven2"); + let index = format!("{}{repo}", self.origin(sbt)); + let rel = format!( + "{}/{artifact}/{sv}/{artifact}-{sv}", + GROUP.replace('.', "/") + ); + let pom = pom(artifact, &sv, &[]); + self.mount( + Mock::given(method("GET")) + .and(path(format!("{repo}/{rel}.jar"))) + .respond_with(ResponseTemplate::new(200).set_body_bytes(served.to_vec())), + ); + self.mount( + Mock::given(method("GET")) + .and(path(format!("{repo}/{rel}.pom"))) + .respond_with(ResponseTemplate::new(200).set_body_bytes(pom.clone().into_bytes())), + ); + let url = format!("{index}/{rel}.jar"); + let view = serde_json::json!({ + "uuid": uuid, "purl": purl, "publishedAt": "2024-01-01T00:00:00Z", + "files": { format!("{artifact}-{base}.jar"): { + "beforeHash": common::git_sha256(&jar_bytes("ORIGINAL")), + "afterHash": common::git_sha256(jar), + } }, + "vulnerabilities": { "GHSA-sbtb-uild-xxxx": { + "cves": ["CVE-2026-0002"], "summary": "s", "severity": "high", "description": "d" + } }, + "description": "sbt capstone", "license": "MIT", "tier": "free", + }); + self.mount( + Mock::given(method("GET")) + .and(path(format!("/v0/orgs/{ORG}/patches/view/{uuid}"))) + .respond_with(ResponseTemplate::new(200).set_body_json(view)), + ); + self.mount( + Mock::given(method("POST")) + .and(path(format!("/v0/orgs/{ORG}/patches/package"))) + .and(wiremock::matchers::body_string_contains(uuid)) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "results": { uuid: { + "status": "granted", "url": url, "purl": purl, + "artifacts": [{ "kind": "tarball", "url": url, + "integrity": { "sha256": sha256(jar) } }], + "registryOverride": { "kind": "maven2", "indexUrl": index, + "identifiers": { + "name": format!("{GROUP}/{artifact}"), "version": base, + "mavenGroupId": GROUP, "mavenArtifactId": artifact, + "mavenSuffixedVersion": sv, "mavenPomSha256": sha256(pom.as_bytes()), + } } + } } + }))), + ); + } +} + +fn jar_bytes(marker: &str) -> Vec { + jar(marker) +} + +/// `socket-patch ` (JSON envelope) with the caches pinned into `ws`. +fn socket(ws: &Workspace, args: &[&str]) -> (i32, serde_json::Value, String) { + let home = ws.root.join("home"); + let cs = ws.coursier_cache(); + let m2 = home.join(".m2/repository"); + let env = [ + ("HOME", home.to_str().unwrap()), + ("COURSIER_CACHE", cs.to_str().unwrap()), + ("MAVEN_REPO_LOCAL", m2.to_str().unwrap()), + ("SBT_OPTS", ""), + ("JAVA_OPTS", ""), + ]; + let (code, stdout, stderr) = + common::run_bin_with_env(&common::binary(), &ws.project, args, &env); + let json = serde_json::from_str(&stdout).unwrap_or(serde_json::Value::Null); + (code, json, format!("{stdout}\n{stderr}")) +} + +fn get_hosted(ws: &Workspace, server: &Server, uuid: &str) -> serde_json::Value { + let api = server.api(); + let (code, json, out) = socket( + ws, + &[ + "get", + uuid, + "--mode", + "hosted", + "--json", + "--yes", + "--cwd", + ws.project.to_str().unwrap(), + "--api-url", + &api, + "--org", + ORG, + "--api-token", + "fake", + ], + ); + assert_eq!(code, 0, "get --mode hosted:\n{out}"); + json +} + +fn codes(json: &serde_json::Value) -> Vec { + let mut out = Vec::new(); + fn walk(v: &serde_json::Value, out: &mut Vec) { + match v { + serde_json::Value::Object(map) => { + for (k, v) in map { + if k == "code" || k == "errorCode" { + if let Some(s) = v.as_str() { + out.push(s.to_string()); + } + } + walk(v, out); + } + } + serde_json::Value::Array(items) => items.iter().for_each(|v| walk(v, out)), + _ => {} + } + } + walk(json, &mut out); + out +} + +/// The standard fixture: `top` → `lib`, the root on `top`, `a` on `lib`, +/// plus `projects` / `extra` build lines; `sbt update` run. +fn fixture(sbt: &Sbt, extra_projects: &[ProjectSpec<'_>], extra: &str) -> Workspace { + let ws = Workspace::new(sbt); + ws.publish("lib", BASE, "ORIGINAL", &[]); + ws.publish("lib", "1.1.0", "NEWER", &[]); + ws.publish("top", "1.0.0", "TOP", &[("lib", BASE)]); + ws.publish("util", "1.0.0", "UTIL", &[]); + ws.publish("other", "1.0.0", "OTHER", &[]); + let mut projects: Vec> = vec![ + ("root", ".", &[("top", "1.0.0")]), + ("a", "a", &[("lib", BASE)]), + ]; + projects.extend_from_slice(extra_projects); + ws.write("build.sbt", &build_sbt(sbt, &ws, &projects, extra)); + ws.write( + "project/build.properties", + &format!("sbt.version={}\n", sbt.version), + ); + sbt.run(&ws, &["update"]).expect_ok("initial sbt update"); + ws +} + +/// The resolved `lib` jars of `projects`' compile classpaths. +fn lib_jars(sbt: &Sbt, ws: &Workspace, projects: &[&str]) -> Vec { + let tasks: Vec = projects + .iter() + .map(|p| format!("export {}", sbt.classpath_task(p))) + .collect(); + let tasks: Vec<&str> = tasks.iter().map(String::as_str).collect(); + let run = sbt.run(ws, &tasks); + run.expect_ok("export classpath"); + let jars: Vec = run + .classpath_jars_in(ws) + .into_iter() + .filter(|p| { + p.file_name() + .and_then(|n| n.to_str()) + .is_some_and(|n| n.starts_with("lib-")) + }) + .collect(); + assert!( + !jars.is_empty(), + "lib not on the classpath:\n{}", + run.output + ); + jars +} + +fn patched() -> Vec { + jar_bytes("PATCHED") +} + +/// Wire the standard fixture's `lib` patch; `(sbt, ws, server)` back. +fn wired(extra: &str) -> Option<(Sbt, Workspace, Server)> { + let sbt = Sbt::detect(SUITE)?; + let ws = fixture(&sbt, &[], extra); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + let json = get_hosted(&ws, &server, UUID); + assert!( + ws.project.join(HOSTED_FILE).is_file(), + "socket-patch.sbt not written: {json}" + ); + assert_eq!(json["redirect"]["redirected"], 1, "{json}"); + Some((sbt, ws, server)) +} + +fn assert_patched(sbt: &Sbt, ws: &Workspace) { + let jars = lib_jars(sbt, ws, &["root", "a"]); + assert!(!jars.is_empty(), "lib not on the classpath"); + for jar in &jars { + let name = jar.file_name().unwrap().to_string_lossy(); + assert_eq!(name, format!("lib-{}.jar", sv(UUID, BASE)), "{jar:?}"); + assert!( + jar.starts_with(ws.project.join(HOSTED_REPO_REL)), + "resolved from the pin repository: {jar:?}" + ); + assert_eq!(std::fs::read(jar).unwrap(), patched(), "{jar:?}"); + } +} + +fn pin_repo_jar(ws: &Workspace, uuid: &str) -> std::path::PathBuf { + let sv = sv(uuid, BASE); + ws.project + .join(HOSTED_REPO_REL) + .join(GROUP.replace('.', "/")) + .join("lib") + .join(&sv) + .join(format!("lib-{sv}.jar")) +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_pins_transitive_fail_closed() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + // The root reaches lib only through top; both projects get the pin. + assert_patched(&sbt, &ws); + let gitignore = ws.project.join(".socket/sbt-hosted/.gitignore"); + assert_eq!(std::fs::read_to_string(gitignore).unwrap(), "*\n"); + // A fresh clone with the patch server unreachable fails closed. + std::fs::remove_dir_all(ws.project.join(".socket")).unwrap(); + server.reset(); + sbt.run(&ws, &["update"]) + .expect_failure("fresh clone, server down", "socket-patch: cannot download"); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_server_tamper_fails_load() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + // Nothing downloaded yet (no load since the wiring): a fresh clone. + assert!(!ws.project.join(".socket").exists()); + server.reset(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &jar_bytes("EVIL")); + sbt.run(&ws, &["update"]) + .expect_failure("tampered server", "served sha256"); + assert!( + !pin_repo_jar(&ws, UUID).exists(), + "the tampered jar is never kept" + ); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_cache_tamper_heals() { + let Some((sbt, ws, _server)) = wired("") else { + return; + }; + assert_patched(&sbt, &ws); + std::fs::write(pin_repo_jar(&ws, UUID), jar_bytes("EVIL")).unwrap(); + // The load-time check re-downloads the pinned bytes. + assert_patched(&sbt, &ws); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_rollback_restores_without_clean() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + assert_patched(&sbt, &ws); + let origin = server.origin(&sbt); + let (code, json, out) = socket( + &ws, + &[ + "rollback", + "--json", + "--yes", + "--offline", + "--cwd", + ws.project.to_str().unwrap(), + "--patch-server-url", + &origin, + ], + ); + assert_eq!(code, 0, "{out}"); + assert!(!ws.project.join(HOSTED_FILE).exists(), "{json}"); + let jars = lib_jars(&sbt, &ws, &["root", "a"]); + assert!(!jars.is_empty()); + for jar in jars { + assert_eq!( + std::fs::read(&jar).unwrap(), + jar_bytes("ORIGINAL"), + "{jar:?}" + ); + } +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_no_evidence_noop() { + let Some(sbt) = Sbt::detect(SUITE) else { + return; + }; + let ws = Workspace::new(&sbt); + ws.publish("lib", BASE, "ORIGINAL", &[]); + ws.write( + "build.sbt", + &build_sbt(&sbt, &ws, &[("root", ".", &[("lib", BASE)])], ""), + ); + ws.write( + "project/build.properties", + &format!("sbt.version={}\n", sbt.version), + ); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + let json = get_hosted(&ws, &server, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_no_resolution_evidence".to_string()), + "{json}" + ); + assert!(!ws.project.join(HOSTED_FILE).exists()); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_version_conflict_refused() { + let Some(sbt) = Sbt::detect(SUITE) else { + return; + }; + let ws = fixture(&sbt, &[("b", "b", &[("lib", "1.1.0")])], ""); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + let json = get_hosted(&ws, &server, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_version_conflict".to_string()), + "{json}" + ); + assert!(!ws.project.join(HOSTED_FILE).exists()); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_zz_override_assignment_refused() { + let Some(sbt) = Sbt::detect(SUITE) else { + return; + }; + let ws = fixture(&sbt, &[], ""); + let line = if sbt.line() == "0.13" { + "dependencyOverrides in ThisBuild := Set.empty\n" + } else { + "ThisBuild / dependencyOverrides := Seq.empty\n" + }; + ws.write("zz.sbt", line); + sbt.run(&ws, &["update"]).expect_ok("update with zz.sbt"); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + let json = get_hosted(&ws, &server, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_overrides_assignment".to_string()), + "{json}" + ); + assert!(!ws.project.join(HOSTED_FILE).exists()); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_shadow_at_load_fails() { + let Some((sbt, ws, _server)) = wired("") else { + return; + }; + let line = if sbt.line() == "0.13" { + format!("\ndependencyOverrides in a := Set(\"{GROUP}\" % \"lib\" % \"{BASE}\")\n") + } else { + format!("\na / dependencyOverrides := Seq(\"{GROUP}\" % \"lib\" % \"{BASE}\")\n") + }; + let build = std::fs::read_to_string(ws.project.join("build.sbt")).unwrap(); + ws.write("build.sbt", &format!("{build}{line}")); + sbt.run(&ws, &["update"]) + .expect_failure("user override after wiring", "socket-patch:"); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_vex_attests_after_update() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + let origin = server.origin(&sbt); + let api = server.api(); + let vex_path = ws.root.join("vex.json"); + let vex = |what: &str| { + let (code, json, out) = socket( + &ws, + &[ + "vex", + "--json", + "--cwd", + ws.project.to_str().unwrap(), + "--output", + vex_path.to_str().unwrap(), + "--product", + "pkg:maven/dev.socket.test/app@1.0.0", + "--patch-server-url", + &origin, + "--api-url", + &api, + "--org", + ORG, + "--api-token", + "fake", + ], + ); + eprintln!("{what}: vex exit {code}"); + (code, json, out) + }; + // Before the post-wiring update: the pin is not verified. + let (_, json, _) = vex("before update"); + assert!( + codes(&json).contains(&"sbt_resolution_unverified".to_string()), + "{json}" + ); + sbt.run(&ws, &["update"]).expect_ok("post-wiring update"); + let (code, json, out) = vex("after update"); + assert!( + !codes(&json).contains(&"sbt_resolution_unverified".to_string()), + "{out}" + ); + assert_eq!(code, 0, "{out}"); + let doc = std::fs::read_to_string(&vex_path).unwrap(); + assert!( + doc.contains("pkg:maven/dev.socket.fixture/lib@1.0.0"), + "{doc}" + ); +} + +/// A dependency edit after wiring: until sbt resolves again the pin is +/// unverifiable; after `sbt update` a re-run re-verifies it against the new +/// evidence and records the build's new dependency digest, so the warning +/// clears. +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_dep_edit_rechecks_after_update() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + sbt.run(&ws, &["update"]).expect_ok("post-wiring update"); + // Past the evidence's mtime granularity (a bind mount may keep whole + // seconds), so the edit is newer than every record. + std::thread::sleep(std::time::Duration::from_millis(2100)); + let build = std::fs::read_to_string(ws.project.join("build.sbt")).unwrap(); + ws.write( + "build.sbt", + &build.replace( + &format!("\"{GROUP}\" % \"top\" % \"1.0.0\""), + &format!("\"{GROUP}\" % \"top\" % \"1.0.0\", \"{GROUP}\" % \"other\" % \"1.0.0\""), + ), + ); + let before = std::fs::read(ws.project.join(HOSTED_FILE)).unwrap(); + // Edited, not resolved yet. + let json = get_hosted(&ws, &server, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_pin_unverifiable".to_string()), + "{json}" + ); + assert_eq!(std::fs::read(ws.project.join(HOSTED_FILE)).unwrap(), before); + sbt.run(&ws, &["update"]).expect_ok("update after the edit"); + let json = get_hosted(&ws, &server, UUID); + assert!( + !codes(&json).contains(&"redirect_sbt_pin_unverifiable".to_string()), + "{json}" + ); + assert_eq!(json["redirect"]["redirected"], 1, "{json}"); + let after = std::fs::read(ws.project.join(HOSTED_FILE)).unwrap(); + assert_ne!(after, before, "the row's digest is refreshed"); + // ...and the next run is quiet. + let json = get_hosted(&ws, &server, UUID); + assert!( + !codes(&json).contains(&"redirect_sbt_pin_unverifiable".to_string()), + "{json}" + ); + assert_eq!(std::fs::read(ws.project.join(HOSTED_FILE)).unwrap(), after); + assert_patched(&sbt, &ws); +} + +/// A project that now declares the pinned GA newer than the patch's base +/// (a developer or Scala Steward bump): the build-wide override would force +/// it back down, so the load-time check fails `update` and a re-run +/// refuses the pin. +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_declared_bump_fails_closed() { + let Some((sbt, ws, server)) = wired("") else { + return; + }; + assert_patched(&sbt, &ws); + let build = std::fs::read_to_string(ws.project.join("build.sbt")).unwrap(); + let bumped = build.replace( + &format!("\"{GROUP}\" % \"lib\" % \"{BASE}\""), + &format!("\"{GROUP}\" % \"lib\" % \"1.1.0\""), + ); + assert_ne!(bumped, build); + ws.write("build.sbt", &bumped); + sbt.run(&ws, &["update"]) + .expect_failure("declared bump", "declares dev.socket.fixture:lib:1.1.0"); + let json = get_hosted(&ws, &server, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_pin_declared_newer".to_string()), + "{json}" + ); + assert_eq!(json["redirect"]["redirected"], 0, "{json}"); + // Declaring the base again is fine. + ws.write("build.sbt", &build); + assert_patched(&sbt, &ws); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_two_patches_and_update_uuid() { + let Some(sbt) = Sbt::detect(SUITE) else { + return; + }; + let ws = fixture(&sbt, &[("u", "u", &[("util", "1.0.0")])], ""); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + server.grant( + &sbt, + UUID_UTIL, + "util", + "1.0.0", + &jar_bytes("UTILP"), + &jar_bytes("UTILP"), + ); + get_hosted(&ws, &server, UUID); + get_hosted(&ws, &server, UUID_UTIL); + let file = std::fs::read_to_string(ws.project.join(HOSTED_FILE)).unwrap(); + assert!(file.contains(UUID) && file.contains(UUID_UTIL), "{file}"); + assert_patched(&sbt, &ws); + // A newer patch for lib at the same base replaces the old pin. + server.grant( + &sbt, + UUID2, + "lib", + BASE, + &jar_bytes("PATCHED2"), + &jar_bytes("PATCHED2"), + ); + sbt.run(&ws, &["update"]).expect_ok("post-wiring update"); + let json = get_hosted(&ws, &server, UUID2); + assert!( + json.to_string().contains("redirect_sbt_pin_updated") + || std::fs::read_to_string(ws.project.join(HOSTED_FILE)) + .unwrap() + .contains(UUID2), + "{json}" + ); + let file = std::fs::read_to_string(ws.project.join(HOSTED_FILE)).unwrap(); + assert!( + !file.contains(UUID) && file.contains(UUID2) && file.contains(UUID_UTIL), + "{file}" + ); + let jars = lib_jars(&sbt, &ws, &["a"]); + assert_eq!( + jars.iter() + .map(|j| std::fs::read(j).unwrap()) + .collect::>(), + [jar_bytes("PATCHED2")] + ); +} + +/// An evil `lib:` in the `mavenLocal` sbt reads in `ws`. +fn poison_maven_local(ws: &Workspace, sv: &str) { + let dir = ws + .maven_local() + .join(GROUP.replace('.', "/")) + .join("lib") + .join(sv); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join(format!("lib-{sv}.jar")), jar_bytes("EVIL")).unwrap(); + std::fs::write(dir.join(format!("lib-{sv}.pom")), pom("lib", sv, &[])).unwrap(); +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_maven_local_poison_fails() { + let line = |sbt: &Sbt| { + if sbt.line() == "0.13" { + "resolvers in ThisBuild += Resolver.mavenLocal\n" + } else { + "ThisBuild / resolvers += Resolver.mavenLocal\n" + } + }; + let Some(sbt) = Sbt::detect(SUITE) else { + return; + }; + let extra = line(&sbt); + let sv = sv(UUID, BASE); + // Control: without socket-patch.sbt, a build depending on the suffixed + // GAV resolves the poisoned bytes, so the poison sits where this sbt + // reads mavenLocal (the test could otherwise pass vacuously). + let control = Workspace::new(&sbt); + poison_maven_local(&control, &sv); + control.write( + "build.sbt", + &build_sbt(&sbt, &control, &[("root", ".", &[("lib", &sv)])], extra), + ); + control.write( + "project/build.properties", + &format!("sbt.version={}\n", sbt.version), + ); + let jars = lib_jars(&sbt, &control, &["root"]); + assert_eq!( + jars.iter() + .map(|j| std::fs::read(j).unwrap()) + .collect::>(), + [jar_bytes("EVIL")], + "the control resolves mavenLocal's copy: {jars:?}" + ); + + let ws = fixture(&sbt, &[], extra); + let server = Server::start(); + server.grant(&sbt, UUID, "lib", BASE, &patched(), &patched()); + get_hosted(&ws, &server, UUID); + // X3: an evil copy of the suffixed GAV in mavenLocal. + poison_maven_local(&ws, &sv); + let run = sbt.run(&ws, &["update"]); + if run.ok() { + // Our resolver won: the evil copy was never used, so the bytes + // must be the pinned ones. + assert_patched(&sbt, &ws); + } else { + run.expect_failure("mavenLocal poison", "which is not pinned"); + } +} + +#[test] +#[ignore = "real sbt; run with --ignored (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_hosted_ivy_local_poison_fails() { + let Some((sbt, ws, _server)) = wired("") else { + return; + }; + // X4: an evil suffixed GAV published to ~/.ivy2/local (first in sbt's + // default resolver chain). + let sv = sv(UUID, BASE); + let dir = ws + .ivy_home() + .join("local") + .join(GROUP) + .join("lib") + .join(&sv); + std::fs::create_dir_all(dir.join("jars")).unwrap(); + std::fs::create_dir_all(dir.join("ivys")).unwrap(); + std::fs::write(dir.join("jars/lib.jar"), jar_bytes("EVIL")).unwrap(); + std::fs::write( + dir.join("ivys/ivy.xml"), + format!( + "\n\ + \ + \ + \ + \n" + ), + ) + .unwrap(); + std::fs::remove_dir_all(ws.project.join(".socket")).ok(); + let run = sbt.run(&ws, &["update"]); + if run.ok() { + assert_patched(&sbt, &ws); + } else { + run.expect_failure("ivy-local poison", "which is not pinned"); + } +} + +/// The driver's own pieces, without sbt. +#[test] +fn sbt_build_common_writes_a_resolvable_fixture() { + let sbt = Sbt { + runner: Runner::Native { sbt: "sbt".into() }, + version: "1.13.0".into(), + seed: None, + }; + let ws = Workspace::new(&sbt); + ws.publish("lib", BASE, "ORIGINAL", &[("x", "1")]); + let dir = ws.central.join("dev/socket/fixture/lib/1.0.0"); + let jar = std::fs::read(dir.join("lib-1.0.0.jar")).unwrap(); + assert_eq!(&jar[..2], b"PK"); + assert_eq!(jar, jar_bytes("ORIGINAL"), "deterministic jars"); + assert!(std::fs::read_to_string(dir.join("lib-1.0.0.pom")) + .unwrap() + .contains("x")); + let text = build_sbt( + &sbt, + &ws, + &[("root", ".", &[("top", "1.0.0")]), ("a", "a", &[])], + "", + ); + assert!(text.contains(".aggregate(a)") && text.contains("autoScalaLibrary := false")); + assert!(ws.root.is_absolute() && Path::new(&ws.root).exists()); + // This OS's absolute spelling and classpath separator. + let (d, sep) = if cfg!(windows) { + ("C:", ";") + } else { + ("", ":") + }; + assert_eq!( + SbtRun { + code: Some(0), + output: format!("[info] x\n{d}/a/b/lib-1.0.0.jar{sep}{d}/c/top-1.0.0.jar\n"), + commands: vec![], + } + .classpath_jars() + .len(), + 2 + ); + assert_eq!( + SbtRun { + code: Some(0), + output: format!("List({d}/a/lib-1.0.0.jar, {d}/c/top-1.0.0.jar)\n"), + commands: vec![], + } + .classpath_jars(), + [ + PathBuf::from(format!("{d}/a/lib-1.0.0.jar")), + PathBuf::from(format!("{d}/c/top-1.0.0.jar")) + ] + ); + let base = SbtRun { + code: Some(0), + output: "List(${BASE}/.socket/x/lib-1.jar, ${CSR_CACHE}/https/h/top-1.0.0.jar)\n".into(), + commands: vec![], + } + .classpath_jars_in(&ws); + assert_eq!( + base, + [ + ws.project.join(".socket/x/lib-1.jar"), + ws.coursier_cache().join("https/h/top-1.0.0.jar") + ] + ); +} diff --git a/crates/socket-patch-cli/tests/e2e_sbt_hosted.rs b/crates/socket-patch-cli/tests/e2e_sbt_hosted.rs new file mode 100644 index 000000000..c23a76316 --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt_hosted.rs @@ -0,0 +1,537 @@ +//! Hermetic hosted sbt (`get --mode hosted` / `vex` / `rollback` +//! over an sbt build): the real binary against a wiremock patch API, no +//! sbt, no JVM. Evidence is real sbt output (the committed +//! `tests/fixtures/sbt/evidence/1.9.9/test-compile` tree: a root +//! aggregating `a`, `b`, `c`, where only `b` resolves gson 2.8.9), copied +//! into the project with its records made newer than the build sources. +//! +//! - `hosted_no_evidence_*`: a fresh clone (no `target/`) wires nothing, +//! warns once and exits 0. +//! - `hosted_grant_*`: with evidence, the grant writes exactly +//! `socket-patch.sbt` (byte-identical to the core renderer's output for +//! the pin), confirms the uuid, and a re-run is a no-op. +//! - `hosted_version_conflict_*`: commons-text resolves 1.9 and 1.10.0 +//! across projects, so a 1.9 patch is refused. +//! - `hosted_vex_*`: manifest-less VEX keeps the pin as a reference but +//! attests it only when post-wiring evidence resolves the pinned version +//! to the pinned bytes. +//! - `hosted_rollback_*`: `rollback --offline` deletes the file (its only +//! pin), the downloads stay. +//! +//! Every child gets `sbt_common::SbtHome::isolated_env`, so no developer +//! cache is crawled. + +#[path = "common/mod.rs"] +mod common; +#[path = "sbt_common/mod.rs"] +mod sbt_common; + +use std::path::{Path, PathBuf}; +use std::time::{Duration, SystemTime}; + +use sbt_common::{copy_evidence, record_pinned_resolution, write_sbt_build, Gav, SbtHome}; +use socket_patch_core::formats::sbt::owned_file::{ + render, SbtFileMode, SbtLine, SbtOwnedFile, SbtPin, HOSTED_FILE, HOSTED_REPO_REL, +}; +use socket_patch_core::patch::redirect::sbt::ResolutionDoc; +use wiremock::matchers::{method, path}; +use wiremock::{Mock, MockServer, ResponseTemplate}; + +const ORG: &str = "test-org"; +const TOKEN: &str = "11111111-1111-4111-8111-111111111111"; +const UUID: &str = "abcdef12-0000-4000-8000-0000000000a1"; +const GROUP: &str = "com.google.code.gson"; +const ARTIFACT: &str = "gson"; +const BASE: &str = "2.8.9"; +const SV: &str = "2.8.9-socket.abcdef12"; +const TEXT_UUID: &str = "12345678-0000-4000-8000-0000000000b2"; +const JAR: &[u8] = b"PK\x03\x04 patched gson jar"; +const POM: &[u8] = b"2.8.9-socket.abcdef12\n"; + +fn sha256(bytes: &[u8]) -> String { + use sha2::{Digest as _, Sha256}; + hex::encode(Sha256::digest(bytes)) +} + +fn index_url(uuid: &str) -> String { + format!("https://patch.socket.dev/patch-registry/maven/{TOKEN}/{uuid}/maven2") +} + +/// A wiremock patch API with its own runtime (the CLI runs as a blocking +/// child process on the test thread). +struct Api { + server: MockServer, + rt: tokio::runtime::Runtime, +} + +impl Api { + fn start() -> Self { + let rt = tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) + .enable_all() + .build() + .unwrap(); + let server = rt.block_on(MockServer::start()); + Api { server, rt } + } + + /// The view and the hosted reference grant for one Maven patch. + fn grant(&self, uuid: &str, group: &str, artifact: &str, base: &str) { + let purl = format!("pkg:maven/{group}/{artifact}@{base}"); + let sv = format!("{base}-socket.{}", &uuid[..8]); + let url = format!( + "https://patch.socket.dev/patch/maven/{group}/{artifact}/{base}/{TOKEN}/{uuid}/{artifact}-{sv}.jar" + ); + let view = serde_json::json!({ + "uuid": uuid, "purl": purl, "publishedAt": "2024-01-01T00:00:00Z", + "files": { + format!("{artifact}-{base}.jar"): { + "beforeHash": common::git_sha256(b"before"), + "afterHash": common::git_sha256(JAR), + } + }, + "vulnerabilities": { "GHSA-sbtt-test-xxxx": { + "cves": ["CVE-2026-0001"], "summary": "s", "severity": "high", "description": "d" + } }, + "description": "sbt hosted fixture", "license": "MIT", "tier": "free", + }); + let reference = serde_json::json!({ "results": { uuid: { + "status": "granted", "url": url, "purl": purl, + "artifacts": [{ "kind": "tarball", "url": url, "integrity": { "sha256": sha256(JAR) } }], + "registryOverride": { + "kind": "maven2", + "indexUrl": index_url(uuid), + "identifiers": { + "name": format!("{group}/{artifact}"), "version": base, + "mavenGroupId": group, "mavenArtifactId": artifact, + "mavenSuffixedVersion": sv, "mavenPomSha256": sha256(POM), + } + } + } } }); + self.rt.block_on(async { + Mock::given(method("GET")) + .and(path(format!("/v0/orgs/{ORG}/patches/view/{uuid}"))) + .respond_with(ResponseTemplate::new(200).set_body_json(view)) + .mount(&self.server) + .await; + Mock::given(method("POST")) + .and(path(format!("/v0/orgs/{ORG}/patches/package"))) + .respond_with(ResponseTemplate::new(200).set_body_json(reference)) + .mount(&self.server) + .await; + }); + } +} + +/// `socket-patch ` over `project` with the isolated sbt home. +fn socket(home: &SbtHome, project: &Path, args: &[&str]) -> (i32, serde_json::Value, String) { + let env = home.isolated_env(); + let env: Vec<(&str, &str)> = env.iter().map(|(k, v)| (k.as_str(), v.as_str())).collect(); + let (code, stdout, stderr) = common::run_bin_with_env(&common::binary(), project, args, &env); + // The arguments carry the patch uuid, and CodeQL taints everything the + // run returns (streams, exit code, parse error) through them: keep the + // panic message static (CodeQL rust/cleartext-logging). + let json = serde_json::from_str(&stdout) + .unwrap_or_else(|_| panic!("socket-patch printed non-JSON output")); + (code, json, stderr) +} + +fn get_hosted(home: &SbtHome, project: &Path, api: &Api, uuid: &str) -> (i32, serde_json::Value) { + let uri = api.server.uri(); + let (code, json, stderr) = socket( + home, + project, + &[ + "get", + uuid, + "--mode", + "hosted", + "--json", + "--yes", + "--cwd", + project.to_str().unwrap(), + "--api-url", + &uri, + "--org", + ORG, + "--api-token", + "fake", + ], + ); + assert!( + code == 0, + "get --mode hosted exited {code}\n{json}\n{stderr}" + ); + (code, json) +} + +/// The warning codes anywhere in an envelope. +fn codes(json: &serde_json::Value) -> Vec { + let mut out = Vec::new(); + fn walk(v: &serde_json::Value, out: &mut Vec) { + match v { + serde_json::Value::Object(map) => { + for (k, v) in map { + if k == "code" || k == "errorCode" { + if let Some(s) = v.as_str() { + out.push(s.to_string()); + } + } + walk(v, out); + } + } + serde_json::Value::Array(items) => items.iter().for_each(|v| walk(v, out)), + _ => {} + } + } + walk(json, &mut out); + out +} + +/// The test-compile evidence build, its records touched newer than every +/// build source (copying sets every mtime to "now", in copy order). +fn evidence_project(tmp: &Path) -> PathBuf { + let project = tmp.join("project"); + copy_evidence("1.9.9", "test-compile", &project); + fn touch_records(dir: &Path, in_target: bool, later: SystemTime) { + for entry in std::fs::read_dir(dir).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + let in_target = in_target || entry.file_name() == "target"; + if entry.file_type().unwrap().is_dir() { + touch_records(&path, in_target, later); + } else if in_target { + let f = std::fs::File::options().write(true).open(&path).unwrap(); + f.set_modified(later).unwrap(); + } + } + } + touch_records(&project, false, SystemTime::now() + Duration::from_secs(60)); + project +} + +/// The file the rewriter must write for the gson pin over `project`. +fn expected_file(project: &Path) -> String { + let doc = socket_patch_core::crawlers::sbt_evidence::distill(project); + let pin = SbtPin { + uuid: UUID.into(), + group: GROUP.into(), + artifact: ARTIFACT.into(), + base: BASE.into(), + sv: SV.into(), + pom_sha256: sha256(POM), + jar_sha256: sha256(JAR), + deps_digest: doc.deps_digest, + index_url: Some(index_url(UUID)), + }; + render(&SbtOwnedFile { + mode: SbtFileMode::Hosted, + line: SbtLine::Sbt1, + crlf: false, + pins: [(UUID.to_string(), pin)].into(), + }) + .unwrap() +} + +#[test] +fn hosted_no_evidence_warns_and_writes_nothing() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = tmp.path().join("project"); + write_sbt_build( + &project, + "1.9.9", + "libraryDependencies += \"com.google.code.gson\" % \"gson\" % \"2.8.9\"\n", + ); + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + let (_, json) = get_hosted(&home, &project, &api, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_no_resolution_evidence".to_string()), + "{json}" + ); + assert!(!project.join(HOSTED_FILE).exists(), "nothing is wired"); + assert!(!project.join(".socket").exists(), "nothing under .socket/"); +} + +/// A mixed root (`pom.xml` beside an sbt build): the sbt rewriter refuses +/// (no evidence) while the Maven rewriter pins `pom.xml`. That pom pin is +/// what the run wrote, so the patch is reported redirected, not dropped. +#[test] +fn hosted_mixed_root_confirms_the_pom_pin_when_sbt_refuses() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = tmp.path().join("project"); + write_sbt_build( + &project, + "1.9.9", + "libraryDependencies += \"com.google.code.gson\" % \"gson\" % \"2.8.9\"\n", + ); + std::fs::write( + project.join("pom.xml"), + "\n\n \ + 4.0.0\n dev.socket.test\n \ + app\n 1.0.0\n \n \ + \n com.google.code.gson\n \ + gson\n 2.8.9\n \n \ + \n\n", + ) + .unwrap(); + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + let (_, json) = get_hosted(&home, &project, &api, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_no_resolution_evidence".to_string()), + "{json}" + ); + assert!( + !project.join(HOSTED_FILE).exists(), + "the sbt build is not wired" + ); + let pom = std::fs::read_to_string(project.join("pom.xml")).unwrap(); + assert!(pom.contains(SV), "{pom}"); + assert_eq!(json["redirect"]["redirected"], 1, "{json}"); +} + +#[test] +fn hosted_grant_writes_the_owned_file_and_reruns_idempotently() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = evidence_project(tmp.path()); + let build_sbt = std::fs::read(project.join("build.sbt")).unwrap(); + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + + let (_, json) = get_hosted(&home, &project, &api, UUID); + let written = std::fs::read_to_string(project.join(HOSTED_FILE)) + .unwrap_or_else(|e| panic!("socket-patch.sbt not written ({e}): {json}")); + assert_eq!(written, expected_file(&project)); + assert_eq!(std::fs::read(project.join("build.sbt")).unwrap(), build_sbt); + assert!( + !project.join(".socket").exists(), + "hosted writes only socket-patch.sbt (sbt downloads at load)" + ); + let redirect = &json["redirect"]; + assert_eq!(redirect["redirected"], 1, "{json}"); + assert!( + redirect["rewrittenFiles"] + .as_array() + .is_some_and(|f| f.iter().any(|f| f == HOSTED_FILE)), + "{json}" + ); + + // Re-run before any `sbt update`: the evidence predates the generated + // file (the fixture's records were touched into the future, so move + // the file past them), so the pin is kept and still confirmed. + std::fs::File::options() + .write(true) + .open(project.join(HOSTED_FILE)) + .unwrap() + .set_modified(SystemTime::now() + Duration::from_secs(600)) + .unwrap(); + let (_, again) = get_hosted(&home, &project, &api, UUID); + assert_eq!( + std::fs::read_to_string(project.join(HOSTED_FILE)).unwrap(), + written + ); + assert_eq!(again["redirect"]["redirected"], 1, "{again}"); +} + +#[test] +fn hosted_version_conflict_is_refused() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = evidence_project(tmp.path()); + let api = Api::start(); + api.grant(TEXT_UUID, "org.apache.commons", "commons-text", "1.9"); + let (_, json) = get_hosted(&home, &project, &api, TEXT_UUID); + assert!( + codes(&json).contains(&"redirect_sbt_version_conflict".to_string()), + "{json}" + ); + assert!(!project.join(HOSTED_FILE).exists()); + assert_eq!(json["redirect"]["redirected"], 0, "{json}"); +} + +/// A committed `socket-patch.sbt` pinning gson, no evidence of it. +fn committed_project(tmp: &Path) -> PathBuf { + let project = tmp.join("project"); + write_sbt_build( + &project, + "1.9.9", + "libraryDependencies += \"com.google.code.gson\" % \"gson\" % \"2.8.9\"\n", + ); + let file = expected_file(&project); + std::fs::write(project.join(HOSTED_FILE), file).unwrap(); + project +} + +fn vex(home: &SbtHome, project: &Path, api_uri: &str) -> (i32, serde_json::Value) { + let out = project.join("vex.json"); + let (code, json, _) = socket( + home, + project, + &[ + "vex", + "--cwd", + project.to_str().unwrap(), + "--json", + "--output", + out.to_str().unwrap(), + "--product", + "pkg:maven/dev.socket.test/app@1.0.0", + "--api-url", + api_uri, + "--org", + ORG, + "--api-token", + "fake", + ], + ); + (code, json) +} + +#[test] +fn hosted_vex_without_evidence_is_unverified() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = committed_project(tmp.path()); + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + let (_, json) = vex(&home, &project, &api.server.uri()); + assert!( + codes(&json).contains(&"sbt_resolution_unverified".to_string()), + "{json}" + ); + let doc = std::fs::read_to_string(project.join("vex.json")).unwrap_or_default(); + assert!( + !doc.contains("\"not_affected\""), + "nothing attested without evidence: {doc}" + ); +} + +/// What `sbt update` records after wiring: `b` resolves the pinned version, +/// its jar at `jar` (absolute), dated after the generated file. +fn post_update_evidence(project: &Path, jar: &Path) { + let gav = Gav { + group: GROUP, + artifact: ARTIFACT, + version: BASE, + }; + let changed = record_pinned_resolution( + project, + &[(gav, SV.to_string(), jar.to_path_buf())], + SystemTime::now() + Duration::from_secs(120), + ); + assert!(changed > 0, "no record resolved {GROUP}:{ARTIFACT}"); + let doc = ResolutionDoc::parse( + &socket_patch_core::crawlers::sbt_evidence::distill(project).to_json(), + ) + .unwrap(); + assert!( + doc.resolution + .as_ref() + .is_some_and(|r| r.versions(GROUP, ARTIFACT) == [SV]), + "the synthesized evidence must parse: {doc:?}" + ); +} + +/// A re-run after `sbt update` re-checks the existing pin on content: the +/// pinned version served from outside the pin repository (Ivy's second +/// checkout reads the first checkout's cached copy) is confirmed when the +/// bytes are the pin's, and `redirect_sbt_resolved_elsewhere` otherwise. +#[test] +fn hosted_rerun_checks_the_pin_by_content_not_location() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = evidence_project(tmp.path()); + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + get_hosted(&home, &project, &api, UUID); + assert_eq!( + std::fs::read_to_string(project.join(HOSTED_FILE)).unwrap(), + expected_file(&project) + ); + let ivy = std::fs::canonicalize(tmp.path()) + .unwrap() + .join("other-checkout-ivy/cache/com.google.code.gson/gson/jars"); + std::fs::create_dir_all(&ivy).unwrap(); + let jar = ivy.join(format!("gson-{SV}.jar")); + std::fs::write(&jar, JAR).unwrap(); + post_update_evidence(&project, &jar); + + let (_, json) = get_hosted(&home, &project, &api, UUID); + assert_eq!(json["redirect"]["redirected"], 1, "{json}"); + assert!( + !codes(&json).iter().any(|c| c.starts_with("redirect_sbt_")), + "{json}" + ); + + std::fs::write(&jar, b"other bytes").unwrap(); + let (_, json) = get_hosted(&home, &project, &api, UUID); + assert!( + codes(&json).contains(&"redirect_sbt_resolved_elsewhere".to_string()), + "{json}" + ); +} + +#[test] +fn hosted_vex_attests_with_post_wiring_evidence() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = evidence_project(tmp.path()); + std::fs::write(project.join(HOSTED_FILE), expected_file(&project)).unwrap(); + // What `sbt update` leaves after wiring: b resolves the pinned version + // from the pin repository, which holds the pinned bytes. + let repo = project + .join(HOSTED_REPO_REL) + .join("com/google/code/gson/gson") + .join(SV); + std::fs::create_dir_all(&repo).unwrap(); + std::fs::write(repo.join(format!("gson-{SV}.jar")), JAR).unwrap(); + std::fs::write(repo.join(format!("gson-{SV}.pom")), POM).unwrap(); + post_update_evidence( + &project, + &std::fs::canonicalize(&repo) + .unwrap() + .join(format!("gson-{SV}.jar")), + ); + + let api = Api::start(); + api.grant(UUID, GROUP, ARTIFACT, BASE); + let (_, json) = vex(&home, &project, &api.server.uri()); + assert!( + !codes(&json).contains(&"sbt_resolution_unverified".to_string()), + "{json}" + ); + let vex = std::fs::read_to_string(project.join("vex.json")).unwrap(); + assert!(vex.contains(UUID) || vex.contains("gson"), "{vex}"); +} + +#[test] +fn hosted_rollback_deletes_the_owned_file_offline() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let project = committed_project(tmp.path()); + let build_sbt = std::fs::read(project.join("build.sbt")).unwrap(); + // The downloads sbt made at load stay (gitignored, inert). + let download = project.join(HOSTED_REPO_REL).join("x.jar"); + std::fs::create_dir_all(download.parent().unwrap()).unwrap(); + std::fs::write(&download, b"x").unwrap(); + let (code, json, stderr) = socket( + &home, + &project, + &[ + "rollback", + "--json", + "--yes", + "--offline", + "--cwd", + project.to_str().unwrap(), + ], + ); + assert_eq!(code, 0, "{json}\n{stderr}"); + assert!(!project.join(HOSTED_FILE).exists(), "{json}"); + assert_eq!(std::fs::read(project.join("build.sbt")).unwrap(), build_sbt); + assert!(download.exists()); +} diff --git a/crates/socket-patch-cli/tests/e2e_sbt_vendor.rs b/crates/socket-patch-cli/tests/e2e_sbt_vendor.rs new file mode 100644 index 000000000..43215c0b8 --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt_vendor.rs @@ -0,0 +1,894 @@ +//! CLI flows of the vendored sbt backend (`vendor/jvm/sbt.rs`) over +//! hermetic fixtures: no sbt, no JVM, no network. Each project is the +//! sbt 1.13.0 scoping-probe build with its real `target/` resolution +//! evidence (`sbt_common::copy_evidence`), and the installed jars sit in an +//! isolated Coursier cache (`COURSIER_CACHE`, found by the agent crawler), +//! so the run sees exactly what it would after a real `sbt update`. +//! +//! The patched GAs are ones that evidence resolves at a single version in +//! scope (gson 2.8.9 in `b`, junit 4.13.2 in `a`'s tests), so the suite +//! holds with the evidence gate live as well as stubbed. +//! +//! These pin what only shows through the CLI's own bookkeeping: the ledger +//! shape, revert in either order and after a patch update, `--check` +//! drift, `repair`, a forged ledger, an escaping symlink, the subproject +//! and build-edit refusals. + +#[path = "prebuilt_common/mod.rs"] +mod prebuilt_common; +#[path = "sbt_common/mod.rs"] +mod sbt_common; + +use std::collections::BTreeMap; +use std::io::Write as _; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use sbt_common::{copy_evidence, record_pinned_resolution, write_coursier_artifact, Gav, SbtHome}; +use socket_patch_core::formats::sbt::owned_file::{ + parse, render, SbtFileMode, SbtLine, SbtOwnedFile, SbtPin, HOSTED_FILE, VENDORED_FILE, +}; + +const GSON_UUID: &str = "1d3c1fd2-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const JUNIT_UUID: &str = "9a8b7c6d-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const GSON_UPDATE_UUID: &str = "2e4d6f80-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const MEMBER: &str = "META-INF/NOTICE.txt"; +const CENTRAL: &str = "repo1.maven.org/maven2"; + +const GSON: Gav<'static> = Gav { + group: "com.google.code.gson", + artifact: "gson", + version: "2.8.9", +}; +const JUNIT: Gav<'static> = Gav { + group: "junit", + artifact: "junit", + version: "4.13.2", +}; + +const GSON_TREE: &str = ".socket/vendor/maven2/com/google/code/gson/gson/2.8.9-socket.1d3c1fd2"; +const GSON_JAR: &str = ".socket/vendor/maven2/com/google/code/gson/gson/2.8.9-socket.1d3c1fd2/gson-2.8.9-socket.1d3c1fd2.jar"; + +fn git_sha256(bytes: &[u8]) -> String { + socket_patch_core::hash::git_sha256::compute_git_sha256_from_bytes(bytes) +} + +fn jar(notice: &[u8]) -> Vec { + let mut zw = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); + let opts = zip::write::SimpleFileOptions::default(); + for (name, bytes) in [ + ("META-INF/MANIFEST.MF", &b"Manifest-Version: 1.0\n"[..]), + (MEMBER, notice), + ] { + zw.start_file(name, opts).unwrap(); + zw.write_all(bytes).unwrap(); + } + zw.finish().unwrap().into_inner() +} + +/// Every file under `dir`, recursively. +fn files_under(dir: &Path) -> Vec { + let mut out = Vec::new(); + for entry in std::fs::read_dir(dir).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + out.extend(files_under(&path)); + } else { + out.push(path); + } + } + out +} + +/// Make every evidence file newer than the build sources (a copy writes +/// them in directory order, which could otherwise read as stale). +fn freshen_evidence(proj: &Path) { + let later = std::time::SystemTime::now() + std::time::Duration::from_secs(120); + for path in files_under(proj) { + let rel = path + .strip_prefix(proj) + .unwrap() + .to_string_lossy() + .replace('\\', "/"); + if rel.contains("target/") { + let f = std::fs::File::options().write(true).open(&path).unwrap(); + f.set_modified(later).unwrap(); + } + } +} + +/// A test project: `root/proj` is the sbt build (at `project_dir` below it +/// the manifest and blobs), `root/sbt-home` the isolated caches with every +/// `(gav, uuid)` installed in its Maven repository. +struct Fixture { + root: PathBuf, + home: SbtHome, +} + +impl Fixture { + fn new(root: &Path, packages: &[(Gav<'_>, &str)]) -> Self { + Self::at(root, "", packages) + } + + fn at(root: &Path, project_dir: &str, packages: &[(Gav<'_>, &str)]) -> Self { + let proj = root.join("proj"); + copy_evidence("1.13.0", "test-compile", &proj); + freshen_evidence(&proj); + let home = SbtHome::new(root); + let manifest_root = if project_dir.is_empty() { + proj.clone() + } else { + proj.join(project_dir) + }; + std::fs::create_dir_all(manifest_root.join(".socket/blobs")).unwrap(); + let mut patches = serde_json::Map::new(); + for (gav, uuid) in packages { + // Installed where sbt 1.3+ leaves it: the Coursier cache the + // agent crawler finds through `COURSIER_CACHE`. + let before = format!("NOTICE {}\n", gav.artifact).into_bytes(); + let after = [before.as_slice(), b"PATCHED\n"].concat(); + write_coursier_artifact(&home.coursier_cache(), CENTRAL, *gav, &jar(&before)); + std::fs::write( + manifest_root.join(".socket/blobs").join(git_sha256(&after)), + &after, + ) + .unwrap(); + patches.insert( + gav.purl(), + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-01-01T00:00:00Z", + "files": { MEMBER: { + "beforeHash": git_sha256(&before), + "afterHash": git_sha256(&after), + } }, + "vulnerabilities": { "GHSA-xxxx-yyyy-zzzz": { + "cves": ["CVE-2026-0001"], "summary": "s", "severity": "high", + "description": "d" + } }, + "description": "x", + "license": "MIT", + "tier": "free", + }), + ); + } + std::fs::write( + manifest_root.join(".socket/manifest.json"), + serde_json::to_string_pretty(&serde_json::json!({ "patches": patches })).unwrap(), + ) + .unwrap(); + Self { + root: root.to_path_buf(), + home, + } + } + + fn proj(&self) -> PathBuf { + self.root.join("proj") + } + + /// `socket-patch --json --cwd /`; `(exit, envelope)`. + fn run_in(&self, dir: &str, args: &[&str]) -> (Option, serde_json::Value) { + let mut cmd = Command::new(env!("CARGO_BIN_EXE_socket-patch")); + for (k, _) in std::env::vars_os() { + let k = k.to_string_lossy(); + if k.starts_with("SOCKET_") || k.starts_with("COURSIER_") { + cmd.env_remove(&*k); + } + } + let cwd = if dir.is_empty() { + self.proj() + } else { + self.proj().join(dir) + }; + // The download fixture serves the pristine artifacts from the + // Coursier cache's Maven2 repository root. + let repo = self.home.coursier_cache().join("https").join(CENTRAL); + let _fixture = prebuilt_common::prepare_command( + &mut cmd, + &cwd, + args, + &[("MAVEN_REPO_LOCAL", repo.to_str().unwrap())], + ); + for (k, v) in self.home.isolated_env() { + cmd.env(k, v); + } + let out = cmd + .args(["--json", "--cwd", cwd.to_str().unwrap()]) + .env("SOCKET_TELEMETRY_DISABLED", "1") + .env("SOCKET_NO_CONFIG", "1") + .env_remove("M2_HOME") + .output() + .expect("run socket-patch"); + let stdout = String::from_utf8_lossy(&out.stdout).into_owned(); + let env = serde_json::from_str(&stdout).unwrap_or_else(|e| { + panic!( + "{args:?}: not JSON ({e})\n{stdout}\n{}", + String::from_utf8_lossy(&out.stderr) + ) + }); + (out.status.code(), env) + } + + fn run(&self, args: &[&str]) -> (Option, serde_json::Value) { + self.run_in("", args) + } + + fn ok(&self, args: &[&str]) -> serde_json::Value { + let (code, env) = self.run(args); + assert_eq!(code, Some(0), "{args:?}: {env}"); + let failed = env["summary"].get("failed").unwrap_or(&env["failed"]); + assert_eq!(failed, 0, "{args:?}: {env}"); + env + } + + /// Every file and directory under `proj`, minus the manifest and blobs. + fn snapshot(&self) -> BTreeMap>> { + fn walk(base: &Path, dir: &Path, out: &mut BTreeMap>>) { + for entry in std::fs::read_dir(dir).unwrap() { + let path = entry.unwrap().path(); + let rel = path + .strip_prefix(base) + .unwrap() + .to_string_lossy() + .replace('\\', "/"); + // sbt's own evidence under `target/` is rewritten by + // [`Fixture::sbt_update`], never by socket-patch. + if rel.ends_with(".socket/manifest.json") + || rel.ends_with(".socket/blobs") + || rel == "target" + || rel.ends_with("/target") + || rel.contains("target/") + { + continue; + } + if std::fs::symlink_metadata(&path).unwrap().is_dir() { + out.insert(format!("{rel}/"), None); + walk(base, &path, out); + } else { + out.insert(rel, Some(std::fs::read(&path).unwrap())); + } + } + } + let proj = self.proj(); + let mut out = BTreeMap::new(); + walk(&proj, &proj, &mut out); + out + } + + /// What `sbt update` records after vendoring: every evidence record + /// that resolved `gav` now resolves its suffixed version from the + /// vendored tree, dated after the generated file. A re-run then + /// re-checks the existing pins (`gate::check_existing`), never the + /// new-pin gate that would refuse the suffixed version as a conflict. + fn sbt_update(&self, packages: &[(Gav<'_>, &str)]) { + let proj = std::fs::canonicalize(self.proj()).unwrap(); + let pins: Vec<(Gav<'_>, String, PathBuf)> = packages + .iter() + .map(|(gav, uuid)| { + let sv = format!("{}-socket.{}", gav.version, &uuid[..8]); + let jar = proj + .join(".socket/vendor/maven2") + .join(gav.group_path()) + .join(gav.artifact) + .join(&sv) + .join(format!("{}-{sv}.jar", gav.artifact)); + (*gav, sv, jar) + }) + .collect(); + let later = std::time::SystemTime::now() + std::time::Duration::from_secs(240); + assert!(record_pinned_resolution(&proj, &pins, later) > 0); + let doc = socket_patch_core::crawlers::sbt_evidence::distill(&proj); + let res = doc.resolution.expect("the updated evidence parses"); + for (gav, uuid) in packages { + let sv = format!("{}-socket.{}", gav.version, &uuid[..8]); + assert_eq!(res.versions(gav.group, gav.artifact), [sv]); + } + assert!(!doc.stale && !doc.wiring_newer); + } + + fn generated(&self) -> String { + std::fs::read_to_string(self.proj().join(VENDORED_FILE)).unwrap() + } + + fn state(&self) -> serde_json::Value { + serde_json::from_slice( + &std::fs::read(self.proj().join(".socket/vendor/state.json")).unwrap(), + ) + .unwrap() + } +} + +fn events(env: &serde_json::Value) -> Vec<(String, String, String)> { + env["events"] + .as_array() + .unwrap() + .iter() + .map(|e| { + let s = |k: &str| e[k].as_str().unwrap_or_default().to_string(); + (s("purl"), s("action"), s("errorCode")) + }) + .collect() +} + +/// The ledger entry, the generated file and the tree: every record a +/// planner can produce for the coordinates, no user file edited, and a +/// re-run (and `--check`) in sync. +#[test] +fn vendor_ledger_shape_and_generated_file() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let before = fx.snapshot(); + let env = fx.ok(&["vendor"]); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + let after = fx.snapshot(); + for (rel, bytes) in &before { + assert_eq!(after.get(rel), Some(bytes), "{rel} changed"); + } + let added: Vec<&str> = after + .keys() + .filter(|k| !before.contains_key(*k)) + .map(String::as_str) + .filter(|k| !k.ends_with('/')) + .collect(); + assert_eq!( + added, + [ + ".socket/vendor/maven2/.gitattributes".to_string(), + ".socket/vendor/maven2/.gitignore".to_string(), + GSON_JAR.to_string(), + format!("{GSON_JAR}.sha1"), + format!("{GSON_TREE}/gson-2.8.9-socket.1d3c1fd2.pom"), + format!("{GSON_TREE}/gson-2.8.9-socket.1d3c1fd2.pom.sha1"), + format!("{GSON_TREE}/socket-patch.vendor.json"), + ".socket/vendor/state.json".to_string(), + VENDORED_FILE.to_string(), + ] + ); + assert_eq!( + std::fs::read(fx.proj().join(".socket/vendor/maven2/.gitignore")).unwrap(), + b"!*\n" + ); + let file = parse(SbtFileMode::Vendored, &fx.generated()).unwrap(); + let pin = &file.pins[GSON_UUID]; + assert_eq!(pin.sv, "2.8.9-socket.1d3c1fd2"); + assert_eq!( + pin.jar_sha256, + hex::encode(::digest( + std::fs::read(fx.proj().join(GSON_JAR)).unwrap() + )) + ); + + let state = fx.state(); + let entry = &state["entries"][GSON.purl()]; + assert_eq!(entry["ecosystem"], "jvm", "{state}"); + assert_eq!(entry["artifact"]["path"], GSON_JAR, "{state}"); + let mut kinds: Vec<(String, String, String)> = entry["wiring"] + .as_array() + .unwrap() + .iter() + .filter(|w| w["kind"] != "jvm_vendor_tree" && w["kind"] != "jvm_created_dir") + .map(|w| { + let s = |v: &serde_json::Value| v.as_str().unwrap_or_default().to_string(); + (s(&w["kind"]), s(&w["file"]), s(&w["key"])) + }) + .collect(); + kinds.sort(); + assert_eq!( + kinds, + [ + ( + "jvm_owned_file".to_string(), + ".socket/vendor/maven2/.gitattributes".to_string(), + "owned".to_string() + ), + ( + "jvm_owned_file".to_string(), + ".socket/vendor/maven2/.gitignore".to_string(), + "owned".to_string() + ), + ( + "jvm_upstream_status".to_string(), + GSON_JAR.to_string(), + "upstream".to_string() + ), + ( + "sbt_build_fragment".to_string(), + VENDORED_FILE.to_string(), + "file".to_string() + ), + ( + "sbt_build_fragment".to_string(), + VENDORED_FILE.to_string(), + format!("pin:{GSON_UUID}") + ), + ], + "{state}" + ); + let tree = entry["wiring"] + .as_array() + .unwrap() + .iter() + .filter(|w| w["kind"] == "jvm_vendor_tree") + .count(); + assert_eq!(tree, 5, "{state}"); + + fx.sbt_update(&[(GSON, GSON_UUID)]); + let env = fx.ok(&["vendor"]); + assert_eq!( + events(&env), + [( + GSON.purl(), + "skipped".to_string(), + "already_vendored".to_string() + )], + "{env}" + ); + let synced = fx.snapshot(); + fx.ok(&["vendor", "--check"]); + assert_eq!(fx.snapshot(), synced); + fx.ok(&["vendor", "--revert"]); + assert_eq!(fx.snapshot(), before); +} + +/// Rolling back one of two vendored packages leaves the other pinned (a +/// re-vendor finds it in sync), and reverting the rest restores every byte +/// and directory, in either order. +#[test] +fn vendor_two_patches_roll_back_in_either_order() { + for first in [GSON, JUNIT] { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID), (JUNIT, JUNIT_UUID)]); + let pristine = fx.snapshot(); + let env = fx.ok(&["vendor"]); + assert_eq!(env["summary"]["applied"], 2, "{env}"); + assert_eq!( + parse(SbtFileMode::Vendored, &fx.generated()) + .unwrap() + .pins + .len(), + 2 + ); + fx.sbt_update(&[(GSON, GSON_UUID), (JUNIT, JUNIT_UUID)]); + fx.ok(&["rollback", &first.purl()]); + let other = if first.artifact == "gson" { + JUNIT + } else { + GSON + }; + let left = parse(SbtFileMode::Vendored, &fx.generated()).unwrap(); + assert_eq!(left.pins.len(), 1); + assert_eq!(left.pins.values().next().unwrap().artifact, other.artifact); + let env = fx.ok(&["vendor"]); + assert_eq!( + events(&env), + [( + other.purl(), + "skipped".to_string(), + "already_vendored".to_string() + )], + "{env}" + ); + fx.ok(&["vendor", "--revert"]); + assert_eq!(fx.snapshot(), pristine, "first={}", first.artifact); + } +} + +/// A patch update (same GAV, new uuid) replaces the pin, sweeps the old +/// tree and reverts to pristine. +#[test] +fn vendor_patch_update_replaces_the_pin_and_sweeps() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let pristine = fx.snapshot(); + fx.ok(&["vendor"]); + let manifest_path = fx.proj().join(".socket/manifest.json"); + let manifest = std::fs::read_to_string(&manifest_path).unwrap(); + std::fs::write( + &manifest_path, + manifest.replace(GSON_UUID, GSON_UPDATE_UUID), + ) + .unwrap(); + let env = fx.ok(&["vendor"]); + assert!( + events(&env) + .iter() + .any(|(_, _, code)| code == "vendor_stale_artifact_removed"), + "{env}" + ); + assert!(!fx.proj().join(GSON_TREE).exists()); + let text = fx.generated(); + assert!(!text.contains("1d3c1fd2"), "{text}"); + assert!(text.contains("2.8.9-socket.2e4d6f80"), "{text}"); + fx.ok(&["vendor", "--check"]); + fx.ok(&["vendor", "--revert"]); + assert_eq!(fx.snapshot(), pristine); +} + +/// `vendor --check` is read-only and catches an edited generated file, a +/// tampered tree file and a deleted generated file; a re-run with the +/// jar source gone needs none, and `repair` rebuilds a deleted tree jar. +#[test] +fn vendor_check_drift_rerun_and_repair() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let pristine = fx.snapshot(); + fx.ok(&["vendor"]); + fx.sbt_update(&[(GSON, GSON_UUID)]); + let good = fx.generated(); + let path = fx.proj().join(VENDORED_FILE); + let jar_path = fx.proj().join(GSON_JAR); + let good_jar = std::fs::read(&jar_path).unwrap(); + for (what, tamper) in [("edited file", 0), ("tampered jar", 1), ("deleted file", 2)] { + match tamper { + 0 => std::fs::write(&path, good.replace("// socket-patch ", "// mine ")).unwrap(), + 1 => std::fs::write(&jar_path, jar(b"EVIL\n")).unwrap(), + _ => std::fs::remove_file(&path).unwrap(), + } + let corrupt = fx.snapshot(); + let (code, env) = fx.run(&["vendor", "--check"]); + assert_eq!(code, Some(1), "{what}: {env}"); + assert_eq!(fx.snapshot(), corrupt, "{what}: --check wrote"); + std::fs::write(&path, &good).unwrap(); + std::fs::write(&jar_path, &good_jar).unwrap(); + } + fx.ok(&["vendor", "--check"]); + + let cache = fx.home.coursier_cache(); + let parked = tmp.path().join("coursier-parked"); + std::fs::rename(&cache, &parked).unwrap(); + let env = fx.ok(&["vendor"]); + assert_eq!( + events(&env), + [( + GSON.purl(), + "skipped".to_string(), + "already_vendored".to_string() + )], + "{env}" + ); + std::fs::rename(&parked, &cache).unwrap(); + std::fs::remove_file(&jar_path).unwrap(); + let env = fx.ok(&["repair"]); + assert_eq!(env["events"][0]["action"], "rebuilt", "{env}"); + assert_eq!(std::fs::read(&jar_path).unwrap(), good_jar); + fx.ok(&["vendor", "--revert"]); + assert_eq!(fx.snapshot(), pristine); +} + +/// A generated file left without its ledger, tree or manifest patch is an +/// orphan for `vendor --check`: the build would fail at load. +#[test] +fn vendor_check_flags_a_ledgerless_generated_file() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + fx.ok(&["vendor"]); + std::fs::remove_file(fx.proj().join(".socket/vendor/state.json")).unwrap(); + std::fs::remove_dir_all(fx.proj().join(".socket/vendor/maven2")).unwrap(); + // No manifest patch either, so only the generated file can trip it. + std::fs::write( + fx.proj().join(".socket/manifest.json"), + "{\"patches\":{}}\n", + ) + .unwrap(); + let before = fx.snapshot(); + let (code, env) = fx.run(&["vendor", "--check"]); + assert_eq!(code, Some(1), "{env}"); + assert!(env.to_string().contains("vendor_ledger_missing"), "{env}"); + assert_eq!(fx.snapshot(), before); +} + +/// A forged sbt ledger entry naming a user file (or escaping the checkout) +/// is refused before any write. +#[test] +fn vendor_forged_ledger_touches_nothing() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let proj = fx.proj(); + let build = std::fs::read(proj.join("build.sbt")).unwrap(); + for (file, kind) in [ + ("build.sbt", "sbt_build_fragment"), + ("project/build.properties", "jvm_owned_file"), + ("../outside.sbt", "sbt_build_fragment"), + ] { + let state = serde_json::json!({ "version": 1, "entries": { GSON.purl(): { + "ecosystem": "jvm", "basePurl": GSON.purl(), "uuid": GSON_UUID, + "artifact": { "path": GSON_JAR, "sha256": "" }, + "wiring": [{ "file": file, "kind": kind, "action": "added", "key": "file", + "new": { "op": "create" } }], + } } }); + std::fs::create_dir_all(proj.join(".socket/vendor")).unwrap(); + std::fs::write(proj.join(".socket/vendor/state.json"), state.to_string()).unwrap(); + let before = fx.snapshot(); + let (code, env) = fx.run(&["vendor", "--revert"]); + assert_ne!(code, Some(0), "{file}: {env}"); + assert_eq!(fx.snapshot(), before, "{file}"); + assert_eq!(std::fs::read(proj.join("build.sbt")).unwrap(), build); + assert!(proj.join("project/build.properties").is_file()); + assert!(!tmp.path().join("outside.sbt").exists()); + } +} + +/// The generated file or the tree symlinked out of the checkout is refused +/// with `build_file_outside_root`, and nothing is written through it. +#[cfg(unix)] +#[test] +fn vendor_escaping_symlinks_are_refused() { + for link in [VENDORED_FILE, ".socket/vendor"] { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let outside = tmp.path().join("outside"); + std::fs::create_dir_all(&outside).unwrap(); + let target = if link == VENDORED_FILE { + outside.join("x.sbt") + } else { + outside.clone() + }; + std::os::unix::fs::symlink(&target, fx.proj().join(link)).unwrap(); + let (code, env) = fx.run(&["vendor"]); + assert_ne!(code, Some(0), "{link}: {env}"); + assert_eq!( + env["events"][0]["errorCode"], "vendor_jvm_shape_unsupported", + "{link}: {env}" + ); + assert!( + env["events"][0]["error"] + .as_str() + .unwrap_or_default() + .starts_with("reason: build_file_outside_root: "), + "{link}: {env}" + ); + assert_eq!( + std::fs::read_dir(&outside).unwrap().count(), + 0, + "{link}: wrote outside the checkout" + ); + } +} + +/// Vendoring from a subproject directory refuses with `not_build_root`, +/// naming the build root. +#[test] +fn vendor_subproject_refuses_not_build_root() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::at(tmp.path(), "b", &[(GSON, GSON_UUID)]); + std::fs::write(fx.proj().join("b/build.sbt"), "name := \"b\"\n").unwrap(); + let before = fx.snapshot(); + let (code, env) = fx.run_in("b", &["vendor"]); + assert_ne!(code, Some(0), "{env}"); + assert_eq!( + env["events"][0]["errorCode"], "vendor_jvm_shape_unsupported", + "{env}" + ); + let error = env["events"][0]["error"].as_str().unwrap_or_default(); + assert!( + error.starts_with("reason: not_build_root: run vendor from sbt build root"), + "{env}" + ); + assert_eq!(fx.snapshot(), before); +} + +/// Build edits that would defeat the pin, an ambiguous root and a hosted +/// pin of the same GA refuse before any write. +#[test] +fn vendor_refusals_write_nothing() { + for (case, code) in [ + ("overrides", "vendor_sbt_overrides_assignment"), + ("resolvers", "vendor_sbt_resolvers_assignment"), + ("lock", "vendor_sbt_dependency_lock_present"), + ("gradle", "vendor_jvm_build_ambiguous"), + ("reactor", "vendor_jvm_build_ambiguous"), + ("foreign", "vendor_sbt_owned_file_foreign"), + ("old", "vendor_sbt_unsupported_version"), + ] { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let proj = fx.proj(); + let append = |line: &str| { + let mut text = std::fs::read_to_string(proj.join("build.sbt")).unwrap(); + text.push_str(line); + std::fs::write(proj.join("build.sbt"), text).unwrap(); + }; + match case { + "overrides" => append("ThisBuild / dependencyOverrides := Seq.empty\n"), + "resolvers" => append("ThisBuild / resolvers := Seq.empty\n"), + "lock" => std::fs::write(proj.join("build.sbt.lock"), "{}\n").unwrap(), + "gradle" => std::fs::write(proj.join("build.gradle"), "").unwrap(), + "reactor" => std::fs::write( + proj.join("pom.xml"), + "a\n", + ) + .unwrap(), + "foreign" => std::fs::write(proj.join(VENDORED_FILE), "// my settings\n").unwrap(), + _ => std::fs::write( + proj.join("project/build.properties"), + "sbt.version=0.13.17\n", + ) + .unwrap(), + } + let before = fx.snapshot(); + let (exit, env) = fx.run(&["vendor"]); + assert_eq!(exit, Some(1), "{case}: {env}"); + assert_eq!(env["events"][0]["errorCode"], code, "{case}: {env}"); + assert_eq!(fx.snapshot(), before, "{case}"); + } +} + +/// With no resolution evidence the run warns once, wires nothing and +/// still exits 0 (the evidence gate, `vendor/jvm/sbt_gate.rs`). +#[test] +fn vendor_no_evidence_warns_and_exits_zero() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + for path in files_under(&fx.proj()) { + if path.to_string_lossy().contains("target") { + std::fs::remove_file(path).unwrap(); + } + } + let before = fx.snapshot(); + let env = fx.ok(&["vendor"]); + assert!( + env.to_string() + .contains("vendor_sbt_no_resolution_evidence"), + "{env}" + ); + // Skipped with the gate's code: nothing was vendored, so nothing is + // counted applied. + assert_eq!(env["summary"]["applied"], 0, "{env}"); + assert!( + events(&env).contains(&( + GSON.purl(), + "skipped".to_string(), + "vendor_sbt_no_resolution_evidence".to_string() + )), + "{env}" + ); + assert!(!fx.proj().join(VENDORED_FILE).exists()); + let mut after = fx.snapshot(); + after.retain(|k, _| !k.starts_with(".socket/vendor")); + let mut before = before; + before.retain(|k, _| !k.starts_with(".socket/vendor")); + assert_eq!(after, before); +} + +/// The hosted `socket-patch.sbt` pinning gson (`uuid`), as `get --mode +/// hosted` writes it. +fn write_hosted_pin(proj: &Path, uuid: &str) -> Vec { + let sv = format!("{}-socket.{}", GSON.version, &uuid[..8]); + let pin = SbtPin { + uuid: uuid.into(), + group: GSON.group.into(), + artifact: GSON.artifact.into(), + base: GSON.version.into(), + sv, + pom_sha256: "a".repeat(64), + jar_sha256: "b".repeat(64), + deps_digest: "0123abcd".into(), + index_url: Some(format!( + "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/{uuid}/maven2" + )), + }; + let text = render(&SbtOwnedFile { + mode: SbtFileMode::Hosted, + line: SbtLine::Sbt1, + crlf: false, + pins: [(uuid.to_string(), pin)].into(), + }) + .unwrap(); + std::fs::write(proj.join(HOSTED_FILE), &text).unwrap(); + text.into_bytes() +} + +fn drop_evidence(proj: &Path) { + for path in files_under(proj) { + if path.to_string_lossy().contains("target") { + std::fs::remove_file(path).unwrap(); + } + } +} + +/// A takeover (vendoring over a hosted pin) the vendored gate would skip +/// (no evidence: a fresh clone) is refused BEFORE the hosted pin is +/// restored: the project stays hosted, never neither hosted nor vendored. +#[test] +fn vendor_takeover_the_gate_would_skip_keeps_the_hosted_pin() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let hosted = write_hosted_pin(&fx.proj(), GSON_UUID); + drop_evidence(&fx.proj()); + let (exit, env) = fx.run(&["vendor"]); + assert_eq!(exit, Some(1), "{env}"); + assert!( + events(&env).contains(&( + GSON.purl(), + "failed".to_string(), + "vendor_sbt_no_resolution_evidence".to_string() + )), + "{env}" + ); + assert_eq!(std::fs::read(fx.proj().join(HOSTED_FILE)).unwrap(), hosted); + assert!(!fx.proj().join(VENDORED_FILE).exists()); +} + +/// A dry-run takeover previews (the restore is dry, so the hosted file +/// still pins the GA on disk; the planner's hosted-conflict refusal the wet +/// run never sees is not raised), and the wet run takes over. +#[test] +fn vendor_takeover_of_a_hosted_sbt_pin_dry_and_wet() { + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + let hosted = write_hosted_pin(&fx.proj(), GSON_UUID); + let env = fx.ok(&["vendor", "--dry-run"]); + assert!( + env.to_string().contains("vendor_would_revert_redirect"), + "{env}" + ); + assert!( + !env.to_string().contains("vendor_sbt_hosted_conflict"), + "{env}" + ); + assert_eq!(std::fs::read(fx.proj().join(HOSTED_FILE)).unwrap(), hosted); + let env = fx.ok(&["vendor"]); + assert!( + env.to_string() + .contains("vendor_takeover_reverted_redirect"), + "{env}" + ); + assert!(!fx.proj().join(HOSTED_FILE).exists(), "{env}"); + assert!(fx.generated().contains(GSON_UUID)); +} + +/// An eject (plain `vendor` in a hosted project) the vendored gate would +/// skip is refused whole before anything is restored. +#[test] +fn vendor_eject_the_gate_would_skip_is_refused() { + use wiremock::matchers::{method, path}; + use wiremock::{Mock, MockServer, ResponseTemplate}; + let tmp = tempfile::tempdir().unwrap(); + let fx = Fixture::new(tmp.path(), &[(GSON, GSON_UUID)]); + std::fs::remove_file(fx.proj().join(".socket/manifest.json")).unwrap(); + let hosted = write_hosted_pin(&fx.proj(), GSON_UUID); + drop_evidence(&fx.proj()); + let rt = tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) + .enable_all() + .build() + .unwrap(); + let server = rt.block_on(MockServer::start()); + let view = serde_json::json!({ + "uuid": GSON_UUID, "purl": GSON.purl(), "publishedAt": "2024-01-01T00:00:00Z", + "files": { MEMBER: { + "beforeHash": git_sha256(b"NOTICE gson\n"), + "afterHash": git_sha256(b"NOTICE gson\nPATCHED\n"), + } }, + "vulnerabilities": {}, "description": "x", "license": "MIT", "tier": "free", + }); + rt.block_on( + Mock::given(method("GET")) + .and(path(format!("/v0/orgs/test-org/patches/view/{GSON_UUID}"))) + .respond_with(ResponseTemplate::new(200).set_body_json(view)) + .mount(&server), + ); + let uri = server.uri(); + let (exit, env) = fx.run(&[ + "vendor", + "--api-url", + &uri, + "--org", + "test-org", + "--api-token", + "fake", + ]); + assert_eq!(exit, Some(1), "{env}"); + assert_eq!(env["error"]["code"], "eject_refused", "{env}"); + assert!( + events(&env).contains(&( + GSON.purl(), + "failed".to_string(), + "vendor_sbt_no_resolution_evidence".to_string() + )), + "{env}" + ); + assert_eq!(std::fs::read(fx.proj().join(HOSTED_FILE)).unwrap(), hosted); + assert!(!fx.proj().join(VENDORED_FILE).exists()); +} diff --git a/crates/socket-patch-cli/tests/e2e_sbt_vendor_build.rs b/crates/socket-patch-cli/tests/e2e_sbt_vendor_build.rs new file mode 100644 index 000000000..a6cba5e41 --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_sbt_vendor_build.rs @@ -0,0 +1,629 @@ +//! Real-sbt capstones for the vendored sbt backend (`vendor/jvm/sbt.rs`, +//! `docs/design/sbt-support.md` §5, §8.4). +//! +//! Each test writes a Java-only sbt build (`autoScalaLibrary := false`, +//! `crossPaths := false`) depending on `commons-text:1.10.0` (which pulls +//! `commons-lang3:3.12.0`), warms it with a real `sbt update` (the +//! installed packages are what sbt cached: the agent crawler finds them in +//! the test home's Coursier or Ivy cache), stages a marker patch on the +//! jar's `META-INF/NOTICE.txt` (manifest + blob), and runs the real +//! binary's `vendor --json --offline`. Then: +//! +//! * `offline_fresh_checkout` — a fresh copy of the committable files +//! resolves the suffixed jar with the network blocked (an unreachable +//! proxy), and the classpath jar carries the patched member; +//! * `tamper_fails_load` — a tampered tree jar fails the build at load with +//! the generated file's `socket-patch:` message; +//! * `check_detects_drift` — `vendor --check` passes in sync and fails on an +//! edited generated file; +//! * `two_patches_revert_any_order_byte_exact` — both GAs resolve patched; +//! rolling back either leaves the other patched, and `vendor --revert` +//! restores every committable byte, in both orders; +//! * `rerun_noop` — a re-run is `already_vendored` and writes nothing; +//! * `declared_bump_fails_closed` — declaring the vendored GA newer than +//! the patch's base fails the load-time check, and a re-vendor refuses; +//! * `subproject_refused` — vendoring from a subproject is `not_build_root`; +//! * `gitignore_jar_fresh_clone` — a user `*.jar` ignore rule does not drop +//! the vendored jars from a `git clone`, which builds patched offline. +//! +//! Gated like the other real-toolchain capstones: `#[ignore]` (network to +//! Maven Central for the warm-up), sbt via `SOCKET_PATCH_SBT_E2E_{SBT, +//! VERSION,REQUIRED,SEED}` (`sbt_vendor_build_common`). Scratch trees go +//! under `TMPDIR`. + +#[path = "maven_build_common/mod.rs"] +mod maven_build_common; +#[path = "prebuilt_common/mod.rs"] +mod prebuilt_common; +#[path = "sbt_vendor_build_common/mod.rs"] +mod sbt_vendor_build_common; + +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use maven_build_common::{jar_member, patched_member, MARKER, MEMBER}; +use sbt_vendor_build_common::{dump, ok, write_build, Sbt, SbtHome, BUILD_OUTPUT_DIRS}; + +const TEXT: (&str, &str, &str) = ("org.apache.commons", "commons-text", "1.10.0"); +const LANG3: (&str, &str, &str) = ("org.apache.commons", "commons-lang3", "3.12.0"); +const TEXT_UUID: &str = "1d3c1fd2-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const LANG3_UUID: &str = "9a8b7c6d-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const TEXT_DEP: &str = "\"org.apache.commons\" % \"commons-text\" % \"1.10.0\""; +const VENDORED_FILE: &str = "socket-patch-vendor.sbt"; +/// Every outbound connection of an sbt run fails (Coursier and Ivy honour +/// the JVM proxy properties). +const NO_NETWORK: &[&str] = &[ + "-Dhttp.proxyHost=127.0.0.1", + "-Dhttp.proxyPort=9", + "-Dhttps.proxyHost=127.0.0.1", + "-Dhttps.proxyPort=9", +]; + +fn purl((g, a, v): (&str, &str, &str)) -> String { + format!("pkg:maven/{g}/{a}@{v}") +} + +fn hex8(uuid: &str) -> &str { + &uuid[..8] +} + +fn git_sha256(bytes: &[u8]) -> String { + socket_patch_core::hash::git_sha256::compute_git_sha256_from_bytes(bytes) +} + +/// One warmed fixture: the build at `proj`, its isolated `home` (whose +/// Coursier / Ivy caches hold the installed packages, as sbt left them), +/// the download fixture's Maven2 `mirror`, and the patched member of each +/// GA. +struct Ctx { + _tmp: tempfile::TempDir, + root: PathBuf, + proj: PathBuf, + home: SbtHome, + mirror: PathBuf, + sbt: Sbt, + patched: BTreeMap>, +} + +/// Write, warm and stage the fixture; `None` when skipped. +fn setup( + suite: &str, + project_dir: &str, + subprojects: &[&str], + patches: &[((&str, &str, &str), &str)], +) -> Option { + let sbt = Sbt::detect(suite)?; + let tmp = tempfile::tempdir().unwrap(); + // Canonical, in the spelling Java accepts (no Windows verbatim prefix). + let root = sbt_vendor_build_common::shared::canonical(tmp.path()); + let proj = root.join("proj"); + write_build(&proj, &sbt.version, &[TEXT_DEP], subprojects); + for sub in subprojects { + std::fs::create_dir_all(proj.join(sub)).unwrap(); + std::fs::write( + proj.join(sub).join("build.sbt"), + format!("name := \"{sub}\"\n"), + ) + .unwrap(); + } + let home = SbtHome::new(&root); + let out = sbt.run(&proj, &home, &[], &["sbtVersion", "update"]); + if !ok(&out) { + let why = format!("warm-up `sbt update` failed:\n{}", dump(&out)); + sbt_vendor_build_common::skip(suite, &why); + return None; + } + assert!( + String::from_utf8_lossy(&out.stdout).contains(&sbt.version), + "the build does not report sbt {}:\n{}", + sbt.version, + dump(&out) + ); + // Only the download fixture serves from this Maven2 copy; vendoring + // finds the installed copy in sbt's own cache (`HOME`'s Coursier + // cache, or `~/.ivy2/cache` on 0.13 / 1.0–1.2) through the agent + // crawler, with an empty `MAVEN_REPO_LOCAL`. + let mirror = root.join("mirror"); + let manifest_root = if project_dir.is_empty() { + proj.clone() + } else { + proj.join(project_dir) + }; + let mut records = serde_json::Map::new(); + let mut patched = BTreeMap::new(); + std::fs::create_dir_all(manifest_root.join(".socket/blobs")).unwrap(); + for (gav @ (g, a, v), uuid) in patches { + let (jar, pom) = home + .cached(g, a, v) + .unwrap_or_else(|| panic!("{g}:{a}:{v} is not in the sbt caches")); + let dir = mirror.join(g.replace('.', "/")).join(a).join(v); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join(format!("{a}-{v}.jar")), &jar).unwrap(); + std::fs::write(dir.join(format!("{a}-{v}.pom")), &pom).unwrap(); + let (before, after) = patched_member(&jar, a); + std::fs::write( + manifest_root.join(".socket/blobs").join(git_sha256(&after)), + &after, + ) + .unwrap(); + records.insert( + purl(*gav), + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-01-01T00:00:00Z", + "files": { MEMBER: { + "beforeHash": git_sha256(&before), + "afterHash": git_sha256(&after), + } }, + "vulnerabilities": { "GHSA-vendor-sbt-real": { + "cves": ["CVE-2026-7204"], "summary": "s", "severity": "high", + "description": "d" + } }, + "description": "sbt vendored capstone", + "license": "Apache-2.0", + "tier": "free", + }), + ); + patched.insert(a.to_string(), after); + } + std::fs::write( + manifest_root.join(".socket/manifest.json"), + serde_json::to_string_pretty(&serde_json::json!({ "patches": records })).unwrap(), + ) + .unwrap(); + Some(Ctx { + _tmp: tmp, + root, + proj, + home, + mirror, + sbt, + patched, + }) +} + +impl Ctx { + /// `socket-patch --json --offline --cwd `; `(exit, envelope)`. + fn socket(&self, dir: &Path, args: &[&str]) -> (Option, serde_json::Value) { + let mut cmd = Command::new(env!("CARGO_BIN_EXE_socket-patch")); + for (k, _) in std::env::vars_os() { + let k = k.to_string_lossy().into_owned(); + if k.starts_with("SOCKET_") || k.starts_with("COURSIER_") { + cmd.env_remove(&k); + } + } + let full: Vec<&str> = args + .iter() + .copied() + .chain(["--json", "--offline", "--cwd", dir.to_str().unwrap()]) + .collect(); + let _fixture = prebuilt_common::prepare_command( + &mut cmd, + dir, + &full, + &[("MAVEN_REPO_LOCAL", self.mirror.to_str().unwrap())], + ); + let out = cmd + .current_dir(dir) + .env("SOCKET_TELEMETRY_DISABLED", "1") + .env("SOCKET_NO_CONFIG", "1") + .env("MAVEN_REPO_LOCAL", self.root.join("empty-m2")) + .env("HOME", &self.home.root) + .env("COURSIER_CACHE", self.home.coursier_cache()) + .env_remove("M2_HOME") + .env_remove("SBT_OPTS") + .env_remove("JAVA_OPTS") + .output() + .expect("run socket-patch"); + let stdout = String::from_utf8_lossy(&out.stdout).into_owned(); + let env = serde_json::from_str(&stdout).unwrap_or_else(|e| { + panic!( + "{args:?}: not JSON ({e})\n{stdout}\n{}", + String::from_utf8_lossy(&out.stderr) + ) + }); + (out.status.code(), env) + } + + fn ok(&self, args: &[&str]) -> serde_json::Value { + let (code, env) = self.socket(&self.proj, args); + assert_eq!(code, Some(0), "{args:?}: {env}"); + let failed = env["summary"].get("failed").unwrap_or(&env["failed"]); + assert_eq!(failed, 0, "{args:?}: {env}"); + env + } + + /// The compile classpath of the build at `dir`; `offline` blocks every + /// outbound connection. sbt 1.0–1.2 (Ivy) used to abort on the first + /// unreachable repository listed before the vendored resolver; the + /// generated file's installer now moves socket-patch's resolvers to the + /// front on the 0.13 and 1.x lines (`docs/design/sbt-template-probe.md`, + /// case o), so every line resolves the tree offline. + fn classpath(&self, dir: &Path, offline: bool) -> Vec { + let extra = if offline { NO_NETWORK } else { &[] }; + let out = self.sbt.run( + dir, + &self.home, + extra, + &["update", &self.sbt.classpath_command(None)], + ); + assert!( + ok(&out), + "sbt classpath in {}:\n{}", + dir.display(), + dump(&out) + ); + let cp = Sbt::classpath(&out, dir, &self.home); + assert!(!cp.is_empty(), "no classpath exported:\n{}", dump(&out)); + cp + } + + /// Assert `cp` resolves `a` at its suffixed version, carrying the + /// patched member (`patched`) or at the base version, pristine. + fn assert_resolves(&self, cp: &[PathBuf], (_, a, v): (&str, &str, &str), uuid: Option<&str>) { + let name = match uuid { + Some(u) => format!("{a}-{v}-socket.{}.jar", hex8(u)), + None => format!("{a}-{v}.jar"), + }; + let jar = cp + .iter() + .find(|p| p.file_name().is_some_and(|n| n.to_string_lossy() == name)) + // `name` embeds the patch uuid: name it, never print it (CodeQL + // rust/cleartext-logging). + .unwrap_or_else(|| { + let kind = if uuid.is_some() { + "patched" + } else { + "pristine" + }; + panic!("the {kind} {a}-{v} jar is not on the classpath: {cp:?}") + }); + let member = jar_member(&std::fs::read(jar).unwrap(), MEMBER).expect("NOTICE"); + let marked = String::from_utf8_lossy(&member).contains(MARKER); + assert_eq!( + marked, + uuid.is_some(), + "{}: patched={marked}", + jar.display() + ); + if uuid.is_some() { + assert_eq!(&member, &self.patched[a], "{}", jar.display()); + } + } +} + +/// Every committable file under `root` (build output, and the manifest and +/// blobs the tests stage, skipped). +fn snapshot(root: &Path) -> BTreeMap> { + fn walk(root: &Path, dir: &Path, out: &mut BTreeMap>) { + for entry in std::fs::read_dir(dir).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + let rel = path + .strip_prefix(root) + .unwrap() + .to_string_lossy() + .replace('\\', "/"); + let name = entry.file_name().to_string_lossy().into_owned(); + if entry.file_type().unwrap().is_dir() { + if !BUILD_OUTPUT_DIRS.contains(&name.as_str()) + && !BUILD_OUTPUT_DIRS.contains(&rel.as_str()) + && name != ".git" + && !rel.ends_with(".socket/blobs") + { + walk(root, &path, out); + } + continue; + } + if !rel.ends_with(".socket/manifest.json") { + out.insert(rel, std::fs::read(&path).unwrap()); + } + } + } + let mut out = BTreeMap::new(); + walk(root, root, &mut out); + out +} + +/// A copy of `proj`'s committable files at `dst`. +fn fresh_checkout(proj: &Path, dst: &Path) { + for (rel, bytes) in snapshot(proj) { + let path = dst.join(rel); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write(path, bytes).unwrap(); + } +} + +fn events(env: &serde_json::Value) -> Vec<(String, String, String)> { + env["events"] + .as_array() + .unwrap() + .iter() + .map(|e| { + let s = |k: &str| e[k].as_str().unwrap_or_default().to_string(); + (s("purl"), s("action"), s("errorCode")) + }) + .collect() +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_offline_fresh_checkout() { + let Some(ctx) = setup( + "sbt_vendor_offline_fresh_checkout", + "", + &[], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + let env = ctx.ok(&["vendor"]); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + assert!(ctx.proj.join(VENDORED_FILE).is_file()); + let fresh = ctx.root.join("fresh"); + fresh_checkout(&ctx.proj, &fresh); + assert!(!fresh.join("target").exists()); + let cp = ctx.classpath(&fresh, true); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); + ctx.assert_resolves(&cp, LANG3, None); +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_tamper_fails_load() { + let Some(ctx) = setup( + "sbt_vendor_tamper_fails_load", + "", + &[], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + ctx.ok(&["vendor"]); + let jar = ctx.proj.join(format!( + ".socket/vendor/maven2/org/apache/commons/commons-text/1.10.0-socket.{h}/\ + commons-text-1.10.0-socket.{h}.jar", + h = hex8(TEXT_UUID) + )); + let mut bytes = std::fs::read(&jar).unwrap(); + bytes.extend_from_slice(b"tampered"); + std::fs::write(&jar, bytes).unwrap(); + let out = ctx.sbt.run(&ctx.proj, &ctx.home, &[], &["update"]); + assert!( + !ok(&out), + "a tampered tree jar must fail the build:\n{}", + dump(&out) + ); + let text = format!( + "{}{}", + String::from_utf8_lossy(&out.stdout), + String::from_utf8_lossy(&out.stderr) + ); + assert!( + text.contains("socket-patch:") && text.contains("has sha256"), + "{}", + dump(&out) + ); +} + +/// A build that now declares the vendored GA newer than the patch's base +/// fails `update` at the generated file's load-time check (the override +/// would otherwise force it back down), and a re-vendor refuses the pin. +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_declared_bump_fails_closed() { + let Some(ctx) = setup( + "sbt_vendor_declared_bump_fails_closed", + "", + &[], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + ctx.ok(&["vendor"]); + let build_path = ctx.proj.join("build.sbt"); + let build = std::fs::read_to_string(&build_path).unwrap(); + let bumped = build.replace( + "\"commons-text\" % \"1.10.0\"", + "\"commons-text\" % \"1.11.0\"", + ); + assert_ne!(bumped, build); + std::fs::write(&build_path, &bumped).unwrap(); + let out = ctx.sbt.run(&ctx.proj, &ctx.home, &[], &["update"]); + let text = format!( + "{}{}", + String::from_utf8_lossy(&out.stdout), + String::from_utf8_lossy(&out.stderr) + ); + assert!( + !ok(&out) && text.contains("declares org.apache.commons:commons-text:1.11.0"), + "{}", + dump(&out) + ); + let (code, env) = ctx.socket(&ctx.proj, &["vendor"]); + assert_eq!(code, Some(1), "{env}"); + assert!( + events(&env) + .iter() + .any(|(_, action, code)| action == "failed" && code == "vendor_sbt_pin_declared_newer"), + "{env}" + ); + std::fs::write(&build_path, &build).unwrap(); + let cp = ctx.classpath(&ctx.proj, false); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_check_detects_drift() { + let Some(ctx) = setup( + "sbt_vendor_check_detects_drift", + "", + &[], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + ctx.ok(&["vendor"]); + let cp = ctx.classpath(&ctx.proj, false); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); + let before = snapshot(&ctx.proj); + ctx.ok(&["vendor", "--check"]); + assert_eq!(snapshot(&ctx.proj), before, "--check wrote"); + let path = ctx.proj.join(VENDORED_FILE); + let good = std::fs::read_to_string(&path).unwrap(); + std::fs::write(&path, format!("{good}// mine\n")).unwrap(); + let (code, env) = ctx.socket(&ctx.proj, &["vendor", "--check"]); + assert_eq!(code, Some(1), "{env}"); + std::fs::write(&path, good).unwrap(); + ctx.ok(&["vendor", "--check"]); +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_two_patches_revert_any_order_byte_exact() { + let Some(ctx) = setup( + "sbt_vendor_two_patches_revert_any_order_byte_exact", + "", + &[], + &[(TEXT, TEXT_UUID), (LANG3, LANG3_UUID)], + ) else { + return; + }; + let pristine = snapshot(&ctx.proj); + // `rollback` drops the rolled-back record from the manifest: restore + // the staged inputs before each order. + let manifest_path = ctx.proj.join(".socket/manifest.json"); + let manifest = std::fs::read(&manifest_path).unwrap(); + let blobs: Vec<(PathBuf, Vec)> = std::fs::read_dir(ctx.proj.join(".socket/blobs")) + .unwrap() + .map(|e| { + let p = e.unwrap().path(); + let bytes = std::fs::read(&p).unwrap(); + (p, bytes) + }) + .collect(); + for (first, other, other_uuid) in [(TEXT, LANG3, LANG3_UUID), (LANG3, TEXT, TEXT_UUID)] { + std::fs::write(&manifest_path, &manifest).unwrap(); + for (p, bytes) in &blobs { + std::fs::create_dir_all(p.parent().unwrap()).unwrap(); + std::fs::write(p, bytes).unwrap(); + } + let env = ctx.ok(&["vendor"]); + assert_eq!(env["summary"]["applied"], 2, "{env}"); + let cp = ctx.classpath(&ctx.proj, false); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); + ctx.assert_resolves(&cp, LANG3, Some(LANG3_UUID)); + ctx.ok(&["rollback", &purl(first)]); + let cp = ctx.classpath(&ctx.proj, false); + ctx.assert_resolves(&cp, first, None); + ctx.assert_resolves(&cp, other, Some(other_uuid)); + ctx.ok(&["vendor", "--revert"]); + assert_eq!(snapshot(&ctx.proj), pristine, "first={}", first.1); + } +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_rerun_noop() { + let Some(ctx) = setup("sbt_vendor_rerun_noop", "", &[], &[(TEXT, TEXT_UUID)]) else { + return; + }; + ctx.ok(&["vendor"]); + let cp = ctx.classpath(&ctx.proj, false); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); + let before = snapshot(&ctx.proj); + let env = ctx.ok(&["vendor"]); + assert_eq!( + events(&env), + [( + purl(TEXT), + "skipped".to_string(), + "already_vendored".to_string() + )], + "{env}" + ); + assert_eq!(snapshot(&ctx.proj), before); + let cp = ctx.classpath(&ctx.proj, true); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_subproject_refused() { + let Some(ctx) = setup( + "sbt_vendor_subproject_refused", + "sub", + &["sub"], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + let before = snapshot(&ctx.proj); + let (code, env) = ctx.socket(&ctx.proj.join("sub"), &["vendor"]); + assert_ne!(code, Some(0), "{env}"); + assert_eq!( + env["events"][0]["errorCode"], "vendor_jvm_shape_unsupported", + "{env}" + ); + assert!( + env["events"][0]["error"] + .as_str() + .unwrap_or_default() + .starts_with("reason: not_build_root: run vendor from sbt build root"), + "{env}" + ); + assert_eq!(snapshot(&ctx.proj), before); +} + +#[test] +#[ignore = "real sbt + network (SOCKET_PATCH_SBT_E2E_*)"] +fn sbt_vendor_gitignore_jar_fresh_clone() { + let Some(ctx) = setup( + "sbt_vendor_gitignore_jar_fresh_clone", + "", + &[], + &[(TEXT, TEXT_UUID)], + ) else { + return; + }; + std::fs::write(ctx.proj.join(".gitignore"), "*.jar\ntarget/\n").unwrap(); + ctx.ok(&["vendor"]); + let git = |cwd: &Path, args: &[&str]| { + let out = Command::new("git") + .current_dir(cwd) + .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]) + .args(["-c", "init.defaultBranch=main", "-c", "core.autocrlf=false"]) + .args(args) + .output() + .expect("git"); + assert!(out.status.success(), "git {args:?}: {}", dump(&out)); + }; + git(&ctx.proj, &["init", "-q"]); + git(&ctx.proj, &["add", "-A"]); + git(&ctx.proj, &["commit", "-q", "-m", "vendored"]); + let clone = ctx.root.join("clone"); + git( + &ctx.root, + &[ + "clone", + "-q", + ctx.proj.to_str().unwrap(), + clone.to_str().unwrap(), + ], + ); + let jar = format!( + ".socket/vendor/maven2/org/apache/commons/commons-text/1.10.0-socket.{h}/\ + commons-text-1.10.0-socket.{h}.jar", + h = hex8(TEXT_UUID) + ); + // `jar` embeds the patch uuid: name it, never print it (CodeQL + // rust/cleartext-logging). + assert!( + clone.join(&jar).is_file(), + "the clone lost the vendored commons-text jar" + ); + let cp = ctx.classpath(&clone, true); + ctx.assert_resolves(&cp, TEXT, Some(TEXT_UUID)); +} diff --git a/crates/socket-patch-cli/tests/e2e_scala_cli_vendor.rs b/crates/socket-patch-cli/tests/e2e_scala_cli_vendor.rs new file mode 100644 index 000000000..8c51648b6 --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_scala_cli_vendor.rs @@ -0,0 +1,876 @@ +//! Vendored scala-cli directory builds (`docs/design/sbt-support.md`, +//! "scala-cli vendored"): the owned root `socket-patch.scala`, the guard +//! inside `.socket/vendor/coursier/` and the same-GAV Coursier tree. +//! +//! Two groups: +//! +//! * **Hermetic** (default): a synthetic scala-cli project with the Bloop +//! evidence scala-cli 1.17.1 writes (`.scala-build/.bloop/

.json`) and a +//! fake local Maven repository as the installed copy. They pin the owned +//! bytes, the ledger round trip (vendor, re-run, `--check`, two patches +//! reverted in either order, byte-exact), the gate's run-level skips and +//! refusals, and a forged ledger. +//! * **Real tool** (`#[ignore]`, `scala_cli_vendor_*`): the real scala-cli +//! resolves `org.apache.commons:commons-text:1.10.0`, the CLI vendors a +//! marker patch of its `pom.properties` (a code-only edit is stale until +//! compiled, then current again), and the build then sees it from +//! the project directory and from `/`, in `package --assembly`, and in a +//! fresh clone whose `.gitignore` drops `*.jar`; deleting the tree fails +//! the build (`File not found`), and revert restores every byte. The +//! installed copy vendoring reads is the Coursier-cached jar copied into +//! the isolated local Maven repository. Env: +//! `SOCKET_PATCH_SCALA_CLI_E2E_BIN` (default `scala-cli` on `PATH`), +//! `SOCKET_PATCH_SCALA_CLI_E2E_REQUIRED` (no SKIP), and +//! `SOCKET_PATCH_SCALA_CLI_E2E_CACHE` (a shared Coursier cache; default +//! under `TMPDIR`). Network to Maven Central. Run in the sbt docker image +//! (`tests/docker/Dockerfile.sbt`) or any host with a JDK 17 and git. + +#![cfg_attr(windows, allow(dead_code, unused_imports))] + +#[path = "prebuilt_common/mod.rs"] +mod prebuilt_common; + +#[path = "sbt_common/mod.rs"] +mod sbt_common; + +use std::collections::BTreeMap; +use std::io::Write as _; +use std::path::{Path, PathBuf}; +use std::process::Command; +use std::time::{Duration, SystemTime}; + +use sbt_common::{write_coursier_artifact, Gav, SbtHome}; + +const FOO_UUID: &str = "1d3c1fd2-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const BAR_UUID: &str = "9a8b7c6d-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const MEMBER: &str = "META-INF/NOTICE.txt"; +const CENTRAL: &str = "repo1.maven.org/maven2"; +const ROOT_FILE: &str = "socket-patch.scala"; +const GUARD: &str = ".socket/vendor/coursier/socket-patch.scala"; +const ROOT_BYTES: &str = + "// managed by socket-patch\n//> using file .socket/vendor/coursier/socket-patch.scala\n"; +const GUARD_BYTES: &str = "// managed by socket-patch\n//> using repository file://${.}\n"; +const INDEX: &str = ".socket/vendor/coursier-index.tsv"; + +fn git_sha256(bytes: &[u8]) -> String { + socket_patch_core::hash::git_sha256::compute_git_sha256_from_bytes(bytes) +} + +fn purl(name: &str) -> String { + format!("pkg:maven/org.example/{name}@1.0") +} + +fn jar(entries: &[(&str, &[u8])]) -> Vec { + let mut zw = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); + let opts = zip::write::SimpleFileOptions::default(); + for (name, bytes) in entries { + zw.start_file(*name, opts).unwrap(); + zw.write_all(bytes).unwrap(); + } + zw.finish().unwrap().into_inner() +} + +fn write(path: &Path, bytes: impl AsRef<[u8]>) { + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write(path, bytes).unwrap(); +} + +fn set_mtime(path: &Path, t: SystemTime) { + std::fs::File::options() + .write(true) + .open(path) + .unwrap() + .set_modified(t) + .unwrap(); +} + +/// The manifest record + after-hash blob `get` saves for a patch of +/// `member` (so `vendor --offline` needs no network). +fn manifest_record( + proj: &Path, + uuid: &str, + before: &[u8], + after: &[u8], + member: &str, +) -> serde_json::Value { + write(&proj.join(".socket/blobs").join(git_sha256(after)), after); + serde_json::json!({ + "uuid": uuid, + "exportedAt": "2026-01-01T00:00:00Z", + "files": { member: { + "beforeHash": git_sha256(before), + "afterHash": git_sha256(after), + } }, + "vulnerabilities": { "GHSA-xxxx-yyyy-zzzz": { + "cves": ["CVE-2026-0001"], "summary": "s", "severity": "high", "description": "d" + } }, + "description": "scala-cli vendored fixture", + "license": "MIT", + "tier": "free", + }) +} + +/// The Bloop project file scala-cli 1.17.1 writes (only the fields read). +fn bloop_json( + workspace: &Path, + sources: &[PathBuf], + modules: &[(String, String, String, PathBuf)], +) -> String { + let mods: Vec = modules + .iter() + .map(|(g, a, v, path)| { + serde_json::json!({ "organization": g, "name": a, "version": v, + "artifacts": [{ "name": a, "path": path }] }) + }) + .collect(); + serde_json::json!({ "version": "1.4.0", "project": { + "name": "proj_0123456789", "directory": workspace.join(".scala-build"), + "workspaceDir": workspace, "sources": sources, "dependencies": [], "classpath": [], + "resolution": { "modules": mods }, "tags": ["library"], + } }) + .to_string() +} + +/// `root/{sbt-home,proj}`: a scala-cli project (`project.scala`, +/// `main.scala`) depending on every `(name, uuid)` package, each installed +/// in the isolated Coursier cache, with Bloop evidence resolving +/// them at `evidence_version` (default 1.0) and newer than every source. +fn fixture(root: &Path, packages: &[(&str, &str)], evidence_version: Option<&str>) -> SbtHome { + let home = SbtHome::new(root); + let proj = root.join("proj"); + let mut patches = serde_json::Map::new(); + let mut modules = Vec::new(); + for (name, uuid) in packages { + // Installed where scala-cli leaves it: the Coursier cache the agent + // crawler finds through `COURSIER_CACHE`. + let before = format!("NOTICE {name}\n").into_bytes(); + let after = [before.as_slice(), b"PATCHED\n"].concat(); + let gav = Gav { + group: "org.example", + artifact: name, + version: "1.0", + }; + let dir = write_coursier_artifact( + &home.coursier_cache(), + CENTRAL, + gav, + &jar(&[ + ("META-INF/MANIFEST.MF", b"Manifest-Version: 1.0\n"), + (MEMBER, &before), + ]), + ); + let jar_path = dir.join(format!("{name}-1.0.jar")); + patches.insert( + purl(name), + manifest_record(&proj, uuid, &before, &after, MEMBER), + ); + modules.push(( + "org.example".to_string(), + name.to_string(), + evidence_version.unwrap_or("1.0").to_string(), + jar_path, + )); + } + write( + &proj.join(".socket/manifest.json"), + serde_json::to_string_pretty(&serde_json::json!({ "patches": patches })).unwrap(), + ); + let deps: String = packages + .iter() + .map(|(name, _)| format!("//> using dep org.example:{name}:1.0\n")) + .collect(); + write( + &proj.join("project.scala"), + format!("//> using scala 3.3.6\n{deps}"), + ); + write( + &proj.join("main.scala"), + "@main def m() = println(\"hi\")\n", + ); + let ws = proj.canonicalize().unwrap(); + let sources = vec![ws.join("main.scala"), ws.join("project.scala")]; + let ev = ws.join(".scala-build/.bloop/proj_0123456789.json"); + write(&ev, bloop_json(&ws, &sources, &modules)); + let past = SystemTime::now() - Duration::from_secs(3600); + for s in &sources { + set_mtime(s, past); + } + set_mtime(&ev, past + Duration::from_secs(60)); + home +} + +/// `socket-patch --json --cwd /proj` in `home`'s isolated env; +/// `(exit, envelope)`. +fn socket(root: &Path, home: &SbtHome, args: &[&str]) -> (Option, serde_json::Value) { + socket_in_cache(root, home, args, &home.coursier_cache()) +} + +/// [`socket`] with `COURSIER_CACHE` at `cache` (the real-tool test reads +/// the cache scala-cli itself resolved into); the download fixture serves +/// its Central repository root. +fn socket_in_cache( + root: &Path, + home: &SbtHome, + args: &[&str], + cache: &Path, +) -> (Option, serde_json::Value) { + let mut cmd = Command::new(env!("CARGO_BIN_EXE_socket-patch")); + for (k, _) in std::env::vars_os() { + let k = k.to_string_lossy().into_owned(); + if k.starts_with("SOCKET_") || k.starts_with("COURSIER_") { + cmd.env_remove(&k); + } + } + for (k, v) in home.isolated_env() { + cmd.env(k, v); + } + cmd.env("COURSIER_CACHE", cache); + let proj = root.join("proj"); + let repo = fixture_mirror(root, &cache.join("https").join(CENTRAL)); + let _fixture = prebuilt_common::prepare_command( + &mut cmd, + &proj, + args, + &[("MAVEN_REPO_LOCAL", repo.to_str().unwrap())], + ); + let out = cmd + .args(["--json", "--cwd", proj.to_str().unwrap()]) + .env("SOCKET_TELEMETRY_DISABLED", "1") + .env("SOCKET_NO_CONFIG", "1") + .env_remove("M2_HOME") + .output() + .expect("run socket-patch"); + let stdout = String::from_utf8_lossy(&out.stdout).into_owned(); + let env = serde_json::from_str(&stdout).unwrap_or_else(|e| { + panic!( + "{args:?}: not JSON ({e})\n{stdout}\n{}", + String::from_utf8_lossy(&out.stderr) + ) + }); + (out.status.code(), env) +} + +/// The download fixture's Maven2 repository: only the version directories +/// of the manifest's Maven purls, copied from `central`. The fixture serves +/// (and holds in memory) every file of its repository, and a shared cache's +/// Central root (the image's, warmed for several tools) would not fit. +fn fixture_mirror(root: &Path, central: &Path) -> PathBuf { + let mirror = root.join("fixture-mirror"); + let manifest = std::fs::read(root.join("proj/.socket/manifest.json")) + .ok() + .and_then(|b| serde_json::from_slice::(&b).ok()); + let purls: Vec = manifest + .as_ref() + .and_then(|m| m["patches"].as_object()) + .map(|p| p.keys().cloned().collect()) + .unwrap_or_default(); + for purl in purls { + let Some(gav) = purl.strip_prefix("pkg:maven/") else { + continue; + }; + let gav = gav.split('?').next().unwrap_or_default(); + let Some((ga, v)) = gav.rsplit_once('@') else { + continue; + }; + let Some((g, a)) = ga.split_once('/') else { + continue; + }; + let rel = Path::new(&g.replace('.', "/")).join(a).join(v); + let Ok(entries) = std::fs::read_dir(central.join(&rel)) else { + continue; + }; + std::fs::create_dir_all(mirror.join(&rel)).unwrap(); + for entry in entries.flatten() { + if entry.file_type().is_ok_and(|t| t.is_file()) { + std::fs::copy(entry.path(), mirror.join(&rel).join(entry.file_name())).unwrap(); + } + } + } + std::fs::create_dir_all(&mirror).unwrap(); + mirror +} + +fn ok(root: &Path, home: &SbtHome, args: &[&str]) -> serde_json::Value { + let (code, env) = socket(root, home, args); + assert_eq!(code, Some(0), "{args:?}: {env}"); + let failed = env["summary"].get("failed").unwrap_or(&env["failed"]); + assert_eq!(failed, 0, "{args:?}: {env}"); + env +} + +/// Every `code` / `errorCode` string anywhere in the envelope. +fn codes(env: &serde_json::Value) -> Vec { + fn walk(v: &serde_json::Value, out: &mut Vec) { + match v { + serde_json::Value::Object(m) => { + for (k, v) in m { + if k == "code" || k == "errorCode" { + if let Some(s) = v.as_str() { + out.push(s.to_string()); + } + } + walk(v, out); + } + } + serde_json::Value::Array(a) => a.iter().for_each(|v| walk(v, out)), + _ => {} + } + } + let mut out = Vec::new(); + walk(env, &mut out); + out +} + +/// Every file under `proj`, minus the manifest, blobs and `.scala-build` +/// (the inputs the tests stage). +fn snapshot(root: &Path) -> BTreeMap>> { + fn walk(base: &Path, dir: &Path, out: &mut BTreeMap>>) { + for entry in std::fs::read_dir(dir).unwrap() { + let path = entry.unwrap().path(); + let rel = path + .strip_prefix(base) + .unwrap() + .to_string_lossy() + .replace('\\', "/"); + if [ + ".socket/manifest.json", + ".socket/blobs", + ".scala-build", + ".git", + ] + .contains(&rel.as_str()) + { + continue; + } + if std::fs::symlink_metadata(&path).unwrap().is_dir() { + out.insert(format!("{rel}/"), None); + walk(base, &path, out); + } else { + out.insert(rel, Some(std::fs::read(&path).unwrap())); + } + } + } + let proj = root.join("proj"); + let mut out = BTreeMap::new(); + walk(&proj, &proj, &mut out); + out +} + +#[cfg(not(windows))] +mod hermetic { + use super::*; + + #[test] + fn vendor_wires_owned_files_and_reverts_byte_exact() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + let pristine = snapshot(root); + let env = ok(root, &home, &["vendor"]); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + assert!( + codes(&env).contains(&"vendor_scala_cli_directives_split".to_string()), + "{env}" + ); + let proj = root.join("proj"); + assert_eq!( + std::fs::read_to_string(proj.join(ROOT_FILE)).unwrap(), + ROOT_BYTES + ); + assert_eq!( + std::fs::read_to_string(proj.join(GUARD)).unwrap(), + GUARD_BYTES + ); + assert_eq!( + std::fs::read_to_string(proj.join(".socket/vendor/coursier/.gitignore")).unwrap(), + "!*\n" + ); + let tree = proj.join(".socket/vendor/coursier/org/example/foo/1.0"); + let vendored = std::fs::read(tree.join("foo-1.0.jar")).unwrap(); + let mut zip = zip::ZipArchive::new(std::io::Cursor::new(vendored)).unwrap(); + let mut notice = String::new(); + std::io::Read::read_to_string(&mut zip.by_name(MEMBER).unwrap(), &mut notice).unwrap(); + assert_eq!(notice, "NOTICE foo\nPATCHED\n"); + for name in [ + "foo-1.0.pom", + "foo-1.0.jar.sha1", + "foo-1.0.pom.sha1", + "socket-patch.vendor.json", + ] { + assert!(tree.join(name).is_file(), "{name}"); + } + let index = std::fs::read_to_string(proj.join(INDEX)).unwrap(); + assert!( + index.starts_with("#socket-patch-coursier-index 1\n"), + "{index}" + ); + assert_eq!(index.matches(FOO_UUID).count(), 2, "{index}"); + // The user's files are never edited. + for f in ["project.scala", "main.scala"] { + assert_eq!(snapshot(root)[f], pristine[f]); + } + ok(root, &home, &["vendor", "--check"]); + ok(root, &home, &["vendor", "--revert"]); + assert_eq!(snapshot(root), pristine); + } + + #[test] + fn rerun_is_a_noop_and_check_detects_drift() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + ok(root, &home, &["vendor"]); + let wired = snapshot(root); + let env = ok(root, &home, &["vendor"]); + assert_eq!(env["summary"]["applied"], 0, "{env}"); + assert_eq!(snapshot(root), wired); + let proj = root.join("proj"); + let jar = proj.join(".socket/vendor/coursier/org/example/foo/1.0/foo-1.0.jar"); + let original = std::fs::read(&jar).unwrap(); + std::fs::write(&jar, b"tampered").unwrap(); + let (code, env) = socket(root, &home, &["vendor", "--check"]); + assert_eq!(code, Some(1), "{env}"); + std::fs::write(&jar, original).unwrap(); + ok(root, &home, &["vendor", "--check"]); + std::fs::remove_file(proj.join(GUARD)).unwrap(); + let (code, env) = socket(root, &home, &["vendor", "--check"]); + assert_eq!(code, Some(1), "a missing guard is drift: {env}"); + } + + #[test] + fn two_patches_roll_back_one_at_a_time_to_pristine() { + for first in ["foo", "bar"] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID), ("bar", BAR_UUID)], None); + let pristine = snapshot(root); + let env = ok(root, &home, &["vendor"]); + assert_eq!(env["summary"]["applied"], 2, "{env}"); + ok(root, &home, &["rollback", &purl(first)]); + let proj = root.join("proj"); + let other = if first == "foo" { "bar" } else { "foo" }; + let index = std::fs::read_to_string(proj.join(INDEX)).unwrap(); + assert!( + index.contains(&format!("org.example:{other}:1.0")), + "{index}" + ); + assert!( + !index.contains(&format!("org.example:{first}:1.0")), + "{index}" + ); + assert!(proj.join(ROOT_FILE).is_file() && proj.join(GUARD).is_file()); + ok(root, &home, &["vendor", "--check"]); + ok(root, &home, &["vendor", "--revert"]); + assert_eq!(snapshot(root), pristine, "first out: {first}"); + } + } + + #[test] + fn missing_or_stale_evidence_is_one_warning_and_exit_zero() { + for case in ["missing", "stale", "server-false"] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + let proj = root.join("proj"); + match case { + "missing" => std::fs::remove_dir_all(proj.join(".scala-build")).unwrap(), + // A `--server=false` build leaves `.scala-build` without `.bloop`. + "server-false" => { + std::fs::remove_dir_all(proj.join(".scala-build/.bloop")).unwrap() + } + _ => set_mtime(&proj.join("main.scala"), SystemTime::now()), + } + let before = snapshot(root); + let env = ok(root, &home, &["vendor"]); + let want = if case == "stale" { + "vendor_scala_cli_resolution_stale" + } else { + "vendor_scala_cli_resolution_missing" + }; + assert!(codes(&env).contains(&want.to_string()), "{case}: {env}"); + assert_eq!( + env["summary"]["applied"], 0, + "{case}: a skip is not applied: {env}" + ); + assert_eq!(snapshot(root), before, "{case}: nothing is written"); + } + } + + /// Once vendored, the committed tree keeps serving the patch: a fresh + /// clone (`.scala-build` is gitignored) or an uncompiled edit re-plans + /// it in sync, without a "not vendored" warning. + #[test] + fn a_vendored_gav_reruns_in_sync_without_fresh_evidence() { + for case in ["missing", "stale"] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + let proj = root.join("proj"); + let env = ok(root, &home, &["vendor"]); + assert_eq!(env["summary"]["applied"], 1, "{case}: {env}"); + match case { + "missing" => std::fs::remove_dir_all(proj.join(".scala-build")).unwrap(), + _ => set_mtime( + &proj.join("main.scala"), + SystemTime::now() + Duration::from_secs(3600), + ), + } + let env = ok(root, &home, &["vendor"]); + assert_eq!(env["summary"]["applied"], 0, "{case}: {env}"); + for code in [ + "vendor_scala_cli_resolution_missing", + "vendor_scala_cli_resolution_stale", + ] { + assert!(!codes(&env).contains(&code.to_string()), "{case}: {env}"); + } + ok(root, &home, &["vendor", "--check"]); + } + } + + #[test] + fn gate_refusals_write_nothing() { + for case in ["conflict", "directive", "modified"] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let version = (case == "conflict").then_some("1.1"); + let home = fixture(root, &[("foo", FOO_UUID)], version); + let proj = root.join("proj"); + match case { + "directive" => { + let p = proj.join("project.scala"); + let text = std::fs::read_to_string(&p).unwrap(); + std::fs::write(&p, format!("//> using repository central\n{text}")).unwrap(); + set_mtime(&p, SystemTime::now() - Duration::from_secs(3600)); + } + "modified" => write(&proj.join(ROOT_FILE), "object Main\n"), + _ => {} + } + let before = snapshot(root); + let (code, env) = socket(root, &home, &["vendor"]); + assert_eq!(code, Some(1), "{case}: {env}"); + let want = match case { + "conflict" => "vendor_scala_cli_version_conflict", + "directive" => "vendor_scala_cli_repository_shadowed", + _ => "vendor_scala_cli_owned_file_modified", + }; + assert!(codes(&env).contains(&want.to_string()), "{case}: {env}"); + assert_eq!(snapshot(root), before, "{case}: nothing is written"); + } + } + + /// A forged ledger entry naming a user file as a tree file is refused + /// before any write. + #[test] + fn forged_ledger_entries_touch_nothing() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + ok(root, &home, &["vendor"]); + let proj = root.join("proj"); + let state_path = proj.join(".socket/vendor/state.json"); + let mut state: serde_json::Value = + serde_json::from_str(&std::fs::read_to_string(&state_path).unwrap()).unwrap(); + let main = std::fs::read(proj.join("main.scala")).unwrap(); + let sha = { + use sha2::{Digest as _, Sha256}; + hex::encode(Sha256::digest(&main)) + }; + let entry = state["entries"] + .as_object_mut() + .unwrap() + .values_mut() + .next() + .unwrap(); + entry["wiring"].as_array_mut().unwrap().push( + serde_json::json!({ "file": "main.scala", "kind": "jvm_vendor_tree", + "action": "added", "new": sha }), + ); + std::fs::write(&state_path, state.to_string()).unwrap(); + let (code, env) = socket(root, &home, &["vendor", "--revert"]); + assert_ne!(code, Some(0), "{env}"); + assert_eq!(std::fs::read(proj.join("main.scala")).unwrap(), main); + assert!(proj.join(ROOT_FILE).is_file(), "nothing reverted"); + } +} + +#[cfg(windows)] +#[test] +fn windows_is_refused() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + let home = fixture(root, &[("foo", FOO_UUID)], None); + let before = snapshot(root); + let (code, env) = socket(root, &home, &["vendor"]); + assert_eq!(code, Some(1), "{env}"); + assert!( + codes(&env).contains(&"vendor_scala_cli_windows_unsupported".to_string()), + "{env}" + ); + assert_eq!(snapshot(root), before); +} + +// ── real scala-cli ───────────────────────────────────────────────────────── + +mod real_tool { + use super::*; + + const BIN_ENV: &str = "SOCKET_PATCH_SCALA_CLI_E2E_BIN"; + const REQUIRED_ENV: &str = "SOCKET_PATCH_SCALA_CLI_E2E_REQUIRED"; + const CACHE_ENV: &str = "SOCKET_PATCH_SCALA_CLI_E2E_CACHE"; + const PATCH_UUID: &str = "4c0f1a2b-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; + const GROUP_PATH: &str = "org/apache/commons"; + const ARTIFACT: &str = "commons-text"; + const VERSION: &str = "1.10.0"; + const MARKER: &str = "socket-patch-e2e-marker=true"; + /// A resource only commons-text ships, so neither the classpath order + /// nor an assembly merge can hide it. + const PROPS: &str = "META-INF/maven/org.apache.commons/commons-text/pom.properties"; + + /// The program: whether commons-text's `pom.properties` carries the + /// marker. + const MAIN_JAVA: &str = "public class Main {\n public static void main(String[] a) throws Exception {\n try (var in = Main.class.getResourceAsStream(\"/META-INF/maven/org.apache.commons/commons-text/pom.properties\")) {\n String s = new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8);\n System.out.println(\"PATCHED=\" + s.contains(\"socket-patch-e2e-marker\"));\n }\n }\n}\n"; + + fn scala_cli() -> Option { + let bin = std::env::var(BIN_ENV).unwrap_or_else(|_| "scala-cli".into()); + let found = Command::new(&bin) + .arg("version") + .output() + .is_ok_and(|o| o.status.success()); + if !found { + assert!( + std::env::var_os(REQUIRED_ENV).is_none(), + "{REQUIRED_ENV} is set but `{bin} version` failed" + ); + eprintln!("SKIP: scala-cli not found (set {BIN_ENV})"); + return None; + } + Some(bin) + } + + fn cache() -> PathBuf { + std::env::var_os(CACHE_ENV) + .map(PathBuf::from) + .unwrap_or_else(|| std::env::temp_dir().join("socket-patch-scala-cli-e2e-cache")) + } + + /// `scala-cli ` in `cwd`; `(success, stdout+stderr)`. + fn run(bin: &str, cwd: &Path, args: &[&str]) -> (bool, String) { + let mut cmd = Command::new(bin); + for (k, _) in std::env::vars_os() { + let k = k.to_string_lossy().into_owned(); + if k.starts_with("COURSIER_") || k == "JAVA_TOOL_OPTIONS" { + cmd.env_remove(&k); + } + } + let out = cmd + .args(args) + .current_dir(cwd) + .env("COURSIER_CACHE", cache()) + .output() + .expect("run scala-cli"); + let text = format!( + "{}{}", + String::from_utf8_lossy(&out.stdout), + String::from_utf8_lossy(&out.stderr) + ); + (out.status.success(), text) + } + + fn patched(bin: &str, cwd: &Path, input: &str) -> bool { + let (ok, out) = run(bin, cwd, &["run", input]); + assert!(ok, "scala-cli run {input}: {out}"); + if out.contains("PATCHED=true") { + return true; + } + assert!(out.contains("PATCHED=false"), "{out}"); + false + } + + fn member(jar: &[u8], name: &str) -> Vec { + let mut zip = zip::ZipArchive::new(std::io::Cursor::new(jar.to_vec())).unwrap(); + let mut out = Vec::new(); + std::io::Read::read_to_end(&mut zip.by_name(name).unwrap(), &mut out).unwrap(); + out + } + + /// `socket-patch ` reading scala-cli's own Coursier cache. + fn ok(root: &Path, home: &SbtHome, args: &[&str]) -> serde_json::Value { + let (code, env) = socket_in_cache(root, home, args, &cache()); + assert_eq!(code, Some(0), "{args:?}: {env}"); + let failed = env["summary"].get("failed").unwrap_or(&env["failed"]); + assert_eq!(failed, 0, "{args:?}: {env}"); + env + } + + /// A built project depending on commons-text (cached by scala-cli in + /// [`cache`], where vendoring finds the installed copy), and the marker + /// patch of [`PROPS`] staged. + fn project(bin: &str, root: &Path) -> SbtHome { + let home = SbtHome::new(root); + let proj = root.join("proj"); + write( + &proj.join("project.scala"), + format!("//> using dep org.apache.commons:{ARTIFACT}:{VERSION}\n"), + ); + write(&proj.join("Main.java"), MAIN_JAVA); + let (ok, out) = run(bin, &proj, &["compile", "."]); + assert!(ok, "scala-cli compile: {out}"); + assert!( + proj.join(".scala-build/.bloop").is_dir(), + "no Bloop evidence" + ); + // The installed copy vendoring reads is the one scala-cli cached: + // the agent crawler finds it through `COURSIER_CACHE` ([`ok`]). + let stem = format!("{ARTIFACT}-{VERSION}"); + let cached = walk_find(&cache(), &format!("{stem}.jar")).expect("jar in the cache"); + assert!( + cached.starts_with(cache().join("https").join(CENTRAL)), + "{}", + cached.display() + ); + let before = member(&std::fs::read(&cached).unwrap(), PROPS); + let after = [before.as_slice(), format!("{MARKER}\n").as_bytes()].concat(); + let record = manifest_record(&proj, PATCH_UUID, &before, &after, PROPS); + write( + &proj.join(".socket/manifest.json"), + serde_json::to_string_pretty(&serde_json::json!({ "patches": { + format!("pkg:maven/org.apache.commons/{ARTIFACT}@{VERSION}"): record } })) + .unwrap(), + ); + home + } + + fn walk_find(dir: &Path, name: &str) -> Option { + for e in std::fs::read_dir(dir).ok()?.flatten() { + let p = e.path(); + if p.is_dir() { + if let Some(found) = walk_find(&p, name) { + return Some(found); + } + } else if p.file_name().is_some_and(|n| n == name) + && p.to_string_lossy().contains("maven2") + { + return Some(p); + } + } + None + } + + fn git(cwd: &Path, args: &[&str]) { + let out = Command::new("git") + .args(args) + .current_dir(cwd) + .output() + .unwrap(); + assert!( + out.status.success(), + "git {args:?}: {}", + String::from_utf8_lossy(&out.stderr) + ); + } + + #[test] + #[ignore = "real scala-cli + network; see the module doc"] + fn scala_cli_vendor_patches_directory_builds_and_reverts() { + let Some(bin) = scala_cli() else { return }; + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path().canonicalize().unwrap(); + let home = project(&bin, &root); + let proj = root.join("proj"); + assert!(!patched(&bin, &proj, "."), "baseline"); + let pristine = snapshot(&root); + let env = ok(&root, &home, &["vendor", "--offline"]); + assert_eq!(env["summary"]["applied"], 1, "{env}"); + assert!(patched(&bin, &proj, "."), "from the project directory"); + assert!( + patched(&bin, Path::new("/"), proj.to_str().unwrap()), + "from /" + ); + // An in-sync re-run over the post-wiring evidence is a no-op. + let env = ok(&root, &home, &["vendor", "--offline"]); + assert_eq!(env["summary"]["applied"], 0, "{env}"); + ok(&root, &home, &["vendor", "--check"]); + // A code-only edit leaves the Bloop project file alone; once it is + // compiled the evidence is current again (dated by the compile). + std::thread::sleep(Duration::from_millis(1100)); + write(&proj.join("Main.java"), format!("{MAIN_JAVA}// edited\n")); + let stale = "vendor_scala_cli_resolution_stale".to_string(); + // The vendored GAV keeps being served: re-planned in sync, no + // "not vendored" skip. + let env = ok(&root, &home, &["vendor", "--offline"]); + assert!(!codes(&env).contains(&stale), "edited, not compiled: {env}"); + assert_eq!(env["summary"]["applied"], 0, "{env}"); + let (built, out) = run(&bin, &proj, &["compile", "--test", "."]); + assert!(built, "{out}"); + let env = ok(&root, &home, &["vendor", "--offline"]); + assert!( + !codes(&env).contains(&stale), + "edited, then compiled: {env}" + ); + assert_eq!(env["summary"]["applied"], 0, "{env}"); + write(&proj.join("Main.java"), MAIN_JAVA); + // package --assembly carries the patched bytes. + let assembly = root.join("app.jar"); + let (built, out) = run( + &bin, + &proj, + &[ + "--power", + "package", + ".", + "--assembly", + "-f", + "-o", + assembly.to_str().unwrap(), + ], + ); + assert!(built, "{out}"); + let bytes = std::fs::read(&assembly).unwrap(); + // The assembly is a launcher script with the jar appended. + let start = bytes + .windows(4) + .position(|w| w == b"PK\x03\x04") + .unwrap_or(0); + let props = member(&bytes[start..], PROPS); + assert!( + String::from_utf8_lossy(&props).contains(MARKER), + "assembly {PROPS}" + ); + // Deleting the tree deletes the guard: the build fails closed. + let tree = proj.join(".socket/vendor/coursier"); + let aside = root.join("tree-aside"); + std::fs::rename(&tree, &aside).unwrap(); + let (built, out) = run(&bin, &proj, &["compile", "."]); + assert!(!built && out.contains("File not found"), "{out}"); + std::fs::rename(&aside, &tree).unwrap(); + // A fresh clone whose .gitignore drops *.jar still carries the jar. + write(&proj.join(".gitignore"), "*.jar\n.scala-build/\n.bsp/\n"); + git(&proj, &["init", "-q"]); + git(&proj, &["add", "-A"]); + git( + &proj, + &[ + "-c", + "user.email=a@b", + "-c", + "user.name=a", + "commit", + "-qm", + "x", + ], + ); + let clone = root.join("clone"); + let (from, to) = (proj.to_str().unwrap(), clone.to_str().unwrap()); + git(&root, &["clone", "-q", from, to]); + let vendored = format!( + ".socket/vendor/coursier/{GROUP_PATH}/{ARTIFACT}/{VERSION}/{ARTIFACT}-{VERSION}.jar" + ); + assert!(clone.join(&vendored).is_file(), "{vendored}"); + assert!(patched(&bin, &clone, "."), "fresh clone"); + std::fs::remove_file(proj.join(".gitignore")).unwrap(); + // Revert restores every byte, and the build is upstream again. + ok(&root, &home, &["vendor", "--revert"]); + assert_eq!(snapshot(&root), pristine); + assert!(!patched(&bin, &proj, "."), "after revert"); + } +} diff --git a/crates/socket-patch-cli/tests/e2e_vex_lockfile/main.rs b/crates/socket-patch-cli/tests/e2e_vex_lockfile/main.rs index 0953f4b06..a986312d7 100644 --- a/crates/socket-patch-cli/tests/e2e_vex_lockfile/main.rs +++ b/crates/socket-patch-cli/tests/e2e_vex_lockfile/main.rs @@ -20,6 +20,10 @@ //! (with the PDM/Hatch and Pipenv/pip helpers beside it); `common_selftest` //! tests those helpers themselves. +#[path = "../prebuilt_common/mod.rs"] +mod prebuilt_common; +#[path = "../sbt_common/mod.rs"] +mod sbt_common; #[path = "../vex_e2e_common/mod.rs"] mod vex_e2e_common; #[path = "../vex_pdm_hatch_common/mod.rs"] @@ -44,6 +48,8 @@ mod pip; mod pipenv; mod pnpm; mod poetry; +mod sbt; +mod sbt_vendored; mod uv; mod vlt; mod yarn; diff --git a/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt.rs b/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt.rs new file mode 100644 index 000000000..1ca9e534a --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt.rs @@ -0,0 +1,59 @@ +//! Manifest-less `socket-patch vex` for HOSTED sbt: the generated +//! `socket-patch.sbt` pins, attested only against the build's local +//! resolution evidence (lane L3 fills this suite; see +//! `docs/design/sbt-support.md`). Until then it holds the shared fixture +//! helpers' self-tests. + +use super::sbt_common::{copy_evidence, write_coursier_artifact, write_ivy_artifact, Gav, SbtHome}; + +const LANG3: Gav<'static> = Gav { + group: "org.apache.commons", + artifact: "commons-lang3", + version: "3.11", +}; + +#[test] +fn sbt_common_writes_the_cache_layouts() { + let tmp = tempfile::tempdir().unwrap(); + let home = SbtHome::new(tmp.path()); + let dir = write_coursier_artifact( + &home.coursier_cache(), + "repo1.maven.org/maven2", + LANG3, + b"jar", + ); + assert!(dir.ends_with("https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11")); + assert!(dir.join("commons-lang3-3.11.jar").is_file()); + assert_eq!( + std::fs::read_to_string(dir.join(".commons-lang3-3.11.jar__sha1")) + .unwrap() + .len(), + 40 + ); + let jars = write_ivy_artifact(&home.ivy_home(), LANG3, b"jar"); + assert!(jars.join("commons-lang3-3.11.jar").is_file()); + assert!(jars + .parent() + .unwrap() + .join("ivy-3.11.xml.original") + .is_file()); + let env = home.isolated_env(); + assert!(env + .iter() + .any(|(k, v)| k == "COURSIER_CACHE" && v.starts_with(&*tmp.path().to_string_lossy()))); +} + +#[test] +fn sbt_common_copies_an_evidence_fixture() { + let tmp = tempfile::tempdir().unwrap(); + copy_evidence("1.9.9", "test-compile", tmp.path()); + assert!(tmp.path().join("build.sbt").is_file()); + assert!(tmp + .path() + .join("a/target/scala-2.12/update/update_cache_2.12/output") + .is_file()); + assert_eq!( + std::fs::read_to_string(tmp.path().join("project/build.properties")).unwrap(), + "sbt.version=1.9.9\n" + ); +} diff --git a/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt_vendored.rs b/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt_vendored.rs new file mode 100644 index 000000000..a40625b44 --- /dev/null +++ b/crates/socket-patch-cli/tests/e2e_vex_lockfile/sbt_vendored.rs @@ -0,0 +1,300 @@ +//! Manifest-less `socket-patch vex` for VENDORED sbt: the generated +//! `socket-patch-vendor.sbt` pins over the committed `.socket/vendor/maven2` +//! tree (`docs/design/sbt-support.md` §4.3; extractor +//! `vex/discover/sbt.rs`). +//! +//! The suffixed tree path carries no full uuid, so the generated file is no +//! `.socket/vendor///` reference: a vendored sbt pin is attested +//! through the vendor ledger `vendor` writes, and the extractor diagnoses +//! what would make that attestation a lie. Each cell vendors for real +//! (`vendor` over the sbt 1.13.0 probe build, the installed jar in an +//! isolated Coursier cache), drops `.socket/manifest.json`, and runs +//! `vex --offline` (the ledger embeds the record): +//! +//! | cell | state | expected | +//! |---|---|---| +//! | a | after `sbt update` (the evidence resolves the suffixed version from the tree) | attested, no sbt diagnostic | +//! | b | before `sbt update` (the evidence still resolves the base version) | `sbt_resolution_unverified` | +//! | c | a tree jar tampered | `vendored_tree_missing`, not attested | +//! | d | the generated file edited | `sbt_owned_file_modified` | +//! | e | no ledger | nothing attested; the tree check still runs | + +use std::path::{Path, PathBuf}; +use std::process::Command; +use std::time::{Duration, SystemTime}; + +use serde_json::Value; + +use super::sbt_common::{ + copy_evidence, record_pinned_resolution, write_coursier_artifact, Gav, SbtHome, +}; + +const UUID: &str = "1d3c1fd2-7b4e-4c1a-9f0e-2a3b4c5d6e7f"; +const GSON: Gav<'static> = Gav { + group: "com.google.code.gson", + artifact: "gson", + version: "2.8.9", +}; +const SV: &str = "2.8.9-socket.1d3c1fd2"; +const CENTRAL: &str = "repo1.maven.org/maven2"; +const MEMBER: &str = "META-INF/NOTICE.txt"; +const VULN: &str = "GHSA-sbtv-test-xxxx"; +const VENDORED_FILE: &str = "socket-patch-vendor.sbt"; + +fn tree_jar(proj: &Path) -> PathBuf { + proj.join(".socket/vendor/maven2/com/google/code/gson/gson") + .join(SV) + .join(format!("gson-{SV}.jar")) +} + +fn jar(notice: &[u8]) -> Vec { + use std::io::Write as _; + let mut zw = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); + let opts = zip::write::SimpleFileOptions::default(); + for (name, bytes) in [ + ("META-INF/MANIFEST.MF", &b"Manifest-Version: 1.0\n"[..]), + (MEMBER, notice), + ] { + zw.start_file(name, opts).unwrap(); + zw.write_all(bytes).unwrap(); + } + zw.finish().unwrap().into_inner() +} + +fn git_sha256(bytes: &[u8]) -> String { + socket_patch_core::hash::git_sha256::compute_git_sha256_from_bytes(bytes) +} + +/// `root/proj`: the sbt 1.13.0 probe build (gson 2.8.9 resolved in `b`), +/// vendored for real; the manifest is then removed. +struct Fx { + _tmp: tempfile::TempDir, + proj: PathBuf, + home: SbtHome, +} + +impl Fx { + fn vendored() -> Self { + let tmp = tempfile::tempdir().unwrap(); + let root = std::fs::canonicalize(tmp.path()).unwrap(); + let proj = root.join("proj"); + copy_evidence("1.13.0", "test-compile", &proj); + // The evidence postdates every build source (a copy dates files in + // directory order). + record_pinned_resolution(&proj, &[], SystemTime::now() + Duration::from_secs(60)); + let home = SbtHome::new(&root); + let before = b"NOTICE gson\n".to_vec(); + let after = b"NOTICE gson\nPATCHED\n".to_vec(); + write_coursier_artifact(&home.coursier_cache(), CENTRAL, GSON, &jar(&before)); + let socket = proj.join(".socket"); + std::fs::create_dir_all(socket.join("blobs")).unwrap(); + std::fs::write(socket.join("blobs").join(git_sha256(&after)), &after).unwrap(); + let manifest = serde_json::json!({ "patches": { GSON.purl(): { + "uuid": UUID, + "exportedAt": "2026-01-01T00:00:00Z", + "files": { MEMBER: { + "beforeHash": git_sha256(&before), + "afterHash": git_sha256(&after), + } }, + "vulnerabilities": { VULN: { + "cves": ["CVE-2026-0042"], "summary": "s", "severity": "high", + "description": "d" + } }, + "description": "sbt vendored vex fixture", + "license": "MIT", + "tier": "free", + } } }); + std::fs::write( + socket.join("manifest.json"), + serde_json::to_vec_pretty(&manifest).unwrap(), + ) + .unwrap(); + let fx = Fx { + _tmp: tmp, + proj, + home, + }; + let (code, env) = fx.run(&["vendor"]); + assert_eq!(code, Some(0), "vendor: {env}"); + assert_eq!(env["summary"]["applied"], 1, "vendor: {env}"); + assert!(tree_jar(&fx.proj).is_file()); + std::fs::remove_file(fx.proj.join(".socket/manifest.json")).unwrap(); + fx + } + + /// What `sbt update` records after vendoring. + fn sbt_update(&self) { + let changed = record_pinned_resolution( + &self.proj, + &[(GSON, SV.to_string(), tree_jar(&self.proj))], + SystemTime::now() + Duration::from_secs(240), + ); + assert!(changed > 0); + } + + /// `socket-patch --json --cwd ` in the isolated home. + fn run(&self, args: &[&str]) -> (Option, Value) { + let mut cmd = Command::new(env!("CARGO_BIN_EXE_socket-patch")); + for (k, _) in std::env::vars_os() { + let k = k.to_string_lossy(); + if k.starts_with("SOCKET_") || k.starts_with("COURSIER_") { + cmd.env_remove(&*k); + } + } + let repo = self.home.coursier_cache().join("https").join(CENTRAL); + let _server = super::prebuilt_common::prepare_command( + &mut cmd, + &self.proj, + args, + &[("MAVEN_REPO_LOCAL", repo.to_str().unwrap())], + ); + for (k, v) in self.home.isolated_env() { + cmd.env(k, v); + } + let out = cmd + .args(["--json", "--cwd", self.proj.to_str().unwrap()]) + .env("SOCKET_TELEMETRY_DISABLED", "1") + .env("SOCKET_NO_CONFIG", "1") + .env_remove("M2_HOME") + .output() + .expect("run socket-patch"); + let stdout = String::from_utf8_lossy(&out.stdout).into_owned(); + let env = serde_json::from_str(&stdout).unwrap_or_else(|e| { + panic!( + "{args:?}: not JSON ({e})\n{stdout}\n{}", + String::from_utf8_lossy(&out.stderr) + ) + }); + (out.status.code(), env) + } + + /// `vex --offline` into `vex.json`; `(exit, envelope, document)`. + fn vex(&self) -> (Option, Value, Option) { + let out = self.proj.join("vex.json"); + let _ = std::fs::remove_file(&out); + let (code, env) = self.run(&[ + "vex", + "--offline", + "--output", + out.to_str().unwrap(), + "--product", + "pkg:maven/dev.socket.test/app@1.0.0", + ]); + let doc = std::fs::read(&out) + .ok() + .map(|b| serde_json::from_slice(&b).unwrap()); + (code, env, doc) + } +} + +/// Every `code` / `errorCode` in an envelope. +fn codes(env: &Value) -> Vec { + fn walk(v: &Value, out: &mut Vec) { + match v { + Value::Object(m) => { + for (k, v) in m { + if k == "code" || k == "errorCode" { + if let Some(s) = v.as_str() { + out.push(s.to_string()); + } + } + walk(v, out); + } + } + Value::Array(a) => a.iter().for_each(|v| walk(v, out)), + _ => {} + } + } + let mut out = Vec::new(); + walk(env, &mut out); + out +} + +/// Whether `doc` attests gson `not_affected` under [`VULN`]. +fn attested(doc: Option<&Value>) -> bool { + doc.and_then(|d| d["statements"].as_array()) + .is_some_and(|sts| { + sts.iter().any(|st| { + st["vulnerability"]["name"] == VULN + && st["status"] == "not_affected" + && st.to_string().contains("gson") + }) + }) +} + +const SBT_DIAGS: &[&str] = &[ + "sbt_resolution_unverified", + "vendored_tree_missing", + "sbt_owned_file_modified", +]; + +#[test] +fn sbt_vendored_vex_attests_after_sbt_update() { + let fx = Fx::vendored(); + fx.sbt_update(); + let (code, env, doc) = fx.vex(); + assert_eq!(code, Some(0), "{env}"); + assert!(attested(doc.as_ref()), "{env}\n{doc:?}"); + let got = codes(&env); + assert!( + !SBT_DIAGS.iter().any(|d| got.iter().any(|c| c == d)), + "{env}" + ); +} + +#[test] +fn sbt_vendored_vex_before_sbt_update_is_unverified() { + let fx = Fx::vendored(); + let (_, env, _) = fx.vex(); + assert!( + codes(&env).contains(&"sbt_resolution_unverified".to_string()), + "{env}" + ); +} + +#[test] +fn sbt_vendored_vex_flags_a_tampered_tree() { + let fx = Fx::vendored(); + fx.sbt_update(); + std::fs::write(tree_jar(&fx.proj), jar(b"EVIL\n")).unwrap(); + let (_, env, doc) = fx.vex(); + assert!( + codes(&env).contains(&"vendored_tree_missing".to_string()), + "{env}" + ); + assert!( + !attested(doc.as_ref()), + "a tampered tree is never attested: {doc:?}" + ); +} + +#[test] +fn sbt_vendored_vex_flags_an_edited_generated_file() { + let fx = Fx::vendored(); + fx.sbt_update(); + let path = fx.proj.join(VENDORED_FILE); + let text = std::fs::read_to_string(&path).unwrap(); + std::fs::write(&path, text.replace("// socket-patch ", "// mine ")).unwrap(); + let (_, env, _) = fx.vex(); + assert!( + codes(&env).contains(&"sbt_owned_file_modified".to_string()), + "{env}" + ); +} + +#[test] +fn sbt_vendored_vex_without_a_ledger_attests_nothing() { + let fx = Fx::vendored(); + fx.sbt_update(); + std::fs::remove_file(fx.proj.join(".socket/vendor/state.json")).unwrap(); + let (code, env, doc) = fx.vex(); + assert_ne!(code, Some(0), "{env}"); + assert!(!attested(doc.as_ref()), "{doc:?}"); + // The tree check still runs on the generated file alone. + std::fs::write(tree_jar(&fx.proj), jar(b"EVIL\n")).unwrap(); + let (_, env, _) = fx.vex(); + assert!( + codes(&env).contains(&"vendored_tree_missing".to_string()), + "{env}" + ); +} diff --git a/crates/socket-patch-cli/tests/in_process_remote_ecosystems_apply.rs b/crates/socket-patch-cli/tests/in_process_remote_ecosystems_apply.rs index 3b000c46e..b875701c2 100644 --- a/crates/socket-patch-cli/tests/in_process_remote_ecosystems_apply.rs +++ b/crates/socket-patch-cli/tests/in_process_remote_ecosystems_apply.rs @@ -24,6 +24,49 @@ use wiremock::{Mock, MockServer, ResponseTemplate}; const ORG: &str = "test-org"; +/// Keeps the machine's Coursier / Ivy caches out of a Maven test that pins +/// the exact batch traffic (a JVM project's crawl also reaches them): +/// `HOME` points at an empty directory and the variables naming a cache +/// are unset until drop, which restores them. Only inside `#[serial]` +/// tests. +struct NoJvmCaches { + _home: tempfile::TempDir, + saved: Vec<(&'static str, Option)>, +} + +impl NoJvmCaches { + fn new() -> Self { + let home = tempfile::tempdir().unwrap(); + let keys = [ + "HOME", + "USERPROFILE", + "XDG_CACHE_HOME", + "LOCALAPPDATA", + "COURSIER_CACHE", + "SBT_OPTS", + "JAVA_OPTS", + ]; + let saved = keys.iter().map(|k| (*k, std::env::var_os(k))).collect(); + for key in keys { + std::env::remove_var(key); + } + std::env::set_var("HOME", home.path()); + std::env::set_var("USERPROFILE", home.path()); + Self { _home: home, saved } + } +} + +impl Drop for NoJvmCaches { + fn drop(&mut self) { + for (key, value) in &self.saved { + match value { + Some(v) => std::env::set_var(key, v), + None => std::env::remove_var(key), + } + } + } +} + fn git_sha256(content: &[u8]) -> String { let header = format!("blob {}\0", content.len()); let mut hasher = Sha256::new(); @@ -598,6 +641,7 @@ async fn golang_handcrafted_discovery() { #[tokio::test] #[serial] async fn maven_handcrafted_discovery() { + let _no_jvm_caches = NoJvmCaches::new(); let tmp = tempfile::tempdir().expect("tempdir"); let repo = tmp.path().join("m2"); let version_dir = repo.join("org/example/foo/1.0.0"); diff --git a/crates/socket-patch-cli/tests/in_process_scan.rs b/crates/socket-patch-cli/tests/in_process_scan.rs index 98da10171..a920effb5 100644 --- a/crates/socket-patch-cli/tests/in_process_scan.rs +++ b/crates/socket-patch-cli/tests/in_process_scan.rs @@ -13,6 +13,49 @@ use socket_patch_cli::commands::scan::{run, ScanArgs}; use wiremock::matchers::{method, path, path_regex}; use wiremock::{Mock, MockServer, ResponseTemplate}; +/// Keeps the machine's Coursier / Ivy caches out of a Maven test that pins +/// the exact batch traffic (a JVM project's crawl also reaches them): +/// `HOME` points at an empty directory and the variables naming a cache +/// are unset until drop, which restores them. Only inside `#[serial]` +/// tests. +struct NoJvmCaches { + _home: tempfile::TempDir, + saved: Vec<(&'static str, Option)>, +} + +impl NoJvmCaches { + fn new() -> Self { + let home = tempfile::tempdir().unwrap(); + let keys = [ + "HOME", + "USERPROFILE", + "XDG_CACHE_HOME", + "LOCALAPPDATA", + "COURSIER_CACHE", + "SBT_OPTS", + "JAVA_OPTS", + ]; + let saved = keys.iter().map(|k| (*k, std::env::var_os(k))).collect(); + for key in keys { + std::env::remove_var(key); + } + std::env::set_var("HOME", home.path()); + std::env::set_var("USERPROFILE", home.path()); + Self { _home: home, saved } + } +} + +impl Drop for NoJvmCaches { + fn drop(&mut self) { + for (key, value) in &self.saved { + match value { + Some(v) => std::env::set_var(key, v), + None => std::env::remove_var(key), + } + } + } +} + const ORG: &str = "test-org"; const PURL: &str = "pkg:npm/in-proc-scan@1.0.0"; const UUID: &str = "11111111-1111-4111-8111-111111111111"; @@ -1380,6 +1423,7 @@ async fn scan_non_json_dry_run_does_not_mutate() { #[tokio::test] #[serial] async fn scan_discovers_maven_and_nuget_in_every_mode() { + let _no_jvm_caches = NoJvmCaches::new(); use socket_patch_cli::commands::scan::ScanMode; const MAVEN_PURL: &str = "pkg:maven/org.example/foo@1.0.0"; diff --git a/crates/socket-patch-cli/tests/sbt_build_common/mod.rs b/crates/socket-patch-cli/tests/sbt_build_common/mod.rs new file mode 100644 index 000000000..42fbf35e9 --- /dev/null +++ b/crates/socket-patch-cli/tests/sbt_build_common/mod.rs @@ -0,0 +1,490 @@ +//! Real-sbt plumbing for the host build capstones (`e2e_sbt_build`). +//! +//! Toolchain selection (`SOCKET_PATCH_SBT_E2E_*`): +//! +//! * `SBT` — the sbt launcher script to run (`/bin/sbt`); unset/empty +//! = `sbt` on `PATH`. +//! * `DOCKER` — an image with a JDK (`socket-patch-test-sbt`, or a plain +//! `eclipse-temurin:-jdk`): sbt runs inside it, with the launcher +//! (`SBT`, required then: a launcher directory on the host) and every +//! test directory bind-mounted at its own host path, so the evidence sbt +//! writes names paths the host CLI can read. Each run is `--rm -m 2g`, +//! reaches the host's patch-server stand-in as `host.docker.internal`, +//! and is killed after the timeout. +//! * `VERSION` — the `sbt.version` the fixture builds pin (default +//! `1.13.0`); the launcher fetches it. +//! * `REQUIRED` — when non-empty, a missing toolchain is a failure, not a +//! printed SKIP. +//! * `SEED` — a warm cache in either layout `sbt_e2e_shared::Seed` reads +//! (a home with `.cache/coursier/v1`, `.ivy2`, `.sbt/boot`, or a flat +//! `coursier/v1`, `ivy2`, `boot`). The Coursier cache and Ivy home are +//! hard-linked into every test's own caches (read-only use: Coursier and +//! Ivy only add files); the boot directory is shared. Without it every +//! test resolves from the network. +//! +//! Every run is hermetic (`sbt_e2e_shared::native_command`, the same flags +//! for the Docker runner): `COURSIER_CACHE=/cs` (and nothing else +//! naming a Coursier location), `HOME` / `-Duser.home=/home` (so +//! `mavenLocal` is `/home/.m2/repository`, also +//! `-Dmaven.repo.local`), `-Dsbt.global.base`, `-Dsbt.ivy.home`, +//! `-Dsbt.boot.directory`, `-Dsbt.server.autostart=false`, `-batch`, +//! `-no-colors`; `SBT_OPTS`, `JAVA_OPTS`, `JAVA_TOOL_OPTIONS`, +//! `COURSIER_*`, `SOCKET_*` and the CI markers scrubbed. A hard timeout +//! (300 s) kills every spawn. +//! +//! The fixture is Java-only (`autoScalaLibrary := false`): a local +//! `file:` maven2 repository (`/central`) serves `dev.socket.fixture` +//! jars built here, so no project dependency touches the network. + +#![allow(dead_code)] + +use std::io::Write as _; +use std::path::{Path, PathBuf}; +use std::process::{Command, Stdio}; +use std::time::Instant; + +#[path = "../sbt_e2e_shared/mod.rs"] +pub mod shared; +pub use shared::{env_value, DOCKER_ENV, REQUIRED_ENV, SBT_ENV, TIMEOUT}; + +/// The fixture group every test's artifacts live under. +pub const GROUP: &str = "dev.socket.fixture"; + +/// How sbt runs. +#[derive(Debug, Clone)] +pub enum Runner { + /// On the host. + Native { sbt: PathBuf }, + /// In `image`, the launcher directory `launcher` mounted at its path. + Docker { image: String, launcher: PathBuf }, +} + +/// The selected sbt toolchain. +#[derive(Debug, Clone)] +pub struct Sbt { + pub runner: Runner, + pub version: String, + pub seed: Option, +} + +impl Sbt { + /// The configured toolchain, or `None` (printed SKIP) when none is + /// usable and `REQUIRED` is unset. + pub fn detect(suite: &str) -> Option { + let required = env_value(REQUIRED_ENV).is_some(); + let skip = |why: String| -> Option { + assert!(!required, "{suite}: {REQUIRED_ENV} is set but {why}"); + eprintln!("SKIP {suite}: {why}"); + None + }; + let version = shared::version(); + let seed = shared::Seed::from_env(); + let runner = match env_value(DOCKER_ENV) { + Some(image) => { + let Some(launcher) = env_value(SBT_ENV).map(PathBuf::from) else { + return skip(format!("{DOCKER_ENV} needs {SBT_ENV} (a launcher dir)")); + }; + let launcher = if launcher.ends_with("bin/sbt") { + launcher.parent().unwrap().parent().unwrap().to_path_buf() + } else { + launcher + }; + if !launcher.join("bin/sbt").is_file() { + return skip(format!("no {}/bin/sbt", launcher.display())); + } + let ok = Command::new("docker") + .args(["image", "inspect", &image]) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .is_ok_and(|s| s.success()); + if !ok { + return skip(format!("docker image {image} is not available")); + } + Runner::Docker { image, launcher } + } + None => { + let sbt = env_value(SBT_ENV).map_or_else(|| PathBuf::from("sbt"), PathBuf::from); + let ok = Command::new(&sbt) + .arg("--script-version") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .is_ok_and(|s| s.success()); + if !ok { + return skip(format!("{} is not runnable", sbt.display())); + } + Runner::Native { sbt } + } + }; + Some(Sbt { + runner, + version, + seed, + }) + } + + /// The sbt line of [`Self::version`]: `0.13`, `1` or `2`. + pub fn line(&self) -> &'static str { + shared::line(&self.version) + } + + /// Whether this sbt resolves through Ivy (0.13, 1.0–1.2). + pub fn ivy(&self) -> bool { + shared::uses_ivy(&self.version) + } + + /// The host name sbt reaches the test's loopback servers by. + pub fn host_from_sbt(&self) -> &'static str { + match self.runner { + Runner::Native { .. } => "127.0.0.1", + Runner::Docker { .. } => "host.docker.internal", + } + } + + /// The task path of a project's dependency classpath on this line. + pub fn classpath_task(&self, project: &str) -> String { + match self.line() { + "0.13" => format!("{project}/compile:dependencyClasspath"), + _ => format!("{project}/Compile/dependencyClasspath"), + } + } + + /// Run sbt `commands` in `ws.project` (each one an sbt command line + /// argument). + pub fn run(&self, ws: &Workspace, commands: &[&str]) -> SbtRun { + let loc = ws.locations(); + let cs = ws.coursier_cache(); + let started = Instant::now(); + let (mut cmd, container) = match &self.runner { + Runner::Native { sbt } => { + let mut cmd = + shared::native_command(sbt.as_os_str(), &ws.project, &loc, &self.version); + cmd.args(commands); + (cmd, None) + } + Runner::Docker { image, launcher } => { + let name = format!( + "socket-patch-sbt-e2e-{}-{}", + std::process::id(), + started.elapsed().as_nanos() ^ rand_suffix() + ); + let mut cmd = Command::new("docker"); + cmd.args(["run", "--rm", "-m", "2g", "--name", &name]) + .args(["--add-host", "host.docker.internal:host-gateway"]) + .arg("-v") + .arg(format!("{0}:{0}", ws.root.display())) + .arg("-v") + .arg(format!("{0}:{0}:ro", launcher.display())) + .arg("-v") + .arg(format!("{0}:{0}", ws.boot.display())) + .arg("-w") + .arg(&ws.project) + .arg("-e") + .arg(format!("COURSIER_CACHE={}", cs.display())) + .arg("-e") + .arg(format!("HOME={}", loc.home.display())) + .arg(image) + .arg(launcher.join("bin/sbt")) + .args(shared::hermetic_args(&loc, &self.version)) + .args(commands); + (cmd, Some(name)) + } + }; + let log_path = ws.root.join(format!("sbt-{}.log", ws.next_log())); + let log = std::fs::File::create(&log_path).expect("sbt log"); + cmd.stdin(Stdio::null()) + .stdout(log.try_clone().expect("log")) + .stderr(log); + let mut child = cmd.spawn().expect("spawn sbt"); + let code = match shared::wait_or_kill_group(&mut child, TIMEOUT) { + Some(status) => status.code(), + None => { + // The docker client died with its group; the container + // outlives it. + if let Some(name) = &container { + let _ = Command::new("docker") + .args(["kill", name]) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status(); + } + None + } + }; + let output = std::fs::read_to_string(&log_path).unwrap_or_default(); + SbtRun { + code, + output, + commands: commands.iter().map(|c| c.to_string()).collect(), + } + } +} + +fn rand_suffix() -> u128 { + use std::hash::{BuildHasher as _, Hasher as _}; + let mut h = std::collections::hash_map::RandomState::new().build_hasher(); + h.write_u8(0); + h.finish() as u128 +} + +/// One sbt run's outcome. +#[derive(Debug)] +pub struct SbtRun { + /// `None` = killed by the timeout. + pub code: Option, + pub output: String, + pub commands: Vec, +} + +impl SbtRun { + pub fn ok(&self) -> bool { + self.code == Some(0) + } + + /// Panic with the log unless the run succeeded. + pub fn expect_ok(&self, what: &str) -> &Self { + assert!( + self.ok(), + "{what}: sbt {:?} exited {:?}\n{}", + self.commands, + self.code, + tail(&self.output) + ); + self + } + + /// Panic with the log unless the run failed with `needle` in its log. + pub fn expect_failure(&self, what: &str, needle: &str) -> &Self { + assert!( + !self.ok() && self.output.contains(needle), + "{what}: expected sbt {:?} to fail with {needle:?}, exit {:?}\n{}", + self.commands, + self.code, + tail(&self.output) + ); + self + } + + /// The jar paths an `export ` printed. + /// sbt 0.13 / 1.x print a `:`-joined path; sbt 2 prints `List(a, b)`. + pub fn classpath_jars(&self) -> Vec { + Self::jars_in(&self.output) + } + + /// [`Self::classpath_jars`] with sbt 2's virtual roots (`${BASE}` = the + /// build root, `${CSR_CACHE}` = the Coursier cache) spelled out. + pub fn classpath_jars_in(&self, ws: &Workspace) -> Vec { + shared::export_classpath(&self.output, &ws.project, &ws.coursier_cache()) + } + + fn jars_in(output: &str) -> Vec { + shared::export_classpath(output, Path::new("/"), Path::new("/")) + } +} + +fn tail(log: &str) -> String { + let lines: Vec<&str> = log.lines().collect(); + lines[lines.len().saturating_sub(80)..].join("\n") +} + +/// One test's directories: the project, its caches and the fixture +/// repository, under a canonical temp root (so container and host agree on +/// every path). +pub struct Workspace { + _tmp: tempfile::TempDir, + pub root: PathBuf, + pub project: PathBuf, + pub central: PathBuf, + pub boot: PathBuf, + log_counter: std::cell::Cell, +} + +impl Workspace { + pub fn new(sbt: &Sbt) -> Self { + let tmp = tempfile::Builder::new() + .prefix("sbt-e2e-") + .tempdir() + .expect("tempdir"); + // Canonical (macOS symlinks its temp dir), in the spelling Java + // accepts (no Windows verbatim prefix). + let root = shared::canonical(tmp.path()); + let project = root.join("project"); + let central = root.join("central"); + for d in [ + &project, + ¢ral, + &root.join("home"), + &root.join("sbt-global"), + ] { + std::fs::create_dir_all(d).unwrap(); + } + // Coursier and Ivy caches are hard-linked in (both only add + // files); the boot directory is shared (sbt locks it). + let boot = match &sbt.seed { + Some(seed) => { + for (src, to) in [(&seed.coursier, "cs"), (&seed.ivy, "ivy2")] { + if let Some(src) = src { + shared::link_tree(src, &root.join(to)); + } + } + match &seed.boot { + Some(boot) => shared::canonical(boot), + None => root.join("boot"), + } + } + None => root.join("boot"), + }; + std::fs::create_dir_all(&boot).unwrap(); + std::fs::create_dir_all(root.join("cs")).unwrap(); + Workspace { + _tmp: tmp, + root, + project, + central, + boot, + log_counter: std::cell::Cell::new(0), + } + } + + fn next_log(&self) -> u32 { + let n = self.log_counter.get() + 1; + self.log_counter.set(n); + n + } + + pub fn coursier_cache(&self) -> PathBuf { + self.root.join("cs") + } + + /// Every sbt location of this workspace (`home` holds `mavenLocal`). + pub fn locations(&self) -> shared::Locations { + shared::Locations { + home: self.root.join("home"), + global_base: self.root.join("sbt-global"), + boot: self.boot.clone(), + ivy_home: self.ivy_home(), + coursier: self.coursier_cache(), + } + } + + /// `mavenLocal` as sbt sees it in this workspace. + pub fn maven_local(&self) -> PathBuf { + self.root.join("home/.m2/repository") + } + + pub fn ivy_home(&self) -> PathBuf { + self.root.join("ivy2") + } + + /// Write `rel` under the project. + pub fn write(&self, rel: &str, text: &str) { + let path = self.project.join(rel); + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write(path, text).unwrap(); + } + + /// Publish `artifact:version` into the fixture repository: a jar + /// holding one `marker` entry, and a pom declaring `deps`. + pub fn publish(&self, artifact: &str, version: &str, marker: &str, deps: &[(&str, &str)]) { + let dir = self + .central + .join(GROUP.replace('.', "/")) + .join(artifact) + .join(version); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join(format!("{artifact}-{version}.jar")), jar(marker)).unwrap(); + std::fs::write( + dir.join(format!("{artifact}-{version}.pom")), + pom(artifact, version, deps), + ) + .unwrap(); + } + + /// The fixture's `file:` repository URL (`file:///C:/…` on Windows). + pub fn central_url(&self) -> String { + shared::file_url(&self.central) + } +} + +/// A jar (zip) with the single entry `marker`. +pub fn jar(marker: &str) -> Vec { + let mut buf = std::io::Cursor::new(Vec::new()); + { + let mut zip = zip::ZipWriter::new(&mut buf); + let opts: zip::write::SimpleFileOptions = zip::write::SimpleFileOptions::default() + .compression_method(zip::CompressionMethod::Stored) + .last_modified_time(zip::DateTime::default()); + zip.start_file(marker, opts).unwrap(); + zip.write_all(marker.as_bytes()).unwrap(); + zip.finish().unwrap(); + } + buf.into_inner() +} + +/// A pom for `GROUP:artifact:version` depending on `deps`. +pub fn pom(artifact: &str, version: &str, deps: &[(&str, &str)]) -> String { + let deps: String = deps + .iter() + .map(|(a, v)| { + format!( + "{GROUP}{a}\ + {v}" + ) + }) + .collect(); + format!( + "\n\ + 4.0.0{GROUP}{artifact}\ + {version}jar{deps}\n" + ) +} + +/// One fixture project: `(id, base directory, (artifact, version) deps)`. +pub type ProjectSpec<'a> = (&'a str, &'a str, &'a [(&'a str, &'a str)]); + +/// The sbt build text for `projects` (`(id, dir, deps)`; dir `.` is the +/// root, which aggregates the rest), Java-only, resolving from the +/// fixture repository, plus `extra` lines. +pub fn build_sbt(sbt: &Sbt, ws: &Workspace, projects: &[ProjectSpec<'_>], extra: &str) -> String { + let resolver = if sbt.line() == "0.13" { + format!( + "resolvers in ThisBuild += \"fixture-central\" at \"{}\"", + ws.central_url() + ) + } else { + format!( + "ThisBuild / resolvers += \"fixture-central\" at \"{}\"", + ws.central_url() + ) + }; + let mut out = format!("{resolver}\n"); + let aggregated: Vec<&str> = projects + .iter() + .filter(|(_, dir, _)| *dir != ".") + .map(|(id, _, _)| *id) + .collect(); + for (id, dir, deps) in projects { + let deps: Vec = deps + .iter() + .map(|(a, v)| format!("\"{GROUP}\" % \"{a}\" % \"{v}\"")) + .collect(); + let aggregate = if *dir == "." && !aggregated.is_empty() { + format!(".aggregate({})", aggregated.join(", ")) + } else { + String::new() + }; + out.push_str(&format!( + "lazy val {id} = (project in file(\"{dir}\")){aggregate}.settings(autoScalaLibrary := false, libraryDependencies ++= Seq({}))\n", + deps.join(", ") + )); + } + out.push_str(extra); + out +} + +/// sha256 hex of `bytes`. +pub fn sha256(bytes: &[u8]) -> String { + use sha2::{Digest as _, Sha256}; + hex::encode(Sha256::digest(bytes)) +} diff --git a/crates/socket-patch-cli/tests/sbt_common/mod.rs b/crates/socket-patch-cli/tests/sbt_common/mod.rs new file mode 100644 index 000000000..5418558b2 --- /dev/null +++ b/crates/socket-patch-cli/tests/sbt_common/mod.rs @@ -0,0 +1,303 @@ +//! Hermetic sbt / Coursier / Ivy fixtures shared by the sbt suites +//! (`e2e_sbt`, `e2e_vex_lockfile::{sbt, sbt_vendored}`): no sbt, no JVM, no +//! network. Each helper writes the on-disk shape the real tool leaves, so +//! the CLI's crawlers, sbt planners and VEX extractor read exactly what +//! they would read after a real `sbt update`. +//! +//! Every child run gets [`isolated_env`]: `HOME`, the Coursier cache +//! (`COURSIER_CACHE`, `XDG_CACHE_HOME`, `LOCALAPPDATA`), the Maven local +//! repository and the JVM option variables (`SBT_OPTS`, `JAVA_OPTS`) all +//! point into the test's temp dir, so the developer's real caches are never +//! crawled and never patched. + +#![allow(dead_code)] + +use std::path::{Path, PathBuf}; + +/// Where a test's isolated caches live, below its temp dir. +pub struct SbtHome { + pub root: PathBuf, +} + +impl SbtHome { + pub fn new(tmp: &Path) -> Self { + let root = tmp.join("sbt-home"); + std::fs::create_dir_all(&root).expect("create sbt home"); + Self { root } + } + + /// `$HOME`. + pub fn home(&self) -> PathBuf { + self.root.join("home") + } + + /// `$COURSIER_CACHE` (the cache directory itself: `/https//…`). + pub fn coursier_cache(&self) -> PathBuf { + self.root.join("coursier") + } + + /// The Ivy cache sbt <= 1.2 uses (`-Dsbt.ivy.home=`). + pub fn ivy_home(&self) -> PathBuf { + self.root.join("ivy2") + } + + /// `$MAVEN_REPO_LOCAL`. + pub fn m2(&self) -> PathBuf { + self.root.join("m2") + } + + /// The child env pinning every cache location into this home. + pub fn isolated_env(&self) -> Vec<(String, String)> { + let s = |p: PathBuf| p.to_string_lossy().into_owned(); + vec![ + ("HOME".into(), s(self.home())), + ("USERPROFILE".into(), s(self.home())), + ("COURSIER_CACHE".into(), s(self.coursier_cache())), + ("XDG_CACHE_HOME".into(), s(self.root.join("xdg-cache"))), + ("LOCALAPPDATA".into(), s(self.root.join("localappdata"))), + ("MAVEN_REPO_LOCAL".into(), s(self.m2())), + ("SBT_OPTS".into(), String::new()), + ("JAVA_OPTS".into(), String::new()), + ] + } +} + +/// A Maven coordinate. +#[derive(Debug, Clone, Copy)] +pub struct Gav<'a> { + pub group: &'a str, + pub artifact: &'a str, + pub version: &'a str, +} + +impl Gav<'_> { + pub fn group_path(&self) -> String { + self.group.replace('.', "/") + } + + pub fn purl(&self) -> String { + format!( + "pkg:maven/{}/{}@{}", + self.group, self.artifact, self.version + ) + } + + /// A minimal pom naming exactly this GAV. + pub fn pom(&self) -> String { + format!( + "4.0.0{}\ + {}{}\n", + self.group, self.artifact, self.version + ) + } +} + +fn write(path: &Path, bytes: &[u8]) { + std::fs::create_dir_all(path.parent().expect("parent")).expect("mkdir"); + std::fs::write(path, bytes).expect("write"); +} + +/// Write `gav`'s pom and `jar` into the Coursier cache under +/// `https///…` with Coursier's checksum sidecars +/// (`.__sha1`, lowercase hex, no newline); the version directory. +pub fn write_coursier_artifact(cache: &Path, host_repo: &str, gav: Gav<'_>, jar: &[u8]) -> PathBuf { + let dir = cache + .join("https") + .join(host_repo) + .join(gav.group_path()) + .join(gav.artifact) + .join(gav.version); + let stem = format!("{}-{}", gav.artifact, gav.version); + for (name, bytes) in [ + (format!("{stem}.pom"), gav.pom().into_bytes()), + (format!("{stem}.jar"), jar.to_vec()), + ] { + write(&dir.join(&name), &bytes); + let sha1 = { + use sha1::{Digest as _, Sha1}; + hex::encode(Sha1::digest(&bytes)) + }; + write(&dir.join(format!(".{name}__sha1")), sha1.as_bytes()); + } + dir +} + +/// Write `gav` into an Ivy cache (`/cache///…`): +/// `ivy-.xml`, its `.original` pom and `jars/-.jar`; the +/// artifact directory. +pub fn write_ivy_artifact(ivy_home: &Path, gav: Gav<'_>, jar: &[u8]) -> PathBuf { + let module = ivy_home.join("cache").join(gav.group).join(gav.artifact); + let ivy = format!( + "\n\ + \n", + gav.group, gav.artifact, gav.version + ); + write( + &module.join(format!("ivy-{}.xml", gav.version)), + ivy.as_bytes(), + ); + write( + &module.join(format!("ivy-{}.xml.original", gav.version)), + gav.pom().as_bytes(), + ); + let jars = module.join("jars"); + write( + &jars.join(format!("{}-{}.jar", gav.artifact, gav.version)), + jar, + ); + jars +} + +/// A minimal sbt build at `root`: `project/build.properties` naming +/// `sbt_version` and a `build.sbt` with `build_sbt`. +pub fn write_sbt_build(root: &Path, sbt_version: &str, build_sbt: &str) { + write( + &root.join("project/build.properties"), + format!("sbt.version={sbt_version}\n").as_bytes(), + ); + write(&root.join("build.sbt"), build_sbt.as_bytes()); +} + +/// The committed evidence fixture of `version` / `scenario` +/// (`crates/socket-patch-core/tests/fixtures/sbt/evidence/`). +pub fn evidence_fixture(version: &str, scenario: &str) -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../socket-patch-core/tests/fixtures/sbt/evidence") + .join(version) + .join(scenario) +} + +/// Copy an evidence fixture's tree into `root` (the build and its +/// `target/` records), so a test runs over real sbt output. +pub fn copy_evidence(version: &str, scenario: &str, root: &Path) { + fn copy(from: &Path, to: &Path) { + for entry in std::fs::read_dir(from).expect("read fixture dir") { + let entry = entry.expect("entry"); + let (src, dst) = (entry.path(), to.join(entry.file_name())); + if entry.file_type().expect("type").is_dir() { + copy(&src, &dst); + } else { + write(&dst, &std::fs::read(&src).expect("read fixture")); + } + } + } + copy(&evidence_fixture(version, scenario), root); +} + +/// The `file:` URI sbt's update report writes for the absolute `path`: +/// `file:///C:/x` on Windows (no verbatim `\\?\` prefix, no backslashes, +/// which would also be invalid JSON escapes), `file:///x` elsewhere, with +/// the characters a URI path cannot carry percent-encoded. +pub fn file_uri(path: &Path) -> String { + let text = path.to_string_lossy(); + let text = text + .strip_prefix(r"\\?\UNC\") + .map(|rest| format!(r"\\{rest}")) + .or_else(|| text.strip_prefix(r"\\?\").map(str::to_string)) + .unwrap_or_else(|| text.to_string()) + .replace('\\', "/"); + let mut enc = String::with_capacity(text.len()); + for b in text.bytes() { + match b { + b'A'..=b'Z' + | b'a'..=b'z' + | b'0'..=b'9' + | b'/' + | b':' + | b'-' + | b'.' + | b'_' + | b'~' + | b'+' => enc.push(b as char), + _ => enc.push_str(&format!("%{b:02X}")), + } + } + if let Some(unc) = enc.strip_prefix("//") { + format!("file://{unc}") + } else if enc.starts_with('/') { + format!("file://{enc}") + } else { + format!("file:///{enc}") + } +} + +/// What `sbt update` records once a pin is wired: every `update` record +/// under `root` that resolved `gav` from the committed evidence's Coursier +/// cache (`file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/…`) +/// now resolves the suffixed `sv` with its jar at `jar` (absolute), and +/// every file under a `target/` is dated `at` (after the generated file, so +/// the evidence postdates the wiring). Returns how many records changed. +pub fn record_pinned_resolution( + root: &Path, + pins: &[(Gav<'_>, String, PathBuf)], + at: std::time::SystemTime, +) -> usize { + fn walk(dir: &Path, in_target: bool, out: &mut Vec<(PathBuf, bool)>) { + for entry in std::fs::read_dir(dir).expect("read dir").flatten() { + let path = entry.path(); + let in_target = in_target || entry.file_name() == "target"; + if entry.file_type().expect("type").is_dir() { + walk(&path, in_target, out); + } else { + out.push((path, in_target)); + } + } + } + let mut files = Vec::new(); + walk(root, false, &mut files); + let mut changed = 0; + for (path, in_target) in files { + if !in_target { + continue; + } + if path.file_name().is_some_and(|n| n == "output") { + let text = std::fs::read_to_string(&path).expect("read record"); + let mut wired = text.clone(); + for (gav, sv, jar) in pins { + let (g, a, v) = (gav.group, gav.artifact, gav.version); + let cached = format!( + "file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/{}/{a}/{v}/{a}-{v}.jar", + gav.group_path() + ); + wired = wired.replace(&cached, &file_uri(jar)).replace( + &format!("\"organization\":\"{g}\",\"name\":\"{a}\",\"revision\":\"{v}\""), + &format!("\"organization\":\"{g}\",\"name\":\"{a}\",\"revision\":\"{sv}\""), + ); + } + if wired != text { + write(&path, wired.as_bytes()); + changed += 1; + } + } + let f = std::fs::File::options() + .write(true) + .open(&path) + .expect("open record"); + f.set_modified(at).expect("date record"); + } + changed +} + +mod sbt_common_selftests { + use super::*; + + /// Windows-shaped inputs are plain strings, so every OS checks them. + #[test] + fn file_uri_spells_every_os_path_as_sbt_does() { + assert_eq!(file_uri(Path::new("/r/a b/x.jar")), "file:///r/a%20b/x.jar"); + assert_eq!( + file_uri(Path::new(r"\\?\C:\Users\RUNNER~1\x.jar")), + "file:///C:/Users/RUNNER~1/x.jar" + ); + assert_eq!(file_uri(Path::new(r"C:\a\x.jar")), "file:///C:/a/x.jar"); + assert_eq!( + file_uri(Path::new(r"\\?\UNC\srv\share\x.jar")), + "file://srv/share/x.jar" + ); + for p in ["/r/a b/x.jar", r"\\?\C:\Users\RUNNER~1\x.jar"] { + let uri = file_uri(Path::new(p)); + let back = socket_patch_core::formats::sbt::evidence::location_path(&uri).unwrap(); + assert!(back.to_string_lossy().ends_with("x.jar"), "{uri}"); + } + } +} diff --git a/crates/socket-patch-cli/tests/sbt_e2e_shared/mod.rs b/crates/socket-patch-cli/tests/sbt_e2e_shared/mod.rs new file mode 100644 index 000000000..6713970b4 --- /dev/null +++ b/crates/socket-patch-cli/tests/sbt_e2e_shared/mod.rs @@ -0,0 +1,381 @@ +//! What the two real-sbt drivers share (`sbt_build_common` for the hosted +//! capstones, `sbt_vendor_build_common` for the vendored ones): one +//! environment contract, one warm-cache layout, one hermetic native sbt +//! command ([`native_command`]: the scrub, the per-test home and every sbt +//! location pinned) with its group-killing timeout ([`wait_or_kill_group`]), +//! the path spelling Java accepts ([`java_path`], [`file_url`]), one +//! `export` classpath parser. Each driver keeps its fixture shapes (and the +//! hosted one its Docker runner); anything both must agree on lives here, +//! so the two suites can never run sbt two ways. +//! +//! `scripts/sbt-compat-matrix.sh` drives both through this contract +//! (`docs/testing/sbt-compatibility.md`). + +#![allow(dead_code)] + +use std::ffi::OsStr; +use std::path::{Path, PathBuf}; +use std::process::{Child, Command, ExitStatus}; +use std::time::{Duration, Instant}; + +/// The sbt launcher script to run (`

/bin/sbt`, or a launcher +/// directory for the Docker runner); unset = `sbt` on `PATH`. +pub const SBT_ENV: &str = "SOCKET_PATCH_SBT_E2E_SBT"; +/// An image with a JDK to run sbt in (hosted driver only). +pub const DOCKER_ENV: &str = "SOCKET_PATCH_SBT_E2E_DOCKER"; +/// The `sbt.version` every fixture pins. +pub const VERSION_ENV: &str = "SOCKET_PATCH_SBT_E2E_VERSION"; +/// Non-empty: a missing toolchain or an unreachable warm-up is a failure. +pub const REQUIRED_ENV: &str = "SOCKET_PATCH_SBT_E2E_REQUIRED"; +/// A warm cache ([`Seed`]); never required. +pub const SEED_ENV: &str = "SOCKET_PATCH_SBT_E2E_SEED"; +/// The default `sbt.version`. +pub const DEFAULT_VERSION: &str = "1.13.0"; +/// The hard limit on one sbt run. +pub const TIMEOUT: Duration = Duration::from_secs(300); + +/// What no sbt child inherits (plus every `COURSIER_*`). +pub const SCRUB: &[&str] = &[ + "SBT_OPTS", + "JAVA_OPTS", + "JVM_OPTS", + "JAVA_TOOL_OPTIONS", + "_JAVA_OPTIONS", + "JDK_JAVA_OPTIONS", + "SBT_NATIVE_CLIENT", + "CI", + "GITHUB_ACTIONS", + "CIRCLECI", + "WORKSPACE", + "TEAMCITY_VERSION", + "TRAVIS", + "BUILD_NUMBER", +]; + +/// `path` as Java accepts it: Windows' verbatim prefix (`\\?\C:\x`, +/// `\\?\UNC\srv\share`), which `std::fs::canonicalize` returns there, is +/// dropped (Java NIO rejects it: `InvalidPathException`). +pub fn java_path(path: &Path) -> PathBuf { + let Some(text) = path.to_str() else { + return path.to_path_buf(); + }; + if let Some(rest) = text.strip_prefix(r"\\?\UNC\") { + PathBuf::from(format!(r"\\{rest}")) + } else if let Some(rest) = text.strip_prefix(r"\\?\") { + PathBuf::from(rest) + } else { + path.to_path_buf() + } +} + +/// `path` canonicalized (a symlinked macOS temp dir resolved, so the +/// evidence sbt writes names the paths the CLI reads), in Java's spelling. +pub fn canonical(path: &Path) -> PathBuf { + java_path(&std::fs::canonicalize(path).expect("canonicalize")) +} + +/// The `file:` URL of the directory `dir`: `file:///C:/x` on Windows (a +/// drive letter is no host, and backslashes are no URL), `file:///x` +/// elsewhere. +pub fn file_url(dir: &Path) -> String { + let text = java_path(dir).to_string_lossy().replace('\\', "/"); + if let Some(unc) = text.strip_prefix("//") { + format!("file://{unc}") + } else if text.starts_with('/') { + format!("file://{text}") + } else { + format!("file:///{text}") + } +} + +/// Where one test's sbt state lives: every location sbt (and the JVM's +/// `user.home`, which `Resolver.mavenLocal` and `~/.sbt/repositories` +/// follow) would otherwise take from the machine. +#[derive(Debug, Clone)] +pub struct Locations { + /// `HOME`, `USERPROFILE` and `-Duser.home`; `mavenLocal` is + /// `/.m2/repository` (also `-Dmaven.repo.local`). + pub home: PathBuf, + pub global_base: PathBuf, + pub boot: PathBuf, + pub ivy_home: PathBuf, + /// `COURSIER_CACHE`, the only Coursier location. + pub coursier: PathBuf, +} + +/// The launcher and JVM flags pinning sbt to `loc` (no server, batch, +/// plain logs), for sbt `version`; both runners pass them. +pub fn hermetic_args(loc: &Locations, version: &str) -> Vec { + let d = |k: &str, v: &Path| format!("-D{k}={}", java_path(v).display()); + let mut out = vec![ + "-batch".to_string(), + "-no-colors".to_string(), + d("user.home", &loc.home), + d("maven.repo.local", &loc.home.join(".m2").join("repository")), + d("sbt.global.base", &loc.global_base), + d("sbt.boot.directory", &loc.boot), + d("sbt.ivy.home", &loc.ivy_home), + "-Dsbt.server.autostart=false".to_string(), + "-Dsbt.supershell=false".to_string(), + "-Dsbt.log.noformat=true".to_string(), + ]; + // sbt 2 otherwise starts a client against a server. + if line(version) == "2" { + out.push("--server".to_string()); + } + out +} + +/// `sbt` (the launcher) in `cwd`, hermetic: the [`SCRUB`] list, every +/// `COURSIER_*` and `SOCKET_*` variable removed, `HOME` / `USERPROFILE` / +/// `COURSIER_CACHE` and [`hermetic_args`] pinned to `loc`, and (on Unix) its +/// own process group so [`wait_or_kill_group`] kills the JVM the launcher +/// script forks too. The caller adds the sbt commands and the stdio. +pub fn native_command(sbt: &OsStr, cwd: &Path, loc: &Locations, version: &str) -> Command { + let mut cmd = Command::new(sbt); + for (key, _) in std::env::vars_os() { + let k = key.to_string_lossy(); + if k.starts_with("COURSIER_") || k.starts_with("SOCKET_") { + cmd.env_remove(&key); + } + } + for key in SCRUB { + cmd.env_remove(key); + } + cmd.current_dir(cwd) + .env("HOME", java_path(&loc.home)) + .env("USERPROFILE", java_path(&loc.home)) + .env("COURSIER_CACHE", java_path(&loc.coursier)) + .args(hermetic_args(loc, version)); + #[cfg(unix)] + std::os::unix::process::CommandExt::process_group(&mut cmd, 0); + cmd +} + +/// Wait for `child`; past `limit` kill its whole process group (Unix; the +/// child alone elsewhere) and return `None`. +pub fn wait_or_kill_group(child: &mut Child, limit: Duration) -> Option { + let started = Instant::now(); + loop { + if let Some(status) = child.try_wait().expect("wait sbt") { + return Some(status); + } + if started.elapsed() > limit { + #[cfg(unix)] + // SAFETY: signals the group `process_group(0)` made. + unsafe { + libc::killpg(child.id() as libc::pid_t, libc::SIGKILL); + } + let _ = child.kill(); + let _ = child.wait(); + return None; + } + std::thread::sleep(Duration::from_millis(200)); + } +} + +/// `key`'s value when set and not blank. +pub fn env_value(key: &str) -> Option { + std::env::var(key).ok().filter(|v| !v.trim().is_empty()) +} + +/// Whether [`REQUIRED_ENV`] is set (CI legs: never skip). +pub fn required() -> bool { + env_value(REQUIRED_ENV).is_some() +} + +/// The `sbt.version` under test ([`VERSION_ENV`], default +/// [`DEFAULT_VERSION`]). +pub fn version() -> String { + env_value(VERSION_ENV).unwrap_or_else(|| DEFAULT_VERSION.to_string()) +} + +/// The syntax line of `version`: `0.13`, `1` or `2`. +pub fn line(version: &str) -> &'static str { + if version.starts_with("0.13") { + "0.13" + } else if version.starts_with("2.") { + "2" + } else { + "1" + } +} + +/// Whether `version` resolves through Ivy (0.13, 1.0–1.2). +pub fn uses_ivy(version: &str) -> bool { + line(version) == "0.13" + || ["1.0.", "1.1.", "1.2."] + .iter() + .any(|p| version.starts_with(p)) +} + +/// The warm cache [`SEED_ENV`] names, in either layout: +/// +/// - a home directory (`.cache/coursier/v1`, `.ivy2`, `.sbt/boot`), such as +/// `/root` in `tests/docker/Dockerfile.sbt`, whose image bakes warm +/// caches there; +/// - a flat cache directory (`coursier/v1`, `ivy2`, `boot`). +/// +/// A layout part that does not exist is `None`. +#[derive(Debug, Clone, Default)] +pub struct Seed { + pub coursier: Option, + pub ivy: Option, + pub boot: Option, +} + +impl Seed { + pub fn from_env() -> Option { + env_value(SEED_ENV).map(|s| Self::at(Path::new(&s))) + } + + pub fn at(seed: &Path) -> Self { + let first = |rels: &[&str]| rels.iter().map(|rel| seed.join(rel)).find(|p| p.is_dir()); + Seed { + coursier: first(&[".cache/coursier/v1", "coursier/v1"]), + ivy: first(&[".ivy2", "ivy2"]), + boot: first(&[".sbt/boot", "boot"]), + } + } +} + +/// Hard-link every file of `from` into `to` (copy where linking fails). +pub fn link_tree(from: &Path, to: &Path) { + std::fs::create_dir_all(to).unwrap(); + for entry in std::fs::read_dir(from).unwrap() { + let entry = entry.unwrap(); + let (src, dst) = (entry.path(), to.join(entry.file_name())); + let ty = entry.file_type().unwrap(); + if ty.is_dir() { + link_tree(&src, &dst); + } else if ty.is_file() && !dst.exists() && std::fs::hard_link(&src, &dst).is_err() { + std::fs::copy(&src, &dst).unwrap(); + } + } +} + +/// The jar paths an `export ` printed in `output`: sbt 0.13 / +/// 1.x print one `:`-joined (`;` on Windows) path list, sbt 2 prints +/// `List(a, b)` with the virtual roots `${BASE}` (the build at `base`) and +/// `${CSR_CACHE}` (the Coursier cache `cs`). Log lines (`[info] …`) are +/// skipped. +pub fn export_classpath(output: &str, base: &Path, cs: &Path) -> Vec { + let output = output + .replace("${BASE}", &base.to_string_lossy()) + .replace("${CSR_CACHE}", &cs.to_string_lossy()); + let sep: &[char] = if cfg!(windows) { + &[';', ','] + } else { + &[':', ';', ','] + }; + output + .lines() + .filter(|l| !l.starts_with('[') && l.contains(".jar")) + .map(|l| { + l.trim() + .strip_prefix("List(") + .and_then(|l| l.strip_suffix(')')) + .unwrap_or(l.trim()) + .to_string() + }) + .flat_map(|l| { + l.split(sep) + .map(|p| p.trim().to_string()) + .collect::>() + }) + .filter(|p| p.ends_with(".jar") && Path::new(p).is_absolute()) + .map(PathBuf::from) + .collect() +} + +/// Run in each binary that includes this module. +mod tests { + use super::*; + + #[test] + fn export_classpath_reads_every_line_shape() { + // This OS's absolute spelling and classpath separator (`C:/…`, `;` + // on Windows, where `/a` is not absolute). + let (d, sep) = if cfg!(windows) { + ("C:", ";") + } else { + ("", ":") + }; + let abs = |p: &str| PathBuf::from(format!("{d}{p}")); + let base = abs("/w/p"); + let cs = abs("/h/cs"); + let one = format!("[info] loading\n{d}/a/x.jar{sep}{d}/b/y.jar\n"); + assert_eq!( + export_classpath(&one, &base, &cs), + [abs("/a/x.jar"), abs("/b/y.jar")] + ); + let two = "List(${BASE}/lib/z.jar, ${CSR_CACHE}/https/r/y.jar)\n"; + assert_eq!( + export_classpath(two, &base, &cs), + [abs("/w/p/lib/z.jar"), abs("/h/cs/https/r/y.jar")] + ); + } + + #[test] + fn java_spellings_drop_the_verbatim_prefix() { + assert_eq!( + java_path(Path::new(r"\\?\C:\t\x")), + PathBuf::from(r"C:\t\x") + ); + assert_eq!( + java_path(Path::new(r"\\?\UNC\srv\share\x")), + PathBuf::from(r"\\srv\share\x") + ); + assert_eq!(java_path(Path::new("/t/x")), PathBuf::from("/t/x")); + assert_eq!(file_url(Path::new("/t/central")), "file:///t/central"); + assert_eq!( + file_url(Path::new(r"\\?\C:\t\central")), + "file:///C:/t/central" + ); + assert_eq!(file_url(Path::new(r"\\srv\share\c")), "file://srv/share/c"); + } + + #[test] + fn hermetic_args_pin_every_location() { + let loc = Locations { + home: PathBuf::from("/w/home"), + global_base: PathBuf::from("/w/g"), + boot: PathBuf::from("/w/boot"), + ivy_home: PathBuf::from("/w/ivy"), + coursier: PathBuf::from("/w/cs"), + }; + let args = hermetic_args(&loc, "1.13.0"); + for want in [ + "-Duser.home=/w/home", + "-Dsbt.global.base=/w/g", + "-Dsbt.boot.directory=/w/boot", + "-Dsbt.ivy.home=/w/ivy", + ] { + assert!(args.iter().any(|a| a == want), "{want}: {args:?}"); + } + assert!(args + .iter() + .any(|a| a.starts_with("-Dmaven.repo.local=") && a.ends_with("repository"))); + assert!(!args.contains(&"--server".to_string())); + assert!(hermetic_args(&loc, "2.0.9").contains(&"--server".to_string())); + } + + #[test] + fn seed_reads_both_layouts() { + let tmp = tempfile::tempdir().unwrap(); + let home = tmp.path().join("home"); + for rel in [".cache/coursier/v1", ".ivy2", ".sbt/boot"] { + std::fs::create_dir_all(home.join(rel)).unwrap(); + } + let s = Seed::at(&home); + assert_eq!(s.coursier, Some(home.join(".cache/coursier/v1"))); + assert_eq!(s.boot, Some(home.join(".sbt/boot"))); + let flat = tmp.path().join("flat"); + for rel in ["coursier/v1", "ivy2"] { + std::fs::create_dir_all(flat.join(rel)).unwrap(); + } + let s = Seed::at(&flat); + assert_eq!(s.ivy, Some(flat.join("ivy2"))); + assert_eq!(s.boot, None); + } +} diff --git a/crates/socket-patch-cli/tests/sbt_vendor_build_common/mod.rs b/crates/socket-patch-cli/tests/sbt_vendor_build_common/mod.rs new file mode 100644 index 000000000..ff219916b --- /dev/null +++ b/crates/socket-patch-cli/tests/sbt_vendor_build_common/mod.rs @@ -0,0 +1,286 @@ +//! Real-sbt plumbing for the vendored sbt capstones (`e2e_sbt_vendor_build`). +//! +//! Toolchain selection, mirroring the Maven capstones' `SOCKET_PATCH_MAVEN_E2E_*`: +//! +//! * `SOCKET_PATCH_SBT_E2E_SBT` — the sbt launcher to drive (any launcher +//! runs any `sbt.version`); unset/empty = `sbt` on `PATH`. +//! * `SOCKET_PATCH_SBT_E2E_VERSION` — the `sbt.version` every fixture pins +//! in `project/build.properties` (default 1.13.0); the build must report +//! exactly it (`sbtVersion`). +//! * `SOCKET_PATCH_SBT_E2E_REQUIRED` — when set and non-empty, a missing +//! launcher or an unreachable Maven Central (the warm-up `update`) is a +//! hard failure instead of a printed SKIP. +//! * `SOCKET_PATCH_SBT_E2E_SEED` — an optional warm cache in either layout +//! `sbt_e2e_shared::Seed` reads (a home with `.sbt/boot`, `.ivy2`, +//! `.cache/coursier/v1`, or a flat `boot`, `ivy2`, `coursier/v1`): its +//! Coursier and Ivy caches hard-linked (copied when linking fails) into +//! each test's home, never written through; its boot directory shared +//! (sbt locks it), so a line the seed lacks boots once per run, not once +//! per test. +//! +//! The environment contract is shared with the hosted driver +//! (`sbt_e2e_shared`); unlike it, this driver runs sbt natively only (the +//! matrix script runs the whole test binary inside `Dockerfile.sbt`). +//! +//! Every sbt run is hermetic (`sbt_e2e_shared::native_command`, shared with +//! the hosted driver): a per-test home passed explicitly (`HOME`, +//! `-Duser.home`, `-Dmaven.repo.local`, `-Dsbt.global.base`, +//! `-Dsbt.boot.directory`, `-Dsbt.ivy.home`, and `COURSIER_CACHE` as the +//! only Coursier location), `-batch -no-colors`, no sbt server (`--server` +//! on 2.x, which otherwise starts a client), `SBT_OPTS` / `JAVA_OPTS` / +//! `JAVA_TOOL_OPTIONS` / `COURSIER_*` / `SOCKET_*` and the CI markers +//! scrubbed, and a hard timeout that kills the whole process group. + +#![allow(dead_code)] + +use std::ffi::OsString; +use std::path::{Path, PathBuf}; +use std::process::{Command, Output, Stdio}; +use std::time::Duration; + +#[path = "../sbt_e2e_shared/mod.rs"] +pub mod shared; +pub use shared::{line, required, version, REQUIRED_ENV, SBT_ENV, TIMEOUT}; + +/// Skip (println) locally; fail when the leg is required. +pub fn skip(suite: &str, why: &str) { + assert!( + !required(), + "{suite}: {REQUIRED_ENV} is set but the sbt capstone cannot run: {why}" + ); + println!("SKIP {suite}: {why}"); +} + +/// The isolated home of one test: caches and global base live here. +pub struct SbtHome { + pub root: PathBuf, + /// The seed's boot directory (shared), else the home's own. + boot: PathBuf, +} + +impl SbtHome { + /// A fresh home under `dir`, seeded from [`SEED_ENV`] when set. + pub fn new(dir: &Path) -> Self { + let root = dir.join("sbt-home"); + std::fs::create_dir_all(&root).unwrap(); + let mut home = Self { + boot: root.join(".sbt/boot"), + root, + }; + // Either seed layout (`shared::Seed`): the caches linked into this + // home's, the boot directory shared. + if let Some(seed) = shared::Seed::from_env() { + for (src, to) in [ + (&seed.coursier, home.coursier_cache()), + (&seed.ivy, home.ivy_home()), + ] { + if let Some(src) = src { + shared::link_tree(src, &to); + } + } + if let Some(boot) = &seed.boot { + home.boot = shared::canonical(boot); + } + } + std::fs::create_dir_all(&home.boot).unwrap(); + home + } + + pub fn boot(&self) -> PathBuf { + self.boot.clone() + } + + pub fn global_base(&self, version: &str) -> PathBuf { + let series = match line(version) { + "0.13" => "0.13", + "2" => "2", + _ => "1.0", + }; + self.root.join(".sbt").join(series) + } + + pub fn ivy_home(&self) -> PathBuf { + self.root.join(".ivy2") + } + + pub fn coursier_cache(&self) -> PathBuf { + self.root.join(".cache/coursier/v1") + } + + /// The pristine `-.{jar,pom}` of `g:a:v` as sbt cached it + /// (Coursier, then Ivy's `jars/` + `ivy-.xml.original`). + pub fn cached(&self, g: &str, a: &str, v: &str) -> Option<(Vec, Vec)> { + let gpath = g.replace('.', "/"); + let cs = self + .coursier_cache() + .join("https/repo1.maven.org/maven2") + .join(&gpath) + .join(a) + .join(v); + let pair = + |jar: PathBuf, pom: PathBuf| Some((std::fs::read(jar).ok()?, std::fs::read(pom).ok()?)); + pair( + cs.join(format!("{a}-{v}.jar")), + cs.join(format!("{a}-{v}.pom")), + ) + .or_else(|| { + let ivy = self.ivy_home().join("cache").join(g).join(a); + pair( + ivy.join("jars").join(format!("{a}-{v}.jar")), + ivy.join(format!("ivy-{v}.xml.original")), + ) + }) + } +} + +/// The selected launcher. +pub struct Sbt { + program: OsString, + pub version: String, +} + +impl Sbt { + /// Probe the launcher (`sbt --script-version`). `None` = skipped. + pub fn detect(suite: &str) -> Option { + let program: OsString = std::env::var_os(SBT_ENV) + .filter(|v| !v.is_empty()) + .unwrap_or_else(|| if cfg!(windows) { "sbt.bat" } else { "sbt" }.into()); + match Command::new(&program) + .arg("--script-version") + .stdin(Stdio::null()) + .output() + { + Ok(out) if out.status.success() => Some(Sbt { + program, + version: version(), + }), + Ok(out) => { + skip( + suite, + &format!("`{}` failed: {}", program.to_string_lossy(), dump(&out)), + ); + None + } + Err(e) => { + skip( + suite, + &format!("`{}` did not run: {e}", program.to_string_lossy()), + ); + None + } + } + } + + /// `sbt ` in `cwd` with `home`'s caches; `extra` are more + /// `-D` / launcher flags. + pub fn run(&self, cwd: &Path, home: &SbtHome, extra: &[&str], commands: &[&str]) -> Output { + let loc = shared::Locations { + home: home.root.clone(), + global_base: home.global_base(&self.version), + boot: home.boot(), + ivy_home: home.ivy_home(), + coursier: home.coursier_cache(), + }; + let mut cmd = shared::native_command(&self.program, cwd, &loc, &self.version); + cmd.args(extra).args(commands); + run_with_timeout(cmd, TIMEOUT) + } + + /// The `export` command for the compile dependency classpath. + pub fn classpath_command(&self, project: Option<&str>) -> String { + let key = if line(&self.version) == "2" { + "Compile/dependencyClasspath" + } else { + "compile:dependencyClasspath" + }; + match project { + Some(p) => format!("export {p}/{key}"), + None => format!("export {key}"), + } + } + + /// The jars on the exported classpath in `out` (the last line naming + /// `.jar` files). sbt 2 prints `List(${BASE}/…, ${CSR_CACHE}/…)`: the + /// virtual roots resolve against the build at `base` and `home`'s + /// Coursier cache. + pub fn classpath(out: &Output, base: &Path, home: &SbtHome) -> Vec { + let stdout = String::from_utf8_lossy(&out.stdout); + // The last line naming jars is the export's. + let Some(last) = stdout + .lines() + .rev() + .find(|l| l.contains(".jar") && !l.starts_with('[')) + else { + return Vec::new(); + }; + shared::export_classpath(last, base, &home.coursier_cache()) + } +} + +/// Run `cmd` (a [`shared::native_command`], its own process group), +/// killing the whole group after `limit`. +pub fn run_with_timeout(mut cmd: Command, limit: Duration) -> Output { + cmd.stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + let mut child = cmd.spawn().expect("spawn sbt"); + let (mut stdout, mut stderr) = (child.stdout.take().unwrap(), child.stderr.take().unwrap()); + let out_reader = std::thread::spawn(move || { + let mut buf = Vec::new(); + std::io::Read::read_to_end(&mut stdout, &mut buf).ok(); + buf + }); + let err_reader = std::thread::spawn(move || { + let mut buf = Vec::new(); + std::io::Read::read_to_end(&mut stderr, &mut buf).ok(); + buf + }); + let Some(status) = shared::wait_or_kill_group(&mut child, limit) else { + panic!("sbt exceeded {}s and was killed", limit.as_secs()); + }; + Output { + status, + stdout: out_reader.join().unwrap(), + stderr: err_reader.join().unwrap(), + } +} + +pub fn ok(out: &Output) -> bool { + out.status.success() +} + +pub fn dump(out: &Output) -> String { + format!( + "exit={:?}\n--- stdout ---\n{}\n--- stderr ---\n{}", + out.status.code(), + String::from_utf8_lossy(&out.stdout), + String::from_utf8_lossy(&out.stderr) + ) +} + +/// Directories sbt writes that a checkout never carries. +pub const BUILD_OUTPUT_DIRS: &[&str] = &["target", ".bsp", ".bloop", ".metals", "project/project"]; + +/// A Java-only sbt build at `root` depending on `deps` (`"g" % "a" % "v"` +/// literals), with `subprojects` aggregated below it. +pub fn write_build(root: &Path, version: &str, deps: &[&str], subprojects: &[&str]) { + std::fs::create_dir_all(root.join("project")).unwrap(); + std::fs::write( + root.join("project/build.properties"), + format!("sbt.version={version}\n"), + ) + .unwrap(); + let deps = deps.join(", "); + let mut build = + String::from("ThisBuild / autoScalaLibrary := false\nThisBuild / crossPaths := false\n"); + if line(version) == "0.13" { + build = "autoScalaLibrary in ThisBuild := false\ncrossPaths in ThisBuild := false\n".into(); + } + build.push_str(&format!("libraryDependencies ++= Seq({deps})\n")); + for sub in subprojects { + build.push_str(&format!( + "lazy val {sub} = project\nlazy val root = (project in file(\".\")).aggregate({sub})\n" + )); + } + std::fs::write(root.join("build.sbt"), build).unwrap(); +} diff --git a/crates/socket-patch-core/src/crawlers/coursier_cache.rs b/crates/socket-patch-core/src/crawlers/coursier_cache.rs new file mode 100644 index 000000000..ed37591ab --- /dev/null +++ b/crates/socket-patch-core/src/crawlers/coursier_cache.rs @@ -0,0 +1,718 @@ +//! Coursier's download cache (sbt 1.3+, sbt 2, Mill, scala-cli, Bloop): +//! where it is, and the per-repository Maven2 roots inside it. +//! +//! A cache directory holds one tree per repository URL, +//! `///////-.{pom,jar}`, +//! each a plain Maven2 layout once its root is known. [`repo_roots`] finds +//! those roots; [`MavenCrawler`](super::MavenCrawler) crawls each with its +//! Maven2 logic. Checksum sidecars sit beside each file +//! (`.__sha1`, …), resynced after a patch by +//! `patch::sidecars::coursier`. +//! +//! Locations are a pure function of the target OS, an environment lookup, +//! the home directory and the project directory ([`coursier_cache_dirs`]), +//! with a thin adapter for this process ([`process_cache_dirs`]), so every +//! OS's table is testable on any host. The JVM option sources it reads +//! (`$JAVA_OPTS`, `$SBT_OPTS`, `/.jvmopts`, `/.sbtopts`) are +//! shared with the Ivy cache lookup through [`jvm_option_values`]. + +use std::collections::HashSet; +use std::path::{Path, PathBuf}; + +use super::jvm_cache::debug_log; +use super::maven_crawler::{is_safe_maven_coordinate, parse_pom_group_artifact_version}; +use crate::utils::fs::read_regular_to_bytes_sync; + +/// The OS whose default cache locations apply (a parameter so every OS's +/// table is testable on any host). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TargetOs { + Linux, + MacOs, + Windows, +} + +impl TargetOs { + /// The OS this binary runs on (other Unixes use the Linux table). + pub fn host() -> Self { + if cfg!(windows) { + TargetOs::Windows + } else if cfg!(target_os = "macos") { + TargetOs::MacOs + } else { + TargetOs::Linux + } + } +} + +/// How deep below a host directory [`repo_roots`] looks for a pom. +const MAX_DEPTH: usize = 24; + +/// How many directory entries [`repo_roots`] reads per host before giving +/// up on the rest of that host's tree. +const MAX_ENTRIES_PER_HOST: usize = 200_000; + +/// Every existing Coursier cache directory, deduplicated canonically, with +/// the source that named it (`"COURSIER_CACHE"`, `".jvmopts"`, `"default"`, +/// …), in precedence order: `$COURSIER_CACHE`; `-Dcoursier.cache=` in +/// `$JAVA_OPTS`, `$SBT_OPTS`, `/.jvmopts`, `/.sbtopts` (`-J` +/// prefix allowed); `-Dsbt.coursier.home=` → `/cache`; the OS default; +/// the legacy `~/.coursier/cache/v1`. An empty variable counts as unset. +/// +/// Every source is kept, not only the first: sbt, Mill and scala-cli on the +/// same machine may each have been pointed at a different cache, and each +/// cache's packages must be discoverable, and `apply` / `rollback` act on +/// a GAV's copy in every root (the Maven every-copy fan-out over +/// `MavenCrawler::get_maven_copy_paths`). A relative value resolves +/// against `cwd` (the JVM's working directory when the build runs there). +pub fn coursier_cache_dirs( + os: TargetOs, + env: &dyn Fn(&str) -> Option, + home: Option<&Path>, + cwd: &Path, +) -> Vec<(PathBuf, &'static str)> { + let mut candidates: Vec<(PathBuf, &'static str)> = Vec::new(); + if let Some(dir) = non_empty(env, "COURSIER_CACHE") { + candidates.push((cwd.join(dir), "COURSIER_CACHE")); + } + for (value, source) in jvm_option_values(env, cwd, "coursier.cache") { + candidates.push((cwd.join(value), source)); + } + for (value, source) in jvm_option_values(env, cwd, "sbt.coursier.home") { + candidates.push((cwd.join(value).join("cache"), source)); + } + match os { + TargetOs::Linux => match non_empty(env, "XDG_CACHE_HOME") { + Some(xdg) => candidates.push((PathBuf::from(xdg).join("coursier/v1"), "default")), + None => { + if let Some(home) = home { + candidates.push((home.join(".cache/coursier/v1"), "default")); + } + } + }, + TargetOs::MacOs => { + if let Some(home) = home { + candidates.push((home.join("Library/Caches/Coursier/v1"), "default")); + } + } + TargetOs::Windows => { + let local = non_empty(env, "LOCALAPPDATA") + .map(PathBuf::from) + .or_else(|| home.map(|h| h.join("AppData").join("Local"))); + if let Some(local) = local { + for cache in ["Cache", "cache"] { + candidates.push((local.join("Coursier").join(cache).join("v1"), "default")); + } + } + } + } + if let Some(home) = home { + candidates.push((home.join(".coursier/cache/v1"), "legacy")); + } + existing_dedup(candidates) +} + +/// The per-repository Maven2 roots under `cache_dir`: a bounded DFS (depth +/// 24, no dot-names, no symlinks, 200 000 entries per host) accepting a +/// root only where a pom's own coordinates spell the path below it. +/// +/// For each `-.pom` in a directory `<…>///`, the pom's content +/// coordinates `(g, a, v)` must match its directory names and the path must +/// end in `//`; what is left above is the root, accepted +/// only at or below the host directory. The walk then skips everything +/// below an accepted root (the Maven2 crawl covers it). An Ivy-pattern +/// subtree (`…/ivy-releases////jars/…`, no pom) and a +/// pom whose content names other coordinates than its path yield no root. +pub fn repo_roots(cache_dir: &Path) -> Vec { + repo_roots_capped(cache_dir, MAX_ENTRIES_PER_HOST) +} + +fn repo_roots_capped(cache_dir: &Path, cap: usize) -> Vec { + let mut roots = Vec::new(); + for scheme in ["https", "http"] { + let scheme_dir = cache_dir.join(scheme); + if !is_real_dir(&scheme_dir) { + continue; + } + for host in sorted_children(&scheme_dir) + .into_iter() + .filter(|(_, is_dir)| *is_dir) + { + roots.extend(host_roots(&host.0, cap)); + } + } + roots +} + +/// [`repo_roots`] for one host directory. +fn host_roots(host: &Path, cap: usize) -> Vec { + let mut roots: Vec = Vec::new(); + let mut stack: Vec<(PathBuf, usize)> = vec![(host.to_path_buf(), 0)]; + let mut read = 0usize; + while let Some((dir, depth)) = stack.pop() { + let children = sorted_children(&dir); + read += children.len(); + if read > cap { + debug_log(&format!( + "Coursier cache host {} has more than {cap} entries; not looking further", + host.display() + )); + break; + } + let mut subdirs = Vec::new(); + let mut accepted = None; + for (path, is_dir) in children { + if is_dir { + if depth < MAX_DEPTH { + subdirs.push(path); + } + continue; + } + if let Some(root) = pom_root(&path, host) { + accepted = Some(root); + break; + } + } + if let Some(root) = accepted { + // Everything below the root is the Maven2 crawl's. + stack.retain(|(pending, _)| !pending.starts_with(&root)); + roots.push(root); + continue; + } + // Reverse so the stack pops in name order. + for sub in subdirs.into_iter().rev() { + if !roots.iter().any(|r| sub.starts_with(r)) { + stack.push((sub, depth + 1)); + } + } + } + roots +} + +/// The repository root `pom` (a regular file) proves, if any. +fn pom_root(pom: &Path, host: &Path) -> Option { + let file = pom.file_name()?.to_str()?; + let version_dir = pom.parent()?; + let version = version_dir.file_name()?.to_str()?; + let artifact_dir = version_dir.parent()?; + let artifact = artifact_dir.file_name()?.to_str()?; + if file != format!("{artifact}-{version}.pom") { + return None; + } + let bytes = read_regular_to_bytes_sync(pom).ok()?; + let (g, a, v) = parse_pom_group_artifact_version(&String::from_utf8_lossy(&bytes))?; + if a != artifact || v != version || !is_safe_maven_coordinate(&g, &a, &v) { + return None; + } + let mut root = artifact_dir.parent()?; + for segment in g.split('.').rev() { + if root.file_name()?.to_str()? != segment { + return None; + } + root = root.parent()?; + } + root.starts_with(host).then(|| root.to_path_buf()) +} + +/// Whether `p` is a Coursier cache directory (holds `https/` or `http/` +/// host trees) rather than one repository root inside it. +pub fn is_coursier_cache_dir(p: &Path) -> bool { + ["https", "http"] + .iter() + .any(|scheme| is_real_dir(&p.join(scheme))) +} + +/// [`coursier_cache_dirs`] for this process (host OS, real environment and +/// home), paths only. A source the repository controls (`.jvmopts`, +/// `.sbtopts`) is named in the `SOCKET_DEBUG` log. +pub fn process_cache_dirs(cwd: &Path) -> Vec { + let env = |name: &str| std::env::var(name).ok().filter(|v| !v.is_empty()); + let home = process_home(); + coursier_cache_dirs(TargetOs::host(), &env, home.as_deref(), cwd) + .into_iter() + .map(|(dir, source)| { + log_source("Coursier cache", &dir, source); + dir + }) + .collect() +} + +/// This process's home directory, only when absolute: the shared +/// `home_dir()` fallback (`~`) would resolve every default location +/// against the process's working directory. +pub(crate) fn process_home() -> Option { + Some(crate::utils::fs::home_dir()).filter(|h| h.is_absolute()) +} + +/// Debug-log a cache location and the source that named it; a location a +/// repository file chose is called out as such. +pub(crate) fn log_source(what: &str, dir: &Path, source: &str) { + if REPO_SOURCES.contains(&source) { + debug_log(&format!( + "{what} {} named by the repository's {source}", + dir.display() + )); + } else { + debug_log(&format!("{what} {} (from {source})", dir.display())); + } +} + +/// The option sources a checkout itself controls. +const REPO_SOURCES: &[&str] = &[".jvmopts", ".sbtopts"]; + +/// The value of every `-D=` in the JVM option sources, in +/// precedence order (`$JAVA_OPTS`, `$SBT_OPTS`, `/.jvmopts`, +/// `/.sbtopts`), the last one per source winning as on a JVM command +/// line. A `-J` prefix (the sbt launcher's pass-through) is accepted +/// everywhere; `#` comment lines and empty values are skipped; one layer +/// of matching quotes around a value is removed. Files are read FIFO-safe. +pub(crate) fn jvm_option_values( + env: &dyn Fn(&str) -> Option, + cwd: &Path, + key: &str, +) -> Vec<(String, &'static str)> { + let mut sources: Vec<(String, &'static str)> = Vec::new(); + for var in ["JAVA_OPTS", "SBT_OPTS"] { + if let Some(value) = non_empty(env, var) { + sources.push((value, var)); + } + } + for (file, source) in [(".jvmopts", ".jvmopts"), (".sbtopts", ".sbtopts")] { + if let Ok(bytes) = read_regular_to_bytes_sync(&cwd.join(file)) { + sources.push((String::from_utf8_lossy(&bytes).into_owned(), source)); + } + } + let prefix = format!("-D{key}="); + sources + .into_iter() + .filter_map(|(text, source)| { + text.lines() + .filter(|line| !line.trim_start().starts_with('#')) + .flat_map(str::split_whitespace) + .filter_map(|token| { + let token = token.strip_prefix("-J").unwrap_or(token); + let value = unquote(token.strip_prefix(&prefix)?); + (!value.is_empty()).then(|| value.to_string()) + }) + .next_back() + .map(|value| (value, source)) + }) + .collect() +} + +fn unquote(value: &str) -> &str { + for quote in ['"', '\''] { + if let Some(inner) = value + .strip_prefix(quote) + .and_then(|v| v.strip_suffix(quote)) + { + return inner; + } + } + value +} + +/// `env(name)`, an empty value counting as unset. +pub(crate) fn non_empty(env: &dyn Fn(&str) -> Option, name: &str) -> Option { + env(name).filter(|v| !v.is_empty()) +} + +/// The candidates that are existing directories, first occurrence of each +/// canonical path kept. +pub(crate) fn existing_dedup(candidates: Vec<(PathBuf, T)>) -> Vec<(PathBuf, T)> { + let mut seen = HashSet::new(); + candidates + .into_iter() + .filter(|(dir, _)| { + std::fs::canonicalize(dir).is_ok_and(|real| real.is_dir() && seen.insert(real)) + }) + .collect() +} + +/// `path` is a directory and not a symbolic link. +fn is_real_dir(path: &Path) -> bool { + std::fs::symlink_metadata(path).is_ok_and(|m| m.is_dir()) +} + +/// The children of `dir` that are directories or regular files (never +/// symbolic links, never dot-names), sorted by name, each with whether it +/// is a directory. +fn sorted_children(dir: &Path) -> Vec<(PathBuf, bool)> { + let Some((entries, _complete)) = crate::utils::fs::read_dir_entries_sync(dir) else { + return Vec::new(); + }; + let mut out: Vec<(PathBuf, bool)> = entries + .into_iter() + .filter(|e| !e.file_name().to_string_lossy().starts_with('.')) + .filter_map(|e| { + let kind = e.file_type().ok()?; + (kind.is_dir() || kind.is_file()).then(|| (e.path(), kind.is_dir())) + }) + .collect(); + out.sort(); + out +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + + fn env_of(pairs: &[(&str, &str)]) -> impl Fn(&str) -> Option { + let map: HashMap = pairs + .iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect(); + move |name: &str| map.get(name).cloned() + } + + fn mkdir(p: &Path) -> PathBuf { + std::fs::create_dir_all(p).unwrap(); + p.to_path_buf() + } + + fn write(p: &Path, bytes: &[u8]) { + std::fs::create_dir_all(p.parent().unwrap()).unwrap(); + std::fs::write(p, bytes).unwrap(); + } + + fn pom(g: &str, a: &str, v: &str) -> String { + format!("{g}{a}{v}") + } + + /// Write `g:a:v` (pom, jar, a hidden sidecar) under `root`. + fn artifact(root: &Path, g: &str, a: &str, v: &str) -> PathBuf { + let dir = root.join(g.replace('.', "/")).join(a).join(v); + write(&dir.join(format!("{a}-{v}.pom")), pom(g, a, v).as_bytes()); + write(&dir.join(format!("{a}-{v}.jar")), b"jar"); + write(&dir.join(format!(".{a}-{v}.jar__sha1")), b"0000"); + dir + } + + #[test] + fn host_os_is_one_of_the_tables() { + let os = TargetOs::host(); + assert!(matches!( + os, + TargetOs::Linux | TargetOs::MacOs | TargetOs::Windows + )); + assert_eq!( + TargetOs::host() == TargetOs::Windows, + cfg!(windows), + "host table" + ); + } + + #[test] + fn os_default_tables() { + let t = tempfile::tempdir().unwrap(); + let home = t.path().join("home"); + let cwd = mkdir(&t.path().join("proj")); + let linux = mkdir(&home.join(".cache/coursier/v1")); + let mac = mkdir(&home.join("Library/Caches/Coursier/v1")); + let legacy = mkdir(&home.join(".coursier/cache/v1")); + let local = t.path().join("local"); + let win = mkdir(&local.join("Coursier/Cache/v1")); + let none = env_of(&[]); + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &none, Some(&home), &cwd), + vec![(linux.clone(), "default"), (legacy.clone(), "legacy")] + ); + assert_eq!( + coursier_cache_dirs(TargetOs::MacOs, &none, Some(&home), &cwd), + vec![(mac, "default"), (legacy.clone(), "legacy")] + ); + let windows = env_of(&[("LOCALAPPDATA", local.to_str().unwrap())]); + let found = coursier_cache_dirs(TargetOs::Windows, &windows, Some(&home), &cwd); + assert_eq!(found[0], (win.clone(), "default")); + assert_eq!(found.last().unwrap(), &(legacy.clone(), "legacy")); + // `\cache\v1` is the second spelling (a distinct directory on a + // case-sensitive file system, the same one elsewhere). + let lower = local.join("Coursier/cache/v1"); + if std::fs::canonicalize(&lower).ok() != std::fs::canonicalize(&win).ok() { + mkdir(&lower); + let found = coursier_cache_dirs(TargetOs::Windows, &windows, Some(&home), &cwd); + assert_eq!(found[1], (lower, "default")); + } + // No LOCALAPPDATA: `~/AppData/Local`. + let fallback = mkdir(&home.join("AppData/Local/Coursier/Cache/v1")); + let found = coursier_cache_dirs(TargetOs::Windows, &none, Some(&home), &cwd); + assert_eq!(found[0], (fallback, "default")); + // No home, no env: nothing. + assert!(coursier_cache_dirs(TargetOs::Linux, &none, None, &cwd).is_empty()); + } + + #[test] + fn xdg_cache_home_replaces_dot_cache_on_linux() { + let t = tempfile::tempdir().unwrap(); + let home = t.path().join("home"); + mkdir(&home.join(".cache/coursier/v1")); + let xdg = mkdir(&t.path().join("xdg/coursier/v1")); + let env = env_of(&[("XDG_CACHE_HOME", t.path().join("xdg").to_str().unwrap())]); + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &env, Some(&home), t.path()), + vec![(xdg, "default")] + ); + // Empty = unset. + let env = env_of(&[("XDG_CACHE_HOME", "")]); + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &env, Some(&home), t.path()), + vec![(home.join(".cache/coursier/v1"), "default")] + ); + } + + #[test] + fn precedence_and_every_source_kept() { + let t = tempfile::tempdir().unwrap(); + let home = t.path().join("home"); + let cwd = mkdir(&t.path().join("proj")); + let d = |n: &str| mkdir(&t.path().join(n)); + let (env_cache, java, sbt, jvmopts, sbtopts, cs_home, default) = ( + d("env"), + d("java"), + d("sbt"), + d("jvmopts"), + d("sbtopts"), + d("cshome/cache"), + mkdir(&home.join(".cache/coursier/v1")), + ); + write( + &cwd.join(".jvmopts"), + format!( + "# comment -Dcoursier.cache=/nope\n-Xmx1g\n-Dcoursier.cache={}\n", + jvmopts.display() + ) + .as_bytes(), + ); + write( + &cwd.join(".sbtopts"), + format!("-J-Dcoursier.cache={}\n", sbtopts.display()).as_bytes(), + ); + let env = env_of(&[ + ("COURSIER_CACHE", env_cache.to_str().unwrap()), + ( + "JAVA_OPTS", + &format!( + "-Dcoursier.cache=/missing -Dcoursier.cache={}", + java.display() + ), + ), + ( + "SBT_OPTS", + &format!( + "-Dcoursier.cache=\"{}\" -Dsbt.coursier.home={}", + sbt.display(), + t.path().join("cshome").display() + ), + ), + ]); + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &env, Some(&home), &cwd), + vec![ + (env_cache, "COURSIER_CACHE"), + (java, "JAVA_OPTS"), + (sbt, "SBT_OPTS"), + (jvmopts, ".jvmopts"), + (sbtopts, ".sbtopts"), + (cs_home, "SBT_OPTS"), + (default, "default"), + ] + ); + } + + #[test] + fn empty_values_count_as_unset_and_duplicates_collapse() { + let t = tempfile::tempdir().unwrap(); + let home = t.path().join("home"); + let default = mkdir(&home.join(".cache/coursier/v1")); + let env = env_of(&[ + ("COURSIER_CACHE", ""), + ("JAVA_OPTS", "-Dcoursier.cache= -Dcoursier.cache=\"\""), + ( + "SBT_OPTS", + &format!("-Dcoursier.cache={}", default.display()), + ), + ]); + // The SBT_OPTS value is the default dir: listed once, first source. + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &env, Some(&home), t.path()), + vec![(default, "SBT_OPTS")] + ); + } + + #[test] + fn relative_values_resolve_against_the_project() { + let t = tempfile::tempdir().unwrap(); + let cwd = mkdir(&t.path().join("proj")); + mkdir(&cwd.join("cs")); + write(&cwd.join(".jvmopts"), b"-Dcoursier.cache=cs\n"); + assert_eq!( + coursier_cache_dirs(TargetOs::Linux, &env_of(&[]), None, &cwd), + vec![(cwd.join("cs"), ".jvmopts")] + ); + } + + #[cfg(unix)] + #[test] + fn option_files_are_read_fifo_safe() { + let t = tempfile::tempdir().unwrap(); + for name in [".jvmopts", ".sbtopts"] { + let path = t.path().join(name); + let c = std::ffi::CString::new(path.to_str().unwrap()).unwrap(); + assert_eq!(unsafe { libc::mkfifo(c.as_ptr(), 0o644) }, 0); + } + let (tx, rx) = std::sync::mpsc::channel(); + let cwd = t.path().to_path_buf(); + std::thread::spawn(move || { + let _ = tx.send(jvm_option_values(&|_| None, &cwd, "coursier.cache")); + }); + let found = rx + .recv_timeout(std::time::Duration::from_secs(10)) + .expect("a FIFO option file must not wedge the lookup"); + assert!(found.is_empty()); + } + + #[test] + fn repo_roots_two_hosts_and_nested_repository_paths() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let central = cache.join("https/repo1.maven.org/maven2"); + let nexus = cache.join("https/nexus.corp/content/repositories/releases"); + let plain = cache.join("http/plain.host"); + artifact(¢ral, "org.slf4j", "slf4j-api", "1.7.36"); + artifact(¢ral, "com.google.code.gson", "gson", "2.8.9"); + artifact(&nexus, "com.corp", "lib", "1.0"); + artifact(&plain, "io.x", "y", "2"); + assert!(is_coursier_cache_dir(&cache)); + assert!(!is_coursier_cache_dir(¢ral)); + assert_eq!(repo_roots(&cache), vec![nexus, central, plain]); + } + + #[test] + fn repo_roots_skip_ivy_pattern_hidden_and_mismatched_poms() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let host = cache.join("https/repo.scala-sbt.org"); + // Ivy pattern: no pom. + write( + &host.join("scalasbt/ivy-releases/org.scala-sbt/sbt/1.2.8/jars/sbt.jar"), + b"jar", + ); + write( + &host.join("scalasbt/ivy-releases/org.scala-sbt/sbt/1.2.8/ivys/ivy.xml"), + b"", + ); + // A hidden pom-named sidecar is never read. + write(&host.join("x/a/1/.a-1.pom"), pom("x", "a", "1").as_bytes()); + // groupId disagrees with the path. + write( + &host.join("evil/org/b/2/b-2.pom"), + pom("com.other", "b", "2").as_bytes(), + ); + // artifact disagrees. + write(&host.join("m/c/3/c-3.pom"), pom("m", "zz", "3").as_bytes()); + assert!(repo_roots(&cache).is_empty()); + // A correct one beside them is found. + let good = host.join("maven2"); + artifact(&good, "org.ok", "fine", "1"); + assert_eq!(repo_roots(&cache), vec![good]); + } + + #[test] + fn repo_roots_accept_parent_group_poms_and_host_level_roots() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let host = cache.join("https/host.example"); + // The repository is the host itself; the pom inherits its group. + write( + &host.join("org/acme/core/1.0/core-1.0.pom"), + b"\n \n org.acme\n p\n 1.0\n \n core\n 1.0\n\n", + ); + assert_eq!(repo_roots(&cache), vec![host]); + } + + #[test] + fn repo_roots_never_reach_above_the_host() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + // `https/` spelled as the group: the root would be `https/`. + write( + &cache.join("https/org/a/1/a-1.pom"), + pom("org", "a", "1").as_bytes(), + ); + assert!(repo_roots(&cache).is_empty()); + } + + #[test] + fn repo_roots_prune_after_the_entry_cap() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let host = cache.join("https/big.host"); + for i in 0..20 { + mkdir(&host.join(format!("junk{i:02}"))); + } + artifact(&host.join("zz/maven2"), "org.ok", "fine", "1"); + assert_eq!(repo_roots_capped(&cache, 10), Vec::::new()); + assert_eq!( + repo_roots_capped(&cache, 1000), + vec![host.join("zz/maven2")] + ); + } + + #[test] + fn repo_roots_respect_the_depth_cap() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let host = cache.join("https/deep.host"); + let mut repo = host.clone(); + for i in 0..MAX_DEPTH { + repo = repo.join(format!("d{i}")); + } + artifact(&repo, "g", "a", "1"); + assert!(repo_roots(&cache).is_empty(), "pom below depth 24"); + let shallow = host.join("r"); + artifact(&shallow, "g", "a", "1"); + assert_eq!(repo_roots(&cache), vec![shallow]); + } + + #[cfg(unix)] + #[test] + fn repo_roots_follow_no_symlinks() { + let t = tempfile::tempdir().unwrap(); + let outside = t.path().join("outside"); + artifact(&outside.join("maven2"), "org.x", "a", "1"); + let cache = t.path().join("v1"); + let host = mkdir(&cache.join("https/host")); + std::os::unix::fs::symlink(outside.join("maven2"), host.join("maven2")).unwrap(); + assert!(repo_roots(&cache).is_empty()); + // A symlinked scheme directory is not followed either. + let cache2 = mkdir(&t.path().join("v2")); + std::os::unix::fs::symlink(cache.join("https"), cache2.join("https")).unwrap(); + assert!(!is_coursier_cache_dir(&cache2)); + } + + #[cfg(unix)] + #[test] + fn repo_roots_read_poms_fifo_safe() { + let t = tempfile::tempdir().unwrap(); + let cache = t.path().join("v1"); + let dir = mkdir(&cache.join("https/h/r/g/a/1")); + let c = std::ffi::CString::new(dir.join("a-1.pom").to_str().unwrap()).unwrap(); + assert_eq!(unsafe { libc::mkfifo(c.as_ptr(), 0o644) }, 0); + let (tx, rx) = std::sync::mpsc::channel(); + std::thread::spawn(move || { + let _ = tx.send(repo_roots(&cache)); + }); + let found = rx + .recv_timeout(std::time::Duration::from_secs(10)) + .expect("a FIFO pom must not wedge the walk"); + assert!(found.is_empty()); + } + + #[test] + fn missing_dirs_find_nothing() { + let t = tempfile::tempdir().unwrap(); + assert!(repo_roots(&t.path().join("absent")).is_empty()); + assert!(!is_coursier_cache_dir(t.path())); + } +} diff --git a/crates/socket-patch-core/src/crawlers/gradle_cache.rs b/crates/socket-patch-core/src/crawlers/gradle_cache.rs index ef295ee27..76ea0602f 100644 --- a/crates/socket-patch-core/src/crawlers/gradle_cache.rs +++ b/crates/socket-patch-core/src/crawlers/gradle_cache.rs @@ -209,15 +209,21 @@ pub struct GradleTargets { /// file name (`package/` prefix dropped) is looked up in every hash /// directory: a file present in two hash dirs (a re-download whose bytes /// changed) yields two targets, and a jar and its pom in different hash -/// dirs yield one target each, keyed by the bare file name. Keys no hash -/// dir holds stay joined onto the version dir itself, so verification -/// reports them as not found instead of dropping them. Any other path is -/// returned as is: `[(pkg_path, files)]`. +/// dirs yield one target each, keyed by the bare file name. An Ivy +/// artifact directory ([`ivy_cache::is_artifact_dir`]) expands the same +/// way over its module's artifact type directories (`jars/`, `bundles/`, +/// `orbits/`, `srcs/`, `docs/`): a sources jar sits in `srcs/`, beside the +/// `jars/` the crawler reports. Keys no directory holds stay joined onto +/// `pkg_path` itself, so verification reports them as not found instead +/// of dropping them. Any other path is returned as is: +/// `[(pkg_path, files)]`. +/// +/// [`ivy_cache::is_artifact_dir`]: super::ivy_cache::is_artifact_dir pub fn installed_copies( pkg_path: &Path, files: &HashMap, ) -> Vec<(PathBuf, HashMap)> { - if !is_gradle_version_dir(pkg_path) { + if !expands(pkg_path) { return vec![(pkg_path.to_path_buf(), files.clone())]; } let GradleTargets { @@ -234,12 +240,30 @@ pub fn installed_copies( targets } -/// [`installed_copies`] with the keys no hash directory holds reported -/// apart. For a non-Gradle path every key is in the one identity target. +/// Whether [`installed_copies`] expands `pkg_path` (a Gradle version +/// directory or an Ivy artifact directory) instead of joining the keys +/// onto it as is. +pub fn expands(pkg_path: &Path) -> bool { + is_gradle_version_dir(pkg_path) || super::ivy_cache::is_artifact_dir(pkg_path) +} + +/// [`installed_copies`] with the keys no hash (or Ivy type) directory +/// holds reported apart. For any other path every key is in the one +/// identity target. pub fn installed_copies_detailed( pkg_path: &Path, files: &HashMap, ) -> GradleTargets { + if super::ivy_cache::is_artifact_dir(pkg_path) { + // Directories are siblings of `pkg_path`, joined onto its parent. + let Some(module_dir) = pkg_path.parent() else { + return GradleTargets { + targets: vec![(pkg_path.to_path_buf(), files.clone())], + missing: Vec::new(), + }; + }; + return expand_into(module_dir, &super::ivy_cache::type_dirs(module_dir), files); + } if !is_gradle_version_dir(pkg_path) { return GradleTargets { targets: vec![(pkg_path.to_path_buf(), files.clone())], @@ -251,6 +275,18 @@ pub fn installed_copies_detailed( .filter(|(name, is_dir)| *is_dir && is_hash_dir_name(name)) .map(|(name, _)| name) .collect(); + expand_into(pkg_path, &hash_dirs, files) +} + +/// Each of `files`' keys looked up by file name in every one of `dirs` +/// (children of `base`): one target per directory holding at least one of +/// them, keyed by the bare file name, sorted by directory; keys none holds +/// (and keys that are not a single file name) are `missing`. +fn expand_into( + base: &Path, + dirs: &[String], + files: &HashMap, +) -> GradleTargets { let mut by_dir: BTreeMap> = BTreeMap::new(); let mut missing = Vec::new(); let mut keys: Vec<&String> = files.keys().collect(); @@ -260,9 +296,8 @@ pub fn installed_copies_detailed( let holders: Vec<&String> = if leaf.is_empty() || leaf.contains(['/', '\\']) { Vec::new() } else { - hash_dirs - .iter() - .filter(|dir| pkg_path.join(dir).join(leaf).is_file()) + dirs.iter() + .filter(|dir| base.join(dir).join(leaf).is_file()) .collect() }; if holders.is_empty() { @@ -279,7 +314,7 @@ pub fn installed_copies_detailed( GradleTargets { targets: by_dir .into_iter() - .map(|(dir, files)| (pkg_path.join(dir), files)) + .map(|(dir, files)| (base.join(dir), files)) .collect(), missing, } diff --git a/crates/socket-patch-core/src/crawlers/ivy_cache.rs b/crates/socket-patch-core/src/crawlers/ivy_cache.rs new file mode 100644 index 000000000..c1fd42e8c --- /dev/null +++ b/crates/socket-patch-core/src/crawlers/ivy_cache.rs @@ -0,0 +1,717 @@ +//! Ivy's resolution cache (sbt 0.13, 1.0–1.2, and 1.3+ under +//! `useCoursier := false`): where it is, crawling it, and finding a +//! package's pristine pom in it. +//! +//! Layout: `/cache///ivy-.xml` beside +//! `jars/` / `bundles/` / `orbits/-.jar`; the crawled package +//! directory is the artifact directory, whose `-.jar` has the +//! same basename as in Maven2, so apply's variant selection is unchanged. +//! Every revision of a module shares that directory; file names carry the +//! revision, so a patch keyed `-.jar` touches only its own. +//! sbt plugins sit one level down, under `scala_/sbt_/`. +//! +//! The pristine upstream pom is `ivy-.xml.original` (when the origin +//! repository was Maven-pattern); Ivy keeps no checksum sidecars beside its +//! artifacts, so an in-place patch needs no sidecar resync. + +use std::collections::{HashMap, HashSet}; +use std::io::Read as _; +use std::path::{Path, PathBuf}; + +use super::coursier_cache::{ + existing_dedup, jvm_option_values, log_source, process_home, TargetOs, +}; +use super::maven_crawler::{is_safe_maven_coordinate, parse_pom_group_artifact_version}; +use super::types::CrawledPackage; +use crate::utils::fs::{open_regular_file_sync, read_regular_to_bytes_sync}; + +/// The artifact directories Ivy files a module's jar under, in lookup order +/// (`bundles/` holds OSGi-packaged jars such as guava 19.0's). +const ARTIFACT_DIRS: &[&str] = &["jars", "bundles", "orbits"]; + +/// Every artifact type directory of a module: [`ARTIFACT_DIRS`] plus the +/// classifier ones (`srcs/` holds `--sources.jar`, `docs/` +/// the javadoc jar). The gradle_cache `installed_copies` expansion looks a +/// patch key up in each. +const TYPE_DIRS: &[&str] = &["jars", "bundles", "orbits", "srcs", "docs"]; + +/// How much of an `ivy-.xml` the `` cross-check reads. +const INFO_PREFIX_BYTES: u64 = 4096; + +/// Every existing Ivy cache directory, in precedence order: +/// `-Dsbt.ivy.home=` / `-Divy.home=` (the same option sources as +/// Coursier's) → `/cache`, then `~/.ivy2/cache`. The location is the +/// same on every OS. +pub fn ivy_cache_dirs( + os: TargetOs, + env: &dyn Fn(&str) -> Option, + home: Option<&Path>, + cwd: &Path, +) -> Vec { + ivy_cache_dirs_with_source(os, env, home, cwd) + .into_iter() + .map(|(dir, _)| dir) + .collect() +} + +fn ivy_cache_dirs_with_source( + _os: TargetOs, + env: &dyn Fn(&str) -> Option, + home: Option<&Path>, + cwd: &Path, +) -> Vec<(PathBuf, &'static str)> { + let mut candidates = Vec::new(); + for key in ["sbt.ivy.home", "ivy.home"] { + for (value, source) in jvm_option_values(env, cwd, key) { + candidates.push((cwd.join(value).join("cache"), source)); + } + } + if let Some(home) = home { + candidates.push((home.join(".ivy2/cache"), "default")); + } + existing_dedup(candidates) +} + +/// [`ivy_cache_dirs`] for this process (host OS, real environment and +/// home). +pub fn process_cache_dirs(cwd: &Path) -> Vec { + let env = |name: &str| std::env::var(name).ok().filter(|v| !v.is_empty()); + let home = process_home(); + ivy_cache_dirs_with_source(TargetOs::host(), &env, home.as_deref(), cwd) + .into_iter() + .map(|(dir, source)| { + log_source("Ivy cache", &dir, source); + dir + }) + .collect() +} + +/// Every package in the Ivy cache at `root` (`seen` dedups PURLs across +/// roots: the first root wins), in name order. +pub fn scan(root: &Path, seen: &mut HashSet) -> Vec { + let mut out = Vec::new(); + for org_root in org_roots(root) { + for (org, org_dir) in children(&org_root, true) { + for (module, module_dir) in children(&org_dir, true) { + for (file, _) in children(&module_dir, false) { + let Some(rev) = file + .strip_prefix("ivy-") + .and_then(|f| f.strip_suffix(".xml")) + else { + continue; + }; + if let Some(pkg) = package(&module_dir, &org, &module, rev) { + if seen.insert(pkg.purl.clone()) { + out.push(pkg); + } + } + } + } + } + } + out +} + +/// The packages among `purls` present in the Ivy cache at `root`. +pub fn find_by_purls(root: &Path, purls: &[String]) -> HashMap { + let org_roots = org_roots(root); + let mut out = HashMap::new(); + for purl in purls { + let Some((g, a, v)) = crate::utils::purl::parse_maven_purl(purl) else { + continue; + }; + // SECURITY: untrusted coordinates are joined onto the cache root and + // the result is patched in place. + if !is_safe_maven_coordinate(&g, &a, &v) { + continue; + } + let found = org_roots.iter().find_map(|org_root| { + let module_dir = org_root.join(g.as_ref()).join(a.as_ref()); + package(&module_dir, &g, &a, &v) + }); + if let Some(mut pkg) = found { + pkg.purl = purl.clone(); + out.insert(purl.clone(), pkg); + } + } + out +} + +/// Whether `path` is an Ivy package directory as [`scan`] and +/// [`find_by_purls`] report it: one of a module's [`ARTIFACT_DIRS`], a real +/// directory, beside at least one `ivy-.xml`. +pub fn is_artifact_dir(path: &Path) -> bool { + let named = path + .file_name() + .and_then(|n| n.to_str()) + .is_some_and(|n| ARTIFACT_DIRS.contains(&n)); + named + && is_real_dir(path) + && path.parent().is_some_and(|module_dir| { + children(module_dir, false) + .iter() + .any(|(name, _)| name.starts_with("ivy-") && name.ends_with(".xml")) + }) +} + +/// The artifact type directories ([`TYPE_DIRS`]) present under +/// `module_dir`, real directories only, in [`TYPE_DIRS`] order. +pub fn type_dirs(module_dir: &Path) -> Vec { + TYPE_DIRS + .iter() + .filter(|d| is_real_dir(&module_dir.join(d))) + .map(|d| d.to_string()) + .collect() +} + +/// The pristine upstream pom of `g:a:v` for a package crawled at +/// `installed_dir`: `/-.pom`, else an `ivy-.xml.original` +/// that is a pom for exactly `g:a:v`; `None` (fetch upstream) otherwise. +/// An `.original` from an Ivy-pattern origin is an `ivy.xml`, not a pom, +/// and is never returned. +pub fn installed_pom(installed_dir: &Path, g: &str, a: &str, v: &str) -> Option> { + if !is_safe_maven_coordinate(g, a, v) { + return None; + } + if let Ok(bytes) = read_regular_to_bytes_sync(&installed_dir.join(format!("{a}-{v}.pom"))) { + return Some(bytes); + } + // The `.original` fallback walks to the parent, so only an Ivy artifact + // directory (`jars/` etc. beside an `ivy-.xml`) may take it: a + // Maven2 / Coursier version dir or any other path would otherwise read + // a sibling of an unrelated parent. + if !is_artifact_dir(installed_dir) { + return None; + } + let original = installed_dir + .parent()? + .join(format!("ivy-{v}.xml.original")); + let bytes = read_regular_to_bytes_sync(&original).ok()?; + let text = String::from_utf8_lossy(&bytes); + let gav = (g.to_string(), a.to_string(), v.to_string()); + (is_pom_root(&text) && parse_pom_group_artifact_version(&text) == Some(gav)).then_some(bytes) +} + +/// `root` itself plus every sbt-plugin level below it +/// (`scala_/sbt_/`): each holds `//` trees. +fn org_roots(root: &Path) -> Vec { + let mut roots = vec![root.to_path_buf()]; + for (name, scala_dir) in children(root, true) { + if !name.starts_with("scala_") { + continue; + } + for (sbt, sbt_dir) in children(&scala_dir, true) { + if sbt.starts_with("sbt_") { + roots.push(sbt_dir); + } + } + } + roots +} + +/// The package `org:module:rev` whose `ivy-.xml` sits in `module_dir` +/// with its jar in one of the [`ARTIFACT_DIRS`], or `None`: unsafe +/// coordinates, no regular `ivy-.xml`, an `` naming other +/// coordinates, or no jar. +fn package(module_dir: &Path, org: &str, module: &str, rev: &str) -> Option { + if !is_safe_maven_coordinate(org, module, rev) { + return None; + } + // Neither the module nor the organisation directory may be a link out + // of the cache (the walk never follows one; a PURL lookup joins them). + if !is_real_dir(module_dir) || !module_dir.parent().is_some_and(is_real_dir) { + return None; + } + let ivy = module_dir.join(format!("ivy-{rev}.xml")); + if !is_regular(&ivy) || !info_agrees(&ivy, org, module, rev) { + return None; + } + let jar = format!("{module}-{rev}.jar"); + let dir = ARTIFACT_DIRS + .iter() + .map(|d| module_dir.join(d)) + .find(|dir| is_real_dir(dir) && is_regular(&dir.join(&jar)))?; + Some(CrawledPackage { + name: module.to_string(), + version: rev.to_string(), + namespace: Some(org.to_string()), + purl: crate::utils::purl::build_maven_purl(org, module, rev), + path: dir, + }) +} + +/// Whether the `` in the first 4 KiB +/// of `ivy` (read FIFO-safe) agrees with the path's coordinates. An +/// unreadable file disagrees; a prefix without a complete `` tag +/// (an unusually long header) trusts the path. +fn info_agrees(ivy: &Path, org: &str, module: &str, rev: &str) -> bool { + let Ok((file, _)) = open_regular_file_sync(ivy) else { + return false; + }; + let mut prefix = Vec::new(); + if file + .take(INFO_PREFIX_BYTES) + .read_to_end(&mut prefix) + .is_err() + { + return false; + } + let text = String::from_utf8_lossy(&prefix); + let Some(start) = text.find("') else { + return true; + }; + let tag = &text[start..start + len]; + [("organisation", org), ("module", module), ("revision", rev)] + .iter() + .all(|(attr, want)| attribute(tag, attr).is_none_or(|got| got == *want)) +} + +/// The value of `name="…"` (or `'…'`) inside one tag's text. +fn attribute<'a>(tag: &'a str, name: &str) -> Option<&'a str> { + let mut rest = tag; + while let Some(at) = rest.find(name) { + let before = rest[..at].chars().last(); + let after = rest[at + name.len()..].trim_start(); + rest = &rest[at + name.len()..]; + if !before.is_some_and(char::is_whitespace) { + continue; + } + let Some(after) = after.strip_prefix('=') else { + continue; + }; + let after = after.trim_start(); + let quote = after.chars().next()?; + if quote != '"' && quote != '\'' { + return None; + } + let body = &after[1..]; + return body.find(quote).map(|end| &body[..end]); + } + None +} + +/// Whether `text`'s root element is ` bool { + let mut rest = text.trim_start_matches('\u{feff}'); + loop { + rest = rest.trim_start(); + let skip_to = if rest.starts_with("" + } else if rest.starts_with("" + } else if rest.starts_with("" + } else { + break; + }; + match rest.find(skip_to) { + Some(end) => rest = &rest[end + skip_to.len()..], + None => return false, + } + } + rest.strip_prefix("' || c == '/' || c.is_whitespace()) +} + +/// The children of `dir` that are real directories (`dirs`) or regular +/// files, never symbolic links or dot-names, as `(name, path)` in name +/// order. +fn children(dir: &Path, dirs: bool) -> Vec<(String, PathBuf)> { + let Some((entries, _complete)) = crate::utils::fs::read_dir_entries_sync(dir) else { + return Vec::new(); + }; + let mut out: Vec<(String, PathBuf)> = entries + .into_iter() + .filter_map(|e| { + let name = e.file_name().into_string().ok()?; + let kind = e.file_type().ok()?; + let wanted = if dirs { kind.is_dir() } else { kind.is_file() }; + (wanted && !name.starts_with('.')).then(|| (name, e.path())) + }) + .collect(); + out.sort(); + out +} + +fn is_real_dir(path: &Path) -> bool { + std::fs::symlink_metadata(path).is_ok_and(|m| m.is_dir()) +} + +fn is_regular(path: &Path) -> bool { + std::fs::symlink_metadata(path).is_ok_and(|m| m.is_file()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn write(p: &Path, bytes: &[u8]) { + std::fs::create_dir_all(p.parent().unwrap()).unwrap(); + std::fs::write(p, bytes).unwrap(); + } + + fn ivy_xml(org: &str, module: &str, rev: &str) -> String { + format!( + "\n\n\t\n\t\n\n" + ) + } + + fn pom(g: &str, a: &str, v: &str) -> String { + format!("\n\n\n{g}\n{a}\n{v}\n\n") + } + + /// Write `org:module:rev` into the cache at `root`, its jar under `kind` + /// (`None` = no jar); the module directory. + fn module(root: &Path, org: &str, m: &str, rev: &str, kind: Option<&str>) -> PathBuf { + let dir = root.join(org).join(m); + write( + &dir.join(format!("ivy-{rev}.xml")), + ivy_xml(org, m, rev).as_bytes(), + ); + write( + &dir.join(format!("ivy-{rev}.xml.original")), + pom(org, m, rev).as_bytes(), + ); + write(&dir.join(format!("ivy-{rev}.xml.sha1")), b"0000"); + write(&dir.join(format!("ivydata-{rev}.properties")), b"#x\n"); + if let Some(kind) = kind { + write(&dir.join(kind).join(format!("{m}-{rev}.jar")), b"jar"); + } + dir + } + + fn rows(pkgs: &[CrawledPackage]) -> Vec<(String, PathBuf)> { + pkgs.iter() + .map(|p| (p.purl.clone(), p.path.clone())) + .collect() + } + + #[test] + fn cache_dirs_precedence_and_default() { + let t = tempfile::tempdir().unwrap(); + let home = t.path().join("home"); + let cwd = t.path().join("proj"); + std::fs::create_dir_all(&cwd).unwrap(); + let mk = |p: PathBuf| { + std::fs::create_dir_all(&p).unwrap(); + p + }; + let sbt_home = mk(t.path().join("sbt-ivy/cache")); + let ivy_home = mk(t.path().join("plain-ivy/cache")); + let file_home = mk(t.path().join("file-ivy/cache")); + let default = mk(home.join(".ivy2/cache")); + write( + &cwd.join(".sbtopts"), + format!("-J-Dsbt.ivy.home={}\n", t.path().join("file-ivy").display()).as_bytes(), + ); + let opts = format!( + "-Dsbt.ivy.home={} -Divy.home={}", + t.path().join("sbt-ivy").display(), + t.path().join("plain-ivy").display() + ); + let env = move |name: &str| (name == "SBT_OPTS").then(|| opts.clone()); + for os in [TargetOs::Linux, TargetOs::MacOs, TargetOs::Windows] { + assert_eq!( + ivy_cache_dirs(os, &env, Some(&home), &cwd), + vec![ + sbt_home.clone(), + file_home.clone(), + ivy_home.clone(), + default.clone() + ] + ); + } + // Empty = unset. + let empty = |name: &str| (name == "SBT_OPTS").then(|| "-Dsbt.ivy.home=".to_string()); + std::fs::remove_file(cwd.join(".sbtopts")).unwrap(); + assert!(ivy_cache_dirs(TargetOs::Linux, &|_| None, None, &cwd).is_empty()); + assert_eq!( + ivy_cache_dirs(TargetOs::Linux, &empty, Some(&home), &cwd), + vec![default] + ); + } + + #[test] + fn scan_finds_jars_bundles_orbits_and_skips_missing_jars() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join(".ivy2/cache"); + let a = module( + &root, + "org.apache.commons", + "commons-text", + "1.9", + Some("jars"), + ); + let g = module(&root, "com.google.guava", "guava", "19.0", Some("bundles")); + let o = module( + &root, + "org.eclipse.jetty.orbit", + "javax.servlet", + "3.0.0", + Some("orbits"), + ); + module(&root, "org.apache", "apache", "23", None); // a parent pom, no jar + // A jar under the wrong directory name does not count. + module(&root, "x.y", "z", "1", Some("srcs")); + let mut seen = HashSet::new(); + let found = scan(&root, &mut seen); + assert_eq!( + rows(&found), + vec![ + ( + "pkg:maven/com.google.guava/guava@19.0".into(), + g.join("bundles") + ), + ( + "pkg:maven/org.apache.commons/commons-text@1.9".into(), + a.join("jars") + ), + ( + "pkg:maven/org.eclipse.jetty.orbit/javax.servlet@3.0.0".into(), + o.join("orbits") + ), + ] + ); + let p = &found[1]; + assert_eq!( + (p.name.as_str(), p.version.as_str()), + ("commons-text", "1.9") + ); + assert_eq!(p.namespace.as_deref(), Some("org.apache.commons")); + // A second root sees nothing new. + assert!(scan(&root, &mut seen).is_empty()); + } + + #[test] + fn shared_revisions_share_the_artifact_dir() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + let dir = module(&root, "org.slf4j", "slf4j-api", "1.7.36", Some("jars")); + module(&root, "org.slf4j", "slf4j-api", "2.0.9", Some("jars")); + // An ivy.xml for a revision whose jar is missing. + write( + &dir.join("ivy-1.7.0.xml"), + ivy_xml("org.slf4j", "slf4j-api", "1.7.0").as_bytes(), + ); + let found = scan(&root, &mut HashSet::new()); + assert_eq!( + rows(&found), + vec![ + ( + "pkg:maven/org.slf4j/slf4j-api@1.7.36".into(), + dir.join("jars") + ), + ( + "pkg:maven/org.slf4j/slf4j-api@2.0.9".into(), + dir.join("jars") + ), + ] + ); + let hits = find_by_purls( + &root, + &[ + "pkg:maven/org.slf4j/slf4j-api@2.0.9".into(), + "pkg:maven/org.slf4j/slf4j-api@1.7.0".into(), + "pkg:maven/org.slf4j/slf4j-api@9".into(), + ], + ); + assert_eq!(hits.len(), 1); + assert_eq!( + hits["pkg:maven/org.slf4j/slf4j-api@2.0.9"].path, + dir.join("jars") + ); + } + + #[test] + fn plugins_one_level_down() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + let plugin = module( + &root.join("scala_2.12/sbt_1.0"), + "com.eed3si9n", + "sbt-assembly", + "0.14.10", + Some("jars"), + ); + let found = scan(&root, &mut HashSet::new()); + assert_eq!( + rows(&found), + vec![( + "pkg:maven/com.eed3si9n/sbt-assembly@0.14.10".into(), + plugin.join("jars") + )] + ); + let purl = "pkg:maven/com.eed3si9n/sbt-assembly@0.14.10".to_string(); + assert_eq!( + find_by_purls(&root, std::slice::from_ref(&purl))[&purl].path, + plugin.join("jars") + ); + } + + #[test] + fn info_must_agree_with_the_path() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + let dir = module(&root, "org.a", "b", "1", Some("jars")); + write( + &dir.join("ivy-1.xml"), + ivy_xml("org.evil", "b", "1").as_bytes(), + ); + assert!(scan(&root, &mut HashSet::new()).is_empty()); + assert!(find_by_purls(&root, &["pkg:maven/org.a/b@1".into()]).is_empty()); + // No complete `` in the first 4 KiB: the path decides. + let mut long = ""; + long.push_str(&ivy_xml("org.evil", "b", "1")); + write(&dir.join("ivy-1.xml"), long.as_bytes()); + assert_eq!(scan(&root, &mut HashSet::new()).len(), 1); + } + + #[test] + fn unsafe_coordinates_are_never_joined() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + module(&root, "org.a", "b", "1", Some("jars")); + // `..` as a revision would escape `jars/`; `C:x` is drive-relative. + write( + &root.join("org.a/b/ivy-...xml"), + ivy_xml("org.a", "b", "..").as_bytes(), + ); + for purl in [ + "pkg:maven/org.a/b@..", + "pkg:maven/../b@1", + "pkg:maven/org.a/C:b@1", + "pkg:maven/org..a/b@1", + ] { + assert!(find_by_purls(&root, &[purl.into()]).is_empty(), "{purl}"); + } + assert_eq!(scan(&root, &mut HashSet::new()).len(), 1); + assert_eq!(installed_pom(&root, "org.a", "b", ".."), None); + } + + #[cfg(unix)] + #[test] + fn symlinks_are_not_followed() { + let t = tempfile::tempdir().unwrap(); + let outside = t.path().join("outside"); + let real = module(&outside, "org.x", "y", "1", Some("jars")); + let root = t.path().join("ivy2/cache"); + std::fs::create_dir_all(root.join("org.x")).unwrap(); + // A module directory that is a link out of the cache. + std::os::unix::fs::symlink(&real, root.join("org.x/y")).unwrap(); + assert!(scan(&root, &mut HashSet::new()).is_empty()); + assert!(find_by_purls(&root, &["pkg:maven/org.x/y@1".into()]).is_empty()); + // A jars/ directory that is a link. + let m = module(&root, "org.p", "q", "1", None); + std::os::unix::fs::symlink(real.join("jars"), m.join("jars")).unwrap(); + assert!(find_by_purls(&root, &["pkg:maven/org.p/q@1".into()]).is_empty()); + } + + #[cfg(unix)] + #[test] + fn readers_are_fifo_safe() { + fn mkfifo(p: &Path) { + let _ = std::fs::remove_file(p); + let c = std::ffi::CString::new(p.to_str().unwrap()).unwrap(); + assert_eq!(unsafe { libc::mkfifo(c.as_ptr(), 0o644) }, 0); + } + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + let dir = module(&root, "org.a", "b", "1", Some("jars")); + mkfifo(&dir.join("ivy-1.xml")); + mkfifo(&dir.join("ivy-1.xml.original")); + mkfifo(&dir.join("jars/b-1.pom")); + let (tx, rx) = std::sync::mpsc::channel(); + let (r, d) = (root.clone(), dir.clone()); + std::thread::spawn(move || { + let scanned = scan(&r, &mut HashSet::new()).len(); + let found = find_by_purls(&r, &["pkg:maven/org.a/b@1".into()]).len(); + let pom = installed_pom(&d.join("jars"), "org.a", "b", "1"); + let _ = tx.send((scanned, found, pom)); + }); + let got = rx + .recv_timeout(std::time::Duration::from_secs(10)) + .expect("a FIFO must not wedge the Ivy readers"); + assert_eq!(got, (0, 0, None)); + // And `info_agrees` itself. + assert!(!info_agrees(&dir.join("ivy-1.xml"), "org.a", "b", "1")); + } + + #[test] + fn installed_pom_prefers_a_real_pom_then_a_pom_origin_original() { + let t = tempfile::tempdir().unwrap(); + let root = t.path().join("ivy2/cache"); + let dir = module(&root, "org.a", "b", "1", Some("jars")); + let jars = dir.join("jars"); + let original = pom("org.a", "b", "1").into_bytes(); + assert_eq!(installed_pom(&jars, "org.a", "b", "1"), Some(original)); + // Wrong coordinates: not this package's pom. + assert_eq!(installed_pom(&jars, "org.a", "b", "2"), None); + assert_eq!(installed_pom(&jars, "org.z", "b", "1"), None); + // An ivy-pattern origin's `.original` is an ivy.xml. + write( + &dir.join("ivy-1.xml.original"), + ivy_xml("org.a", "b", "1").as_bytes(), + ); + assert_eq!(installed_pom(&jars, "org.a", "b", "1"), None); + // A `{}", pom("org.a", "b", "1")).as_bytes(), + ); + assert_eq!(installed_pom(&jars, "org.a", "b", "1"), None); + // A Maven2 / Coursier version dir: `-.pom` wins. + let m2 = t.path().join("m2/org/a/b/1"); + write(&m2.join("b-1.pom"), b"pom bytes"); + assert_eq!( + installed_pom(&m2, "org.a", "b", "1"), + Some(b"pom bytes".to_vec()) + ); + // A non-Ivy dir never falls back to a parent's `.original`, even one + // that is a pom for exactly this GAV. + let other = t.path().join("staging/org/a/b/1"); + std::fs::create_dir_all(&other).unwrap(); + write( + &other.parent().unwrap().join("ivy-1.xml.original"), + pom("org.a", "b", "1").as_bytes(), + ); + assert_eq!(installed_pom(&other, "org.a", "b", "1"), None); + // Nor does an Ivy-named dir with no `ivy-.xml` beside it. + let bare = t.path().join("bare/org.a/b"); + std::fs::create_dir_all(bare.join("jars")).unwrap(); + write( + &bare.join("ivy-1.xml.original"), + pom("org.a", "b", "1").as_bytes(), + ); + assert_eq!(installed_pom(&bare.join("jars"), "org.a", "b", "1"), None); + assert_eq!( + installed_pom(&t.path().join("absent/x"), "org.a", "b", "1"), + None + ); + } + + #[test] + fn pom_root_detection() { + assert!(is_pom_root("")); + assert!(is_pom_root( + "\u{feff}\n\n\n" + )); + assert!(!is_pom_root("")); + assert!(!is_pom_root("")); + assert!(!is_pom_root("") + || pom.contains("", + )], + ); + let read = |p: &str| reactor.get(p).cloned(); + assert_eq!(detect(&read), None); + assert_eq!(super::super::detect(&read), Shape::MavenReactor); + // An unwired reactor beside sbt routes to sbt, which refuses it. + let ambiguous = build( + "1.9.9", + &[( + "pom.xml", + "a", + )], + ); + assert_eq!( + detect(&|p: &str| ambiguous.get(p).cloned()), + Some(Shape::Sbt) + ); + assert_eq!( + code(plan_over(&ambiguous, &text_patch(UUID_A))), + "vendor_jvm_build_ambiguous" + ); + // A Gradle build already wired keeps Gradle. + let gradle = build( + "1.9.9", + &[( + "settings.gradle", + "apply from: '.socket/gradle/socket-patch.settings.gradle'\n", + )], + ); + let read = |p: &str| gradle.get(p).cloned(); + assert_eq!(detect(&read), None); + assert_eq!(super::super::detect(&read), Shape::Gradle); + // A single-module pom the legacy path already wired stays legacy + // (`Shape::Other`); an unwired one beside sbt routes to sbt. + let legacy = build( + "1.9.9", + &[( + "pom.xml", + "\ + socket-patch-vendor-1d3c1fd2-5e6f-4a7b-8c9d-0e1f2a3b4c5d\ + ", + )], + ); + let read = |p: &str| legacy.get(p).cloned(); + assert_eq!(detect(&read), None); + assert_eq!(super::super::detect(&read), Shape::Other); + // A Gradle build with an unrelated `project/build.properties` is + // not sbt-shaped. + let stray: BTreeMap> = [ + (BUILD_PROPERTIES.to_string(), b"version=1\n".to_vec()), + ("settings.gradle".to_string(), Vec::new()), + ] + .into(); + let read = |p: &str| stray.get(p).cloned(); + assert_eq!(detect(&read), None); + assert_eq!(super::super::detect(&read), Shape::Gradle); + let plain = build("1.9.9", &[("pom.xml", "")]); + assert_eq!( + super::super::detect(&|p: &str| plain.get(p).cloned()), + Shape::Sbt + ); + } + + #[test] + fn nested_subproject_is_guarded() { + let root = build("1.9.9", &[]); + let sub = |p: &str| (p == BUILD_SBT).then(Vec::new); + assert!(nested_in_build(&sub, &|p: &str| root.get(p).cloned())); + assert!(!nested_in_build( + &|p: &str| root.get(p).cloned(), + &|p: &str| root.get(p).cloned() + )); + } + + #[test] + fn suffixed_tree_is_the_reactors_tree() { + let p = text_patch(UUID_A); + let (dir, jar, writes) = maven_reactor::suffixed_tree(&p).unwrap(); + assert_eq!(dir, maven_reactor::tree_dir(&p.coords())); + let reactor = |rel: &str| match rel { + "pom.xml" => Some( + b"4.0.0x\ + agg1a\ + \n" + .to_vec(), + ), + "a/pom.xml" => Some( + b"4.0.0x\ + agg1a\ + \n" + .to_vec(), + ), + _ => None, + }; + let planned = maven_reactor::plan(&reactor, &p).unwrap(); + let tree: Vec<_> = planned.writes.into_iter().filter(|w| w.tree).collect(); + assert_eq!(tree, writes); + assert_eq!(planned.jar_rel, jar); + let sbt = plan_over(&build("1.9.9", &[]), &p).unwrap(); + let sbt_tree: Vec<_> = sbt.writes.into_iter().filter(|w| w.tree).collect(); + assert_eq!(sbt_tree, tree); + } + + #[test] + fn plan_writes_the_owned_file_tree_and_records() { + let files = build("1.9.9", &[]); + let p = text_patch(UUID_A); + let plan = plan_over(&files, &p).unwrap(); + let rels: Vec<&str> = plan.writes.iter().map(|w| w.rel.as_str()).collect(); + let tree = ".socket/vendor/maven2/org/apache/commons/commons-text/1.10.0-socket.1d3c1fd2"; + assert_eq!( + rels, + [ + ".socket/vendor/maven2/.gitattributes".to_string(), + ".socket/vendor/maven2/.gitignore".to_string(), + format!("{tree}/commons-text-1.10.0-socket.1d3c1fd2.jar"), + format!("{tree}/commons-text-1.10.0-socket.1d3c1fd2.jar.sha1"), + format!("{tree}/commons-text-1.10.0-socket.1d3c1fd2.pom"), + format!("{tree}/commons-text-1.10.0-socket.1d3c1fd2.pom.sha1"), + format!("{tree}/socket-patch.vendor.json"), + BUILD_FILE.to_string(), + ] + ); + let gitignore = &plan.writes[1]; + assert_eq!(gitignore.bytes, b"!*\n"); + assert_eq!(plan.tree_dir, tree); + assert_eq!( + plan.jar_rel, + format!("{tree}/commons-text-1.10.0-socket.1d3c1fd2.jar") + ); + let keys: Vec<(&str, &str, &str)> = plan + .records + .iter() + .map(|r| { + ( + r.file.as_str(), + r.key.as_deref().unwrap_or_default(), + super::super::op_of(r), + ) + }) + .collect(); + assert_eq!( + keys, + [ + (".socket/vendor/maven2/.gitattributes", "owned", "create"), + (".socket/vendor/maven2/.gitignore", "owned", "create"), + (BUILD_FILE, "file", "create"), + (BUILD_FILE, &format!("pin:{UUID_A}") as &str, "pin"), + ] + ); + let text = String::from_utf8(plan.writes.last().unwrap().bytes.clone()).unwrap(); + let parsed = parse(SbtFileMode::Vendored, &text).unwrap(); + let pin = &parsed.pins[UUID_A]; + assert_eq!(pin.sv, "1.10.0-socket.1d3c1fd2"); + assert_eq!(pin.jar_sha256, sha256_hex(b"PK-text")); + assert_eq!( + pin.deps_digest, + deps_digest(&build_sources(&|p: &str| files.get(p).cloned())) + ); + assert!(text.contains("Global / onLoad"), "{text}"); + assert!(plan.warnings.is_empty(), "{:?}", plan.warnings); + } + + #[test] + fn syntax_line_follows_the_sbt_version() { + for (version, needle) in [ + ("0.13.18", "onLoad in Global"), + ("1.2.8", "Global / onLoad"), + ("2.0.9", "Def.uncached"), + ] { + let plan = plan_over(&build(version, &[]), &text_patch(UUID_A)).unwrap(); + let text = String::from_utf8(plan.writes.last().unwrap().bytes.clone()).unwrap(); + assert!(text.contains(needle), "{version}"); + } + let plan = plan_over(&build("2.1.0", &[]), &text_patch(UUID_A)).unwrap(); + assert_eq!(plan.warnings[0].code, "vendor_sbt_version_untested"); + } + + #[test] + fn refusals_come_before_any_write() { + let p = text_patch(UUID_A); + for (files, expected) in [ + (build("0.13.17", &[]), "vendor_sbt_unsupported_version"), + ( + build("1.0", &[]) + .into_iter() + .filter(|(k, _)| k != BUILD_PROPERTIES) + .collect(), + "vendor_sbt_build_root_unknown", + ), + ( + build("1.9.9", &[("build.gradle", "")]), + "vendor_jvm_build_ambiguous", + ), + ( + build("1.9.9", &[("build.mill", "")]), + "vendor_jvm_build_ambiguous", + ), + ( + build("1.9.9", &[(BUILD_FILE, "// mine\n")]), + "vendor_sbt_owned_file_foreign", + ), + ( + build( + "1.9.9", + &[(BUILD_FILE, "// Generated by socket-patch. edited\n")], + ), + "vendor_sbt_owned_file_modified", + ), + ( + build( + "1.9.9", + &[(HOSTED_FILE, "// Generated by socket-patch. edited\n")], + ), + "vendor_sbt_hosted_conflict", + ), + ( + build("1.9.9", &[("zz.sbt", ""), (DEPENDENCY_LOCK, "{}")]), + "vendor_sbt_dependency_lock_present", + ), + ( + build( + "1.9.9", + &[( + "project/Dependencies.scala", + "object D { dependencyOverrides := Nil }", + )], + ), + "vendor_sbt_overrides_assignment", + ), + ( + build( + "1.9.9", + &[ + ("project/plugins.sbt", ""), + ("project/Build.scala", "object B { resolvers := Nil }"), + ], + ), + "vendor_sbt_resolvers_assignment", + ), + ] { + assert_eq!(code(plan_over(&files, &p)), expected); + } + let mut unsafe_patch = text_patch(UUID_A); + unsafe_patch.version = "1.0--x"; + assert_eq!( + code(plan_over(&build("1.9.9", &[]), &unsafe_patch)), + "unsafe_coordinates" + ); + let mut computed = text_patch(UUID_A); + computed.upstream_pom = b"${revision}"; + assert_eq!( + code(plan_over(&build("1.9.9", &[]), &computed)), + "vendor_jvm_upstream_unavailable" + ); + } + + #[test] + fn subproject_sources_are_scanned_and_warnings_carried() { + let files = build( + "1.9.9", + &[ + ( + BUILD_SBT, + "lazy val a = project\nlazy val b = (project in file(\"mods/b\"))\n", + ), + ("mods/b/build.sbt", "dependencyOverrides := Seq.empty\n"), + ], + ); + assert_eq!( + code(plan_over(&files, &text_patch(UUID_A))), + "vendor_sbt_overrides_assignment" + ); + let files = build( + "1.9.9", + &[ + (".sbtopts", "-Dsbt.override.build.repos=true\n"), + ("pom.xml", ""), + ], + ); + let plan = plan_over(&files, &text_patch(UUID_A)).unwrap(); + let codes: Vec<_> = plan.warnings.iter().map(|w| w.code).collect(); + assert_eq!( + codes, + ["vendor_sbt_pom_ignored", "vendor_sbt_override_build_repos"] + ); + } + + #[test] + fn hosted_pin_of_the_same_ga_conflicts_and_other_gas_coexist() { + let hosted = std::fs::read_to_string( + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/sbt/owned_file/hosted-1-1pin.sbt"), + ) + .unwrap(); + let hosted: &'static str = Box::leak(hosted.into_boxed_str()); + let files = build("1.9.9", &[(HOSTED_FILE, hosted)]); + let pinned = parse(SbtFileMode::Hosted, hosted).unwrap(); + let p = pinned.pins.values().next().unwrap(); + let conflicting = JvmPatch { + group_id: Box::leak(p.group.clone().into_boxed_str()), + artifact_id: Box::leak(p.artifact.clone().into_boxed_str()), + version: Box::leak(p.base.clone().into_boxed_str()), + uuid: UUID_A, + jar: b"x", + upstream_pom: Box::leak( + format!( + "{}{}{}\ + ", + p.group, p.artifact, p.base + ) + .into_boxed_str(), + ) + .as_bytes(), + upstream_module: None, + extra_artifacts: &[], + patched_members: &[], + }; + assert_eq!( + code(plan_over(&files, &conflicting)), + "vendor_sbt_hosted_conflict" + ); + assert!(plan_over(&files, &gson_patch()).is_ok()); + } + + #[test] + fn existing_pin_is_kept_and_a_dependency_edit_only_warns() { + let mut files = build("1.9.9", &[]); + let p = text_patch(UUID_A); + let first = plan_over(&files, &p).unwrap(); + for w in &first.writes { + files.insert(w.rel.clone(), w.bytes.clone()); + } + let again = plan_over(&files, &p).unwrap(); + assert!(again.writes.is_empty(), "{:?}", again.writes); + assert_eq!(again.tree_files, first.tree_files); + assert_eq!(super::super::op_of(&again.records[2]), "adopt"); + // A dependency edit after wiring: the row keeps its digest and the + // re-plan warns, writing nothing. + files.insert( + BUILD_SBT.into(), + format!("{BUILD}libraryDependencies += \"a\" % \"b\" % \"1\"\n").into_bytes(), + ); + let bumped = plan_over(&files, &p).unwrap(); + assert!(bumped.writes.is_empty()); + assert_eq!(bumped.warnings[0].code, "vendor_sbt_pin_unverifiable"); + // Build edits that block a NEW pin do not refuse the existing one. + files.insert( + "project/Build.scala".into(), + b"object B { resolvers := Nil }".to_vec(), + ); + assert!(plan_over(&files, &p).is_ok()); + assert_eq!( + code(plan_over(&files, &gson_patch())), + "vendor_sbt_resolvers_assignment" + ); + } + + /// The pin records the gate's digest (every build source, the hosted + /// definition), so a `project/Deps.scala` literal the conventional + /// sources miss neither warns forever nor hides a bump; the gate's + /// digest also refreshes an existing pin. + #[test] + fn the_gate_digest_is_the_one_recorded() { + let mut files = build("1.9.9", &[]); + let p = text_patch(UUID_A); + let read = |files: &BTreeMap>| { + let files = files.clone(); + move |rel: &str| files.get(rel).cloned() + }; + let first = plan_with_digest(&read(&files), &p, Some("feedf00d")).unwrap(); + for w in &first.writes { + files.insert(w.rel.clone(), w.bytes.clone()); + } + let pin = |files: &BTreeMap>| { + parse( + SbtFileMode::Vendored, + std::str::from_utf8(&files[BUILD_FILE]).unwrap(), + ) + .unwrap() + .pins[UUID_A] + .clone() + }; + assert_eq!(pin(&files).deps_digest, "feedf00d"); + let same = plan_with_digest(&read(&files), &p, Some("feedf00d")).unwrap(); + assert!(same.writes.is_empty() && same.warnings.is_empty()); + let refreshed = plan_with_digest(&read(&files), &p, Some("0badcafe")).unwrap(); + assert!(refreshed.warnings.is_empty(), "{:?}", refreshed.warnings); + for w in &refreshed.writes { + files.insert(w.rel.clone(), w.bytes.clone()); + } + assert_eq!(pin(&files).deps_digest, "0badcafe"); + } + + #[test] + fn same_ga_other_base_conflicts() { + let mut files = build("1.9.9", &[]); + for w in plan_over(&files, &text_patch(UUID_A)).unwrap().writes { + files.insert(w.rel, w.bytes); + } + let mut other = text_patch(UUID_B); + other.version = "1.9"; + other.upstream_pom = b"org.apache.commonscommons-text1.9"; + assert_eq!( + code(plan_over(&files, &other)), + "vendor_sbt_override_conflict" + ); + } + + #[test] + fn crlf_file_is_kept_crlf() { + let mut files = build("1.9.9", &[]); + for w in plan_over(&files, &text_patch(UUID_A)).unwrap().writes { + files.insert(w.rel, w.bytes); + } + let lf = String::from_utf8(files[BUILD_FILE].clone()).unwrap(); + files.insert(BUILD_FILE.into(), lf.replace('\n', "\r\n").into_bytes()); + let plan = plan_over(&files, &gson_patch()).unwrap(); + let out = plan.writes.iter().find(|w| w.rel == BUILD_FILE).unwrap(); + let text = String::from_utf8(out.bytes.clone()).unwrap(); + assert_eq!(text.matches('\n').count(), text.matches("\r\n").count()); + assert_eq!(parse(SbtFileMode::Vendored, &text).unwrap().pins.len(), 2); + } + + #[test] + fn unplan_without_file_and_with_drift() { + let c = text_patch(UUID_A).coords(); + let none = |_: &str| None; + assert_eq!(unplan(&none, &c, &[]), JvmUnplan::default()); + let mut files = build("1.9.9", &[]); + for w in plan_over(&files, &text_patch(UUID_A)).unwrap().writes { + files.insert(w.rel, w.bytes); + } + let mut text = String::from_utf8(files[BUILD_FILE].clone()).unwrap(); + text.push_str("// mine\n"); + files.insert(BUILD_FILE.into(), text.into_bytes()); + let read = |p: &str| files.get(p).cloned(); + let out = unplan(&read, &c, &[]); + assert!(out.changes.is_empty()); + assert!(out.still_wired); + assert!(out.drifted[0].contains("was modified"), "{:?}", out.drifted); + assert!(wired_checked(&read, &c).is_err()); + // Drift that no longer names the patch frees its tree. + let other = text_patch(UUID_B).coords(); + assert!(!unplan(&read, &other, &[]).still_wired); + } + + #[tokio::test] + async fn idempotent_replan_then_two_patches_revert_in_either_order_byte_exact() { + for first_out in [0usize, 1] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + write(root, "1.9.9", &[]); + let pristine = snapshot(root); + let pristine_dirs = dirs(root); + let patches = [text_patch(UUID_A), gson_patch()]; + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &patches[0], &mut ledger) + .await + .unwrap(); + let one = snapshot(root); + let again = vendor(root, Shape::Sbt, &patches[0], &mut ledger) + .await + .unwrap(); + assert!(again.writes.is_empty(), "{:?}", again.writes); + vendor(root, Shape::Sbt, &patches[1], &mut ledger) + .await + .unwrap(); + let both = snapshot(root); + assert_eq!( + parse( + SbtFileMode::Vendored, + std::str::from_utf8(&both[BUILD_FILE]).unwrap() + ) + .unwrap() + .pins + .len(), + 2 + ); + for e in ledger.values() { + assert!(apply::entry_wired_checked(root, e).unwrap()); + apply::check_entry(root, e, None).unwrap(); + // The second patch adopted, then inherited, the creation records. + let file = e + .wiring + .iter() + .find(|w| w.key.as_deref() == Some("file")) + .unwrap(); + assert_eq!(super::super::op_of(file), "create"); + } + let out = revert(root, &patches[first_out], &mut ledger).await; + assert!(out.success && !out.kept_artifact, "{out:?}"); + assert!(out.warnings.is_empty(), "{:?}", out.warnings); + let remaining = &patches[1 - first_out]; + if first_out == 1 { + assert_eq!(snapshot(root), one, "reverting gson leaves exactly text"); + } + let e = ledger.values().next().unwrap(); + assert!(apply::entry_wired_checked(root, e).unwrap()); + apply::check_entry(root, e, None).unwrap(); + let out = revert(root, remaining, &mut ledger).await; + assert!(out.success && !out.kept_artifact, "{out:?}"); + assert_eq!(snapshot(root), pristine, "first_out={first_out}"); + assert_eq!(dirs(root), pristine_dirs, "first_out={first_out}"); + } + } + + #[tokio::test] + async fn patch_update_replaces_the_pin_and_sweeps_the_old_tree() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + write(root, "1.13.0", &[]); + let pristine = snapshot(root); + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &text_patch(UUID_A), &mut ledger) + .await + .unwrap(); + let old_tree = root.join(tree_dir(&text_patch(UUID_A).coords())); + assert!(old_tree.is_dir()); + vendor(root, Shape::Sbt, &text_patch(UUID_A2), &mut ledger) + .await + .unwrap(); + assert!(!old_tree.exists(), "the stale sweep removes the old tree"); + let text = std::fs::read_to_string(root.join(BUILD_FILE)).unwrap(); + assert!(!text.contains(UUID_A) && text.contains(UUID_A2), "{text}"); + assert!(text.contains("1.10.0-socket.2e4d6f80")); + let e = ledger.values().next().unwrap(); + apply::check_entry(root, e, None).unwrap(); + revert(root, &text_patch(UUID_A2), &mut ledger).await; + assert_eq!(snapshot(root), pristine); + } + + #[tokio::test] + async fn drifted_file_keeps_the_tree_and_check_reports_it() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + write(root, "1.9.9", &[]); + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &text_patch(UUID_A), &mut ledger) + .await + .unwrap(); + let e: VendorEntry = ledger.values().next().unwrap().clone(); + let path = root.join(BUILD_FILE); + let good = std::fs::read_to_string(&path).unwrap(); + std::fs::write( + &path, + good.replace("dependencyOverrides +=", "dependencyOverrides +="), + ) + .unwrap(); + assert!(apply::check_entry(root, &e, None).is_err()); + let out = apply::revert(root, &e, crate::vendor::RevertOpts::new(false)).await; + assert!(out.success && out.kept_artifact, "{out:?}"); + assert_eq!(out.warnings[0].code, "vendor_lock_entry_drifted"); + assert!(root + .join(&e.wiring.iter().find(|w| w.kind == TREE_KIND).unwrap().file) + .is_file()); + // A tree file edit is drift for --check too. + std::fs::write(&path, &good).unwrap(); + apply::check_entry(root, &e, None).unwrap(); + let jar = root.join(&e.artifact.path); + let jar = if e.artifact.path.is_empty() { + root.join(format!( + "{}/commons-text-1.10.0-socket.1d3c1fd2.jar", + tree_dir(&text_patch(UUID_A).coords()) + )) + } else { + jar + }; + std::fs::write(&jar, b"tampered").unwrap(); + assert!(apply::check_entry(root, &e, None).is_err()); + } + + #[tokio::test] + async fn last_out_delete_spares_user_owned_files() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + // The user already had a tree .gitattributes: adopted, never deleted. + write( + root, + "1.9.9", + &[(".socket/vendor/maven2/.gitattributes", "* -text\n")], + ); + let pristine = snapshot(root); + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &text_patch(UUID_A), &mut ledger) + .await + .unwrap(); + let out = revert(root, &text_patch(UUID_A), &mut ledger).await; + assert!(out.success, "{out:?}"); + assert_eq!(snapshot(root), pristine); + // Reverting one of two pins re-renders the file, never deletes it. + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &text_patch(UUID_A), &mut ledger) + .await + .unwrap(); + vendor(root, Shape::Sbt, &gson_patch(), &mut ledger) + .await + .unwrap(); + let only_gson = { + let files = snapshot(root); + let read = |p: &str| files.get(p).cloned(); + unplan(&read, &text_patch(UUID_A).coords(), &[]) + }; + assert_eq!(only_gson.changes.len(), 1); + assert!(only_gson.changes[0].1.is_some()); + } + + #[tokio::test] + async fn forged_ledger_records_are_refused() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + write(root, "1.9.9", &[]); + let mut ledger = BTreeMap::new(); + vendor(root, Shape::Sbt, &text_patch(UUID_A), &mut ledger) + .await + .unwrap(); + let before = snapshot(root); + for (file, kind) in [ + ("build.sbt", SBT_FRAGMENT_KIND), + ("../escape.sbt", SBT_FRAGMENT_KIND), + ("project/plugins.sbt", OWNED_FILE_KIND), + (".socket/vendor/maven2/other/x.jar", TREE_KIND), + ] { + let mut e = ledger.values().next().unwrap().clone(); + e.wiring.push(WiringRecord { + file: file.into(), + kind: kind.into(), + action: WiringAction::Added, + key: Some("file".into()), + original: None, + new: Some(json!({ "op": "create" })), + }); + let out = apply::revert(root, &e, crate::vendor::RevertOpts::new(false)).await; + assert!(!out.success, "{file}: {out:?}"); + assert!(apply::check_entry(root, &e, None).is_err(), "{file}"); + assert_eq!(snapshot(root), before, "{file}"); + } + } + + #[tokio::test] + async fn reactor_vendored_before_sbt_files_appear_stays_a_reactor() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + populate( + root, + &[ + ( + "pom.xml", + "\n 4.0.0\n x\n \ + agg\n 1\n \ + pom\n \n a\n \ + \n\n", + ), + ( + "a/pom.xml", + "\n 4.0.0\n \n \ + x\n agg\n \ + 1\n \n a\n \ + \n \n \ + org.apache.commons\n \ + commons-text\n \ + 1.10.0\n \n \n\ + \n", + ), + ], + ); + let reader = |root: &Path| { + let r = apply::ProjectReader::new(root); + super::super::detect(&|rel: &str| r.read(rel)) + }; + assert_eq!(reader(root), Shape::MavenReactor); + let mut ledger = BTreeMap::new(); + let p = text_patch(UUID_A); + vendor(root, Shape::MavenReactor, &p, &mut ledger) + .await + .unwrap(); + write(root, "1.9.9", &[]); + assert_eq!(reader(root), Shape::MavenReactor); + let again = vendor(root, reader(root), &p, &mut ledger).await.unwrap(); + assert!(again.writes.is_empty(), "{:?}", again.writes); + assert!(!root.join(BUILD_FILE).exists()); + // A second patch on the same checkout also stays on the reactor. + let mut fresh = ledger.clone(); + let mut gson = gson_patch(); + gson.uuid = UUID_A2; + vendor(root, reader(root), &gson, &mut fresh).await.unwrap(); + assert!(!root.join(BUILD_FILE).exists()); + } + + #[tokio::test] + async fn redownload_view_reproduces_the_tree() { + // `repair` re-plans with `.socket/vendor/` hidden: the tree writes + // must match the recorded tree exactly. + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + write(root, "1.9.9", &[]); + let mut ledger = BTreeMap::new(); + let p = text_patch(UUID_A); + vendor(root, Shape::Sbt, &p, &mut ledger).await.unwrap(); + let e = ledger.values().next().unwrap(); + let reader = apply::ProjectReader::new(root); + let read = |rel: &str| { + if rel.starts_with(".socket/vendor/") { + None + } else { + reader.read(rel) + } + }; + assert_eq!(super::super::detect(&read), Shape::Sbt); + let replanned = super::super::plan(Shape::Sbt, &read, &super::super::no_list, &p).unwrap(); + let tree: Vec<_> = replanned.writes.iter().filter(|w| w.tree).collect(); + let recorded: Vec<_> = e.wiring.iter().filter(|w| w.kind == TREE_KIND).collect(); + assert_eq!(tree.len(), recorded.len()); + for w in tree { + let rec = recorded.iter().find(|r| r.file == w.rel).expect("recorded"); + assert_eq!( + rec.new.as_ref().and_then(|v| v.as_str()), + Some(sha256_hex(&w.bytes).as_str()) + ); + } + // The generated file is untouched by that re-plan. + assert!(!replanned.writes.iter().any(|w| w.rel == BUILD_FILE)); + // And the committed tree re-plans with no writes at all. + let read = |rel: &str| reader.read(rel); + let (jar, pom, module) = committed(&read, &p.coords()).unwrap(); + let again = JvmPatch { + jar: &jar, + upstream_pom: &pom, + upstream_module: module.as_deref(), + ..p + }; + assert!(plan(&read, &again).unwrap().writes.is_empty()); + } +} diff --git a/crates/socket-patch-core/src/vendor/jvm/sbt_gate.rs b/crates/socket-patch-core/src/vendor/jvm/sbt_gate.rs new file mode 100644 index 000000000..adb409f38 --- /dev/null +++ b/crates/socket-patch-core/src/vendor/jvm/sbt_gate.rs @@ -0,0 +1,766 @@ +//! The vendored sbt gate: `formats::sbt::gate` over the build's local +//! evidence (`crawlers::sbt_evidence::distill`), before planning. +//! +//! - A NEW pin ([`gate::check_new`]): the run-level conditions (no +//! evidence, incomplete, stale) skip the patch with one `vendor_sbt_*` +//! warning and exit 0; a GA no library configuration resolves is skipped +//! silently (a debug line; `vendor_sbt_meta_build_only` when only the +//! meta-build resolves it); the per-candidate conditions refuse it. +//! - A pin already in `socket-patch-vendor.sbt` for this GA and base +//! ([`gate::check_existing`], re-planned idempotently): advisories only, +//! unless the build now declares the GA newer than the pin's base +//! (`vendor_sbt_pin_declared_newer`, refused: the override would force it +//! back down). A dependency digest that moved is re-verified against +//! evidence resolved since (fresh, newer than the generated file) and +//! then recorded anew ([`GatePass::deps_digest`]); without such evidence +//! it is `vendor_sbt_pin_unverifiable`. A base version still resolved is +//! `vendor_sbt_override_shadowed`, the suffixed version served from +//! outside the vendored tree is `vendor_sbt_resolved_elsewhere`. Evidence +//! older than the generated file proves nothing about the pin (sbt has +//! not resolved since it was written) and is not checked. +//! +//! The digest a pin records is always the distilled document's +//! ([`ResolutionDoc::deps_digest`], every build source the walk read), the +//! same definition the hosted rewriter uses. +//! +//! The owned-file states (modified, foreign) are the planner's refusals +//! (`vendor::jvm::sbt`); the gate reads the file only to find an existing +//! pin. + +use std::path::Path; + +use super::{JvmRefusal, JvmWarning, Shape}; +use crate::crawlers::jvm_cache::debug_log; +use crate::formats::sbt::build::declared_newer; +use crate::formats::sbt::evidence::ResolutionDoc; +use crate::formats::sbt::gate::{self, GateRefusal, GateWarning}; +use crate::formats::sbt::owned_file::{ + self, SbtFileMode, SbtPin, VENDORED_FILE, VENDORED_REPO_REL, +}; +use crate::vendor::common::refused; +use crate::vendor::{VendorOutcome, VendorWarning}; + +/// Every code a [`GateStop::Skip`] / [`GateStop::Silent`] carries into its +/// [`VendorOutcome::Refused`]: an expected skip (exit 0, a `skipped` event +/// naming why), never a failure, and never counted as applied. +pub const SKIP_CODES: &[&str] = &[ + "vendor_sbt_no_resolution_evidence", + "vendor_sbt_resolution_incomplete", + "vendor_sbt_resolution_stale", + "vendor_sbt_meta_build_only", + NOT_RESOLVED, + "vendor_scala_cli_resolution_missing", + "vendor_scala_cli_resolution_stale", + "vendor_scala_cli_not_resolved", +]; + +/// The code of a [`GateStop::Silent`] outcome. +pub const NOT_RESOLVED: &str = "vendor_jvm_not_resolved"; + +/// The remedy every run-level skip names. +const UPDATE_REMEDY: &str = + "run `sbt update` (or `sbt Test/compile`) for the whole build, then re-run socket-patch"; + +/// Why the gate stopped a patch. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum GateStop { + /// A run-level condition: nothing is vendored, the run still succeeds. + Skip(JvmWarning), + /// A per-patch refusal. + Refuse(JvmRefusal), + /// The build does not resolve the GA: nothing to vendor, no warning. + Silent, +} + +impl GateStop { + /// The vendor outcome for a stopped patch: a refusal. A run-level skip + /// (and the silent not-resolved one) refuses with a [`SKIP_CODES`] + /// code, which the CLI records as an expected skip: nothing was + /// vendored, so it is never reported applied. + pub(crate) fn into_outcome(self, purl: &str) -> VendorOutcome { + match self { + GateStop::Refuse(r) => refused(r.code, r.detail), + GateStop::Skip(w) => refused(w.code, w.detail), + GateStop::Silent => refused( + NOT_RESOLVED, + format!("no project of the build resolves {purl}; nothing to vendor"), + ), + } + } + + /// The `(code, detail)` this stop reports. + pub fn code_and_detail(&self, purl: &str) -> (&'static str, String) { + match self { + GateStop::Refuse(r) => (r.code, r.detail.clone()), + GateStop::Skip(w) => (w.code, w.detail.clone()), + GateStop::Silent => ( + NOT_RESOLVED, + format!("no project of the build resolves {purl}; nothing to vendor"), + ), + } + } +} + +/// A patch the gate let through. +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct GatePass { + /// The advisories to carry. + pub warnings: Vec, + /// The dependency digest the sbt pin records (`None`: not an sbt build, + /// or the walk read no build source; the planner then computes its + /// own). + pub deps_digest: Option, +} + +/// [`GatePass`] as vendor warnings. +#[derive(Debug, Clone, Default)] +pub(crate) struct ShapePass { + pub warnings: Vec, + pub deps_digest: Option, +} + +/// The gate of a project of `shape` ([`check`] for sbt, +/// [`super::coursier_gate::check`] for scala-cli, none otherwise). +pub(crate) fn for_shape( + shape: Shape, + project_root: &Path, + g: &str, + a: &str, + base: &str, +) -> Result { + let pass = match shape { + Shape::Sbt => check(project_root, g, a, base)?, + Shape::ScalaCli => GatePass { + warnings: super::coursier_gate::check(project_root, g, a, base)?, + deps_digest: None, + }, + _ => GatePass::default(), + }; + Ok(ShapePass { + warnings: pass + .warnings + .into_iter() + .map(|w| VendorWarning::new(w.code, w.detail)) + .collect(), + deps_digest: pass.deps_digest, + }) +} + +/// Gate vendoring `g:a` at upstream `base` into the sbt build at +/// `project_root`. +pub fn check(project_root: &Path, g: &str, a: &str, base: &str) -> Result { + let doc = crate::crawlers::sbt_evidence::distill(project_root); + let existing = existing_pin(project_root, g, a); + decide(&doc, existing.as_ref(), g, a, base) +} + +/// The pin `socket-patch-vendor.sbt` holds for `g:a`, when the file parses +/// as socket-patch's own (FIFO-safe read). +fn existing_pin(project_root: &Path, g: &str, a: &str) -> Option { + let bytes = + crate::utils::fs::read_regular_to_bytes_sync(&project_root.join(VENDORED_FILE)).ok()?; + let text = String::from_utf8(bytes).ok()?; + let file = owned_file::parse(SbtFileMode::Vendored, &text).ok()?; + file.pins + .into_values() + .find(|p| p.group == g && p.artifact == a) +} + +fn warning(code: &'static str, detail: impl Into) -> JvmWarning { + JvmWarning { + code, + detail: detail.into(), + } +} + +/// [`check`] over a distilled `doc` and the `existing` pin for `g:a`. +pub(crate) fn decide( + doc: &ResolutionDoc, + existing: Option<&SbtPin>, + g: &str, + a: &str, + base: &str, +) -> Result { + let ga = format!("{g}:{a}"); + let newer = declared_newer(&doc.declared_deps, g, a, base); + if let Some(pin) = existing.filter(|p| p.base == base) { + if !newer.is_empty() { + return Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_pin_declared_newer", + detail: format!( + "the build now declares {ga} {}, but {VENDORED_FILE} forces the patched {} \ + (base {base}), a downgrade sbt's load-time check refuses; revert the patch \ + (`socket-patch vendor --revert`), or declare {base} again", + newer.join(", "), + pin.sv + ), + })); + } + return Ok(existing_advisories(doc, pin, g, a)); + } + // Evidence resolved under an earlier pin (a patch update) shows the + // suffixed version whatever the build declares now. + if !newer.is_empty() { + return Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_version_conflict", + detail: format!( + "the build declares {ga} {} but the patch is for {base}; a build-wide pin would \ + downgrade it", + newer.join(", ") + ), + })); + } + let res = doc.resolution.as_ref(); + match gate::check_new(res, doc.declared.as_ref(), doc.stale, g, a, base) { + Ok(warnings) => Ok(GatePass { + warnings: warnings.into_iter().map(|w| advisory(w, &ga)).collect(), + deps_digest: (!doc.deps_digest.is_empty()).then(|| doc.deps_digest.clone()), + }), + Err(GateRefusal::Missing) => { + let why = doc + .read_error + .as_deref() + .map(|e| format!(" ({e})")) + .unwrap_or_default(); + Err(GateStop::Skip(warning( + "vendor_sbt_no_resolution_evidence", + format!( + "no readable sbt resolution evidence under target/{why}; {ga} not vendored: {UPDATE_REMEDY}" + ), + ))) + } + Err(GateRefusal::Incomplete { missing }) => { + let which = if missing.is_empty() { + "the build's project definitions cannot be read statically (a computed \ + `Project(...)`, `projectMatrix` or `crossProject`), so not every project's \ + resolution can be checked" + .to_string() + } else { + format!( + "these projects have no sbt resolution evidence: {}", + missing.join(", ") + ) + }; + Err(GateStop::Skip(warning( + "vendor_sbt_resolution_incomplete", + format!("{which}; {ga} not vendored: {UPDATE_REMEDY}"), + ))) + } + Err(GateRefusal::Stale) => Err(GateStop::Skip(warning( + "vendor_sbt_resolution_stale", + format!( + "a build source is newer than sbt's resolution evidence; {ga} not vendored: \ + {UPDATE_REMEDY} (`sbt clean update` if this persists)" + ), + ))), + Err(GateRefusal::NotResolved { meta_build_only }) => { + if meta_build_only { + return Err(GateStop::Skip(warning( + "vendor_sbt_meta_build_only", + format!( + "{ga} is resolved only by the meta-build (sbt plugins under project/), \ + which a library pin does not reach; not vendored" + ), + ))); + } + debug_log(&format!( + "vendor_sbt_not_resolved: no project of the sbt build resolves {ga}; skipped" + )); + Err(GateStop::Silent) + } + Err(GateRefusal::VersionConflict { found }) => Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_version_conflict", + detail: format!( + "the build resolves {ga} at {} but the patch is for {base}; a build-wide pin \ + would change the version some project resolves", + found.join(", ") + ), + })), + Err(GateRefusal::ScalaRuntime) => Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_scala_runtime_unsupported", + detail: format!( + "{ga} is the Scala runtime / compiler, which sbt pins through scalaVersion; \ + not vendored" + ), + })), + Err(GateRefusal::Classifier { found }) => Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_classifier_unsupported", + detail: format!( + "the build resolves {ga} with the classifier(s) {}, which the patched jar \ + does not replace", + found.join(", ") + ), + })), + // Only `check_existing` refuses with this. + Err(GateRefusal::ResolvedElsewhere { paths }) => Err(GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_resolved_elsewhere", + detail: format!("{ga} resolves from {}", display_paths(&paths)), + })), + } +} + +/// The advisories on a pin already written for `g:a` at its base, and the +/// digest it keeps recording. +fn existing_advisories(doc: &ResolutionDoc, pin: &SbtPin, g: &str, a: &str) -> GatePass { + let ga = format!("{g}:{a}"); + let mut out = Vec::new(); + // The digest comes from the build sources alone: only a walk that read + // none (a cap) leaves it empty, a malformed record does not. + let moved = !doc.deps_digest.is_empty() && pin.deps_digest != doc.deps_digest; + // Only evidence sbt resolved after the change (fresh, and newer than + // the generated file) re-verifies a pin whose dependencies moved. + let fresh = doc.resolution.is_some() && !doc.stale && !doc.wiring_newer; + if moved && !fresh { + out.push(warning( + "vendor_sbt_pin_unverifiable", + format!( + "the build's dependencies changed since {ga} was pinned (digest {} → {}); \ + run `sbt update`, then re-run socket-patch to re-check the pin still resolves \ + {}", + pin.deps_digest, doc.deps_digest, pin.sv + ), + )); + } + let mut verified = true; + if !doc.wiring_newer { + let repo = doc.root.join(VENDORED_REPO_REL); + let pinned_bytes = |path: &Path| doc.holds_pinned_bytes(path, &pin.jar_sha256); + match gate::check_existing(doc.resolution.as_ref(), g, a, &pin.sv, &repo, &pinned_bytes) { + Ok(warnings) => { + verified = warnings.is_empty(); + out.extend(warnings.into_iter().map(|w| advisory(w, &ga))); + } + Err(GateRefusal::ResolvedElsewhere { paths }) => { + verified = false; + out.push(warning( + "vendor_sbt_resolved_elsewhere", + format!( + "{ga} {} resolves from outside {VENDORED_REPO_REL}: {}; another \ + repository serves the pinned version", + pin.sv, + display_paths(&paths) + ), + )) + } + Err(_) => verified = false, + } + } + let deps_digest = if moved && fresh && verified { + doc.deps_digest.clone() + } else { + pin.deps_digest.clone() + }; + GatePass { + warnings: out, + deps_digest: Some(deps_digest), + } +} + +fn advisory(w: GateWarning, ga: &str) -> JvmWarning { + match w { + GateWarning::OverrideShadowed { evidence } => warning( + "vendor_sbt_override_shadowed", + format!( + "sbt still resolves the unpatched {ga} in {} (a project-level \ + `dependencyOverrides :=` shadows the generated one)", + evidence.join(", ") + ), + ), + GateWarning::MetaBuildOnly => warning( + "vendor_sbt_meta_build_only", + format!("{ga} is also resolved by the meta-build, which the pin does not reach"), + ), + } +} + +fn display_paths(paths: &[std::path::PathBuf]) -> String { + paths + .iter() + .map(|p| p.display().to_string()) + .collect::>() + .join(", ") +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeSet; + use std::path::PathBuf; + + use super::*; + use crate::formats::sbt::JvmResolution; + + const G: &str = "org.apache.commons"; + const A: &str = "commons-lang3"; + const SV: &str = "3.11-socket.abcdef12"; + + fn ga(g: &str, a: &str) -> (String, String) { + (g.to_string(), a.to_string()) + } + + fn res(versions: &[&str]) -> JvmResolution { + let mut r = JvmResolution { + projects_seen: BTreeSet::from([".".to_string()]), + ..Default::default() + }; + for v in versions { + r.modules + .entry(ga(G, A)) + .or_default() + .entry(v.to_string()) + .or_default() + .insert(format!("target/x:compile@{v}")); + r.in_scope.insert(ga(G, A)); + } + r + } + + fn doc(r: Option) -> ResolutionDoc { + ResolutionDoc { + root: PathBuf::from("/w"), + resolution: r, + declared: Some(BTreeSet::from([".".to_string()])), + deps_digest: "0123abcd".into(), + ..Default::default() + } + } + + fn pin() -> SbtPin { + SbtPin { + uuid: "abcdef12-0000-4000-8000-000000000001".into(), + group: G.into(), + artifact: A.into(), + base: "3.11".into(), + sv: SV.into(), + pom_sha256: "0".repeat(64), + jar_sha256: "1".repeat(64), + deps_digest: "0123abcd".into(), + index_url: None, + } + } + + fn code(r: Result) -> Vec<&'static str> { + match r { + Ok(p) => p.warnings.iter().map(|w| w.code).collect(), + Err(GateStop::Skip(w)) => vec!["skip", w.code], + Err(GateStop::Refuse(r)) => vec!["refuse", r.code], + Err(GateStop::Silent) => vec!["silent"], + } + } + + #[test] + fn new_pins_split_run_level_skips_from_refusals() { + let ok = doc(Some(res(&["3.11"]))); + assert!(code(decide(&ok, None, G, A, "3.11")).is_empty()); + let cases: Vec<(ResolutionDoc, &str, &str, Vec<&str>)> = vec![ + ( + doc(None), + G, + A, + vec!["skip", "vendor_sbt_no_resolution_evidence"], + ), + ( + ResolutionDoc { + declared: None, + ..ok.clone() + }, + G, + A, + vec!["skip", "vendor_sbt_resolution_incomplete"], + ), + ( + ResolutionDoc { + declared: Some(BTreeSet::from([".".into(), "b".into()])), + ..ok.clone() + }, + G, + A, + vec!["skip", "vendor_sbt_resolution_incomplete"], + ), + ( + ResolutionDoc { + stale: true, + ..ok.clone() + }, + G, + A, + vec!["skip", "vendor_sbt_resolution_stale"], + ), + (ok.clone(), "com.x", "y", vec!["silent"]), + ( + ok.clone(), + "org.scala-lang", + "scala-library", + vec!["refuse", "vendor_sbt_scala_runtime_unsupported"], + ), + ( + doc(Some(res(&["3.11", "3.12.0"]))), + G, + A, + vec!["refuse", "vendor_sbt_version_conflict"], + ), + ]; + for (d, g, a, want) in cases { + assert_eq!(code(decide(&d, None, g, a, "3.11")), want, "{g}:{a}"); + } + let mut meta = res(&[]); + meta.meta_build.insert(ga(G, A)); + assert_eq!( + code(decide(&doc(Some(meta)), None, G, A, "3.11")), + ["skip", "vendor_sbt_meta_build_only"] + ); + let mut cl = res(&["3.11"]); + cl.classifiers + .insert(ga(G, A), BTreeSet::from(["tests".to_string()])); + assert_eq!( + code(decide(&doc(Some(cl)), None, G, A, "3.11")), + ["refuse", "vendor_sbt_classifier_unsupported"] + ); + // The read error names why there is no evidence. + let unreadable = ResolutionDoc { + read_error: Some("over the cap".into()), + ..doc(None) + }; + let Err(GateStop::Skip(w)) = decide(&unreadable, None, G, A, "3.11") else { + panic!() + }; + assert!(w.detail.contains("over the cap"), "{}", w.detail); + } + + #[test] + fn existing_pins_carry_advisories_only() { + let p = pin(); + let repo_jar = PathBuf::from("/w/.socket/vendor/maven2/org/apache/commons/x.jar"); + let mut verified = res(&[SV]); + verified + .artifacts + .entry((G.into(), A.into(), SV.into())) + .or_default() + .insert(repo_jar); + assert!(code(decide(&doc(Some(verified.clone())), Some(&p), G, A, "3.11")).is_empty()); + // No evidence, stale or a conflict: the existing pin is re-planned. + assert!(code(decide(&doc(None), Some(&p), G, A, "3.11")).is_empty()); + let stale = ResolutionDoc { + stale: true, + ..doc(Some(res(&["3.12.0"]))) + }; + assert!(code(decide(&stale, Some(&p), G, A, "3.11")).is_empty()); + // Shadowed: the base still resolves. + assert_eq!( + code(decide( + &doc(Some(res(&["3.11", SV]))), + Some(&p), + G, + A, + "3.11" + )), + ["vendor_sbt_override_shadowed"] + ); + // ...unless the evidence predates the wiring. + let before = ResolutionDoc { + wiring_newer: true, + ..doc(Some(res(&["3.11"]))) + }; + assert!(code(decide(&before, Some(&p), G, A, "3.11")).is_empty()); + // Served from elsewhere. + let mut elsewhere = verified.clone(); + elsewhere + .artifacts + .get_mut(&(G.into(), A.into(), SV.into())) + .unwrap() + .insert(PathBuf::from("/root/.ivy2/local/x.jar")); + assert_eq!( + code(decide( + &doc(Some(elsewhere.clone())), + Some(&p), + G, + A, + "3.11" + )), + ["vendor_sbt_resolved_elsewhere"] + ); + // ...unless that copy holds the pinned bytes (content, not place). + let same_bytes = ResolutionDoc { + artifact_sha256: [( + PathBuf::from("/root/.ivy2/local/x.jar"), + p.jar_sha256.clone(), + )] + .into(), + ..doc(Some(elsewhere)) + }; + assert!(code(decide(&same_bytes, Some(&p), G, A, "3.11")).is_empty()); + // The build's dependencies moved since the pin: re-verified by + // fresh evidence, the new digest is recorded... + let moved = ResolutionDoc { + deps_digest: "ffffffff".into(), + ..doc(Some(verified.clone())) + }; + let pass = decide(&moved, Some(&p), G, A, "3.11").unwrap(); + assert!(pass.warnings.is_empty(), "{:?}", pass.warnings); + assert_eq!(pass.deps_digest.as_deref(), Some("ffffffff")); + // ...stale evidence (or none) cannot, and the old digest is kept. + let moved = ResolutionDoc { + stale: true, + ..moved + }; + assert_eq!( + code(decide(&moved, Some(&p), G, A, "3.11")), + ["vendor_sbt_pin_unverifiable"] + ); + assert_eq!( + decide(&moved, Some(&p), G, A, "3.11") + .unwrap() + .deps_digest + .as_deref(), + Some("0123abcd") + ); + // An unchanged pin keeps its digest; a new one records the doc's. + assert_eq!( + decide(&doc(Some(verified)), Some(&p), G, A, "3.11") + .unwrap() + .deps_digest + .as_deref(), + Some("0123abcd") + ); + assert_eq!( + decide(&doc(Some(res(&["3.11"]))), None, G, A, "3.11") + .unwrap() + .deps_digest + .as_deref(), + Some("0123abcd") + ); + // ...still checked when a record is malformed (the digest reads only + // the build sources), never when the walk read nothing. + let malformed = ResolutionDoc { + resolution: None, + read_error: Some("malformed".into()), + ..moved.clone() + }; + assert_eq!( + code(decide(&malformed, Some(&p), G, A, "3.11")), + ["vendor_sbt_pin_unverifiable"] + ); + let capped = ResolutionDoc { + read_error: Some("over the cap".into()), + deps_digest: String::new(), + ..doc(None) + }; + assert!(code(decide(&capped, Some(&p), G, A, "3.11")).is_empty()); + // A pin for another base is no existing pin: the new-pin gate runs. + assert_eq!( + code(decide(&doc(Some(res(&["3.11"]))), Some(&p), G, A, "3.12.0")), + ["refuse", "vendor_sbt_version_conflict"] + ); + } + + #[test] + fn a_declared_bump_refuses_the_existing_pin() { + let p = pin(); + let bumped = ResolutionDoc { + declared_deps: [crate::formats::sbt::build::DepLiteral { + group: G.into(), + op: "%".into(), + artifact: A.into(), + version: "3.12.0".into(), + }] + .into(), + ..doc(Some(res(&[SV]))) + }; + assert_eq!( + code(decide(&bumped, Some(&p), G, A, "3.11")), + ["refuse", "vendor_sbt_pin_declared_newer"] + ); + // A patch update over evidence resolved under the old pin. + let other = SbtPin { + base: "3.10".into(), + ..p + }; + assert_eq!( + code(decide(&bumped, Some(&other), G, A, "3.11")), + ["refuse", "vendor_sbt_version_conflict"] + ); + // Declaring the base (or older) again is fine. + let same = ResolutionDoc { + declared_deps: [crate::formats::sbt::build::DepLiteral { + group: G.into(), + op: "%".into(), + artifact: A.into(), + version: "3.11".into(), + }] + .into(), + ..doc(Some(res(&[SV]))) + }; + assert!(code(decide(&same, Some(&pin()), G, A, "3.11")).is_empty()); + } + + #[test] + fn into_outcome_maps_every_stop() { + // Skips refuse with a skip code: never a successful (applied) no-op. + assert!(matches!( + GateStop::Silent.into_outcome("pkg:maven/g/a@1"), + VendorOutcome::Refused { + code: NOT_RESOLVED, + .. + } + )); + assert!(matches!( + GateStop::Skip(warning("vendor_sbt_resolution_stale", "x")) + .into_outcome("pkg:maven/g/a@1"), + VendorOutcome::Refused { + code: "vendor_sbt_resolution_stale", + .. + } + )); + assert!(matches!( + GateStop::Refuse(JvmRefusal { + code: "vendor_sbt_version_conflict", + detail: String::new() + }) + .into_outcome("pkg:maven/g/a@1"), + VendorOutcome::Refused { + code: "vendor_sbt_version_conflict", + .. + } + )); + for code in [ + "vendor_sbt_no_resolution_evidence", + "vendor_sbt_meta_build_only", + "vendor_scala_cli_not_resolved", + ] { + assert!(SKIP_CODES.contains(&code), "{code}"); + } + assert!(!SKIP_CODES.contains(&"vendor_sbt_version_conflict")); + } + + #[test] + fn check_reads_the_disk_build() { + // An sbt build with no evidence: one run-level skip. + let tmp = tempfile::tempdir().unwrap(); + std::fs::create_dir_all(tmp.path().join("project")).unwrap(); + std::fs::write( + tmp.path().join("project/build.properties"), + "sbt.version=1.9.9\n", + ) + .unwrap(); + std::fs::write(tmp.path().join("build.sbt"), "").unwrap(); + assert_eq!( + code(check(tmp.path(), G, A, "3.11")), + ["skip", "vendor_sbt_no_resolution_evidence"] + ); + // The probe matrix: lang3 3.11 has a `tests` classifier, gson is + // clean. + let root = tmp.path().join("x"); + crate::crawlers::sbt_evidence::stage_fixture( + &Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/sbt/evidence/1.9.9/matrix"), + &root, + ); + assert_eq!( + code(check(&root, G, A, "3.11")), + ["refuse", "vendor_sbt_classifier_unsupported"] + ); + assert!(code(check(&root, "com.google.code.gson", "gson", "2.8.9")).is_empty()); + assert_eq!( + code(check(&root, "com.google.code.gson", "gson", "2.10.1")), + ["refuse", "vendor_sbt_version_conflict"] + ); + } +} diff --git a/crates/socket-patch-core/src/vendor/jvm/scala_cli.rs b/crates/socket-patch-core/src/vendor/jvm/scala_cli.rs new file mode 100644 index 000000000..7a2cdc128 --- /dev/null +++ b/crates/socket-patch-core/src/vendor/jvm/scala_cli.rs @@ -0,0 +1,550 @@ +//! Vendored scala-cli directory builds (`docs/design/sbt-support.md`, +//! "scala-cli vendored"). Only owned files are written: a root +//! [`ROOT_FILE`] that `//> using file`s the guard [`GUARD_REL`] inside the +//! tree, whose `//> using repository file://${.}` adds the same-GAV Coursier +//! tree (`super::coursier_tree`) as a repository (adding, not replacing, so +//! mirrors and `COURSIER_REPOSITORIES` survive). Deleting the tree deletes +//! the guard, so the build fails loudly (`File not found`) instead of +//! silently resolving upstream. +//! +//! Probed on scala-cli 1.17.1: `${.}` expands to the directory of the file +//! holding the directive, from any working directory and with or without +//! Bloop; a root `.scala` file is part of every directory build, while files +//! under `.socket/` are not (hence the `using file`). A repository another +//! input declares is consulted first and shadows the tree; the gate +//! (`super::coursier_gate`) refuses those builds. + +use std::collections::BTreeMap; + +use super::coursier_tree::{self, GITATTRIBUTES_REL, GITIGNORE, GITIGNORE_REL, INDEX_REL}; +use super::{ + finish_writes, op_of, CommittedTree, Coords, JvmPatch, JvmPlan, JvmRefusal, JvmUnplan, + JvmWarning, ReadFn, Shape, WiringRecord, +}; + +/// The root file scala-cli picks up in a directory build. +pub const ROOT_FILE: &str = "socket-patch.scala"; +/// The guard inside the tree. +pub const GUARD_REL: &str = ".socket/vendor/coursier/socket-patch.scala"; +/// The scala-cli project file (its presence warns +/// `vendor_scala_cli_directives_split`). +pub const PROJECT_FILE: &str = "project.scala"; +/// [`ROOT_FILE`]'s bytes. +pub const ROOT_BYTES: &str = + "// managed by socket-patch\n//> using file .socket/vendor/coursier/socket-patch.scala\n"; +/// [`GUARD_REL`]'s bytes. +pub const GUARD_BYTES: &str = "// managed by socket-patch\n//> using repository file://${.}\n"; + +/// Whether a file at the root makes it another build tool's (they win: a +/// stray `project.scala` never turns a reactor or a Mill build into a +/// scala-cli one). `.mill-version` alone is not a Mill build file. +fn other_build_file(read: ReadFn<'_>) -> bool { + use crate::patch::redirect::{ + gradle::GRADLE_ROOT_FILES as GRADLE_FILES, scala_guidance::MILL_MARKERS, + }; + std::iter::once(&"pom.xml") + .chain(GRADLE_FILES) + .chain(MILL_MARKERS.iter().filter(|m| **m != ".mill-version")) + .any(|f| read(f).is_some()) +} + +/// [`Shape::ScalaCli`] for a scala-cli directory build: `project.scala` or +/// the root `socket-patch.scala`, and no Maven, Gradle or Mill build file. +pub fn detect(read: ReadFn<'_>) -> Option { + let marked = read(PROJECT_FILE).is_some() || read(ROOT_FILE).is_some(); + (marked && !other_build_file(read)).then_some(Shape::ScalaCli) +} + +/// Whether `rel` is a file this planner edits or owns. +pub fn is_wiring_file(rel: &str) -> bool { + rel == ROOT_FILE || rel == GUARD_REL +} + +/// Whether `rel` is a file this planner (or its tree) owns outright. +pub fn is_owned_file(rel: &str) -> bool { + is_wiring_file(rel) || [INDEX_REL, GITIGNORE_REL, GITATTRIBUTES_REL].contains(&rel) +} + +/// Whether `wiring` belongs to this planner. +pub fn owns(wiring: &[WiringRecord]) -> bool { + wiring.iter().any(|w| { + w.kind == super::COURSIER_INDEX_KIND + || w.file == ROOT_FILE + || w.file + .starts_with(&format!("{}/", coursier_tree::TREE_ROOT)) + }) +} + +/// `bytes` are the owned text `expected` (a CRLF checkout of it counts). +fn is_ours(bytes: &[u8], expected: &str) -> bool { + bytes == expected.as_bytes() || bytes == expected.replace('\n', "\r\n").as_bytes() +} + +fn modified(rel: &str) -> JvmRefusal { + JvmRefusal { + code: "vendor_scala_cli_owned_file_modified", + detail: format!( + "{rel} exists but is not the file socket-patch writes; restore it from git or delete \ + it (vendoring rewrites it), then re-run" + ), + } +} + +/// Plan vendoring `patch` into the scala-cli build `read` serves. +pub fn plan(read: ReadFn<'_>, patch: &JvmPatch<'_>) -> Result { + if !crate::patch::path_safety::is_canonical_uuid(patch.uuid) { + return Err(JvmRefusal { + code: "unsafe_coordinates", + detail: format!("non-canonical patch uuid {:?}", patch.uuid), + }); + } + for (rel, expected) in [(ROOT_FILE, ROOT_BYTES), (GUARD_REL, GUARD_BYTES)] { + if read(rel).is_some_and(|b| !is_ours(&b, expected)) { + return Err(modified(rel)); + } + } + let mut warnings = Vec::new(); + if read(PROJECT_FILE).is_some() { + warnings.push(JvmWarning { + code: "vendor_scala_cli_directives_split", + detail: format!( + "{PROJECT_FILE} exists, so scala-cli warns \"Using directives detected in \ + multiple files\" about {ROOT_FILE}; socket-patch keeps its one directive in its \ + own file and never edits {PROJECT_FILE}" + ), + }); + } + let mut writes = Vec::new(); + let mut records = coursier_tree::plan_tree(read, patch, &mut writes)?; + records.push(super::owned_file_with( + read, + GUARD_REL, + GUARD_BYTES.as_bytes(), + &mut writes, + )); + records.push(super::owned_file_with( + read, + ROOT_FILE, + ROOT_BYTES.as_bytes(), + &mut writes, + )); + let c = patch.coords(); + let tree_dir = coursier_tree::tree_dir(&c); + Ok(JvmPlan { + tree_files: super::tree_files(&writes), + writes: finish_writes(read, writes), + records, + warnings, + jar_rel: format!("{tree_dir}/{}-{}.jar", c.artifact_id, c.version), + tree_dir, + }) +} + +/// Plan the revert of the patch at `c`: its index rows go now; the index, +/// the root file, the guard and the tree root's git files once no other +/// patch has a row. A modified owned file is left alone (drifted); while the +/// root file left behind still includes the guard, the guard and the tree +/// stay too, so the build keeps resolving the vendored bytes. +pub fn unplan(read: ReadFn<'_>, c: &Coords<'_>, records: &[WiringRecord]) -> JvmUnplan { + let mut drifted = Vec::new(); + let mut changes: BTreeMap>> = BTreeMap::new(); + let index = read(INDEX_REL); + let crlf = index + .as_deref() + .is_some_and(|b| b.windows(2).any(|w| w == b"\r\n")); + let rows = match index { + None => Vec::new(), + Some(bytes) => match coursier_tree::parse_index(&bytes) { + Ok(rows) => rows, + Err(why) => { + drifted.push(format!( + "{INDEX_REL} is malformed ({why}); its rows were left alone" + )); + return JvmUnplan { + changes: Vec::new(), + drifted, + still_wired: true, + }; + } + }, + }; + let others: Vec<_> = rows.iter().filter(|r| r.uuid != c.uuid).cloned().collect(); + let mut still_wired = false; + if !others.is_empty() { + if others.len() != rows.len() { + changes.insert( + INDEX_REL.to_string(), + Some(coursier_tree::render_index_like(&others, crlf).into_bytes()), + ); + } + } else { + if read(INDEX_REL).is_some() { + changes.insert(INDEX_REL.to_string(), None); + } + let created = |rel: &str| { + records + .iter() + .any(|w| w.file == rel && op_of(w) == "create") + }; + let root = read(ROOT_FILE); + let root_goes = root + .as_deref() + .is_some_and(|b| created(ROOT_FILE) && is_ours(b, ROOT_BYTES)); + let root_stays_wired = !root_goes + && root.as_deref().is_some_and(|b| { + String::from_utf8_lossy(b).contains(&format!("//> using file {GUARD_REL}")) + }); + if root_stays_wired { + drifted.push(format!( + "{ROOT_FILE} still includes {GUARD_REL}; the guard and the vendored tree stay \ + until it no longer does" + )); + still_wired = true; + } + for (rel, expected) in [ + (ROOT_FILE, ROOT_BYTES), + (GUARD_REL, GUARD_BYTES), + (GITIGNORE_REL, GITIGNORE), + (GITATTRIBUTES_REL, super::TREE_GITATTRIBUTES), + ] { + if rel == GUARD_REL && root_stays_wired { + continue; + } + let Some(bytes) = read(rel) else { continue }; + match (created(rel), is_ours(&bytes, expected)) { + (true, true) => { + changes.insert(rel.to_string(), None); + } + (true, false) if rel != ROOT_FILE || !root_stays_wired => { + drifted.push(format!("{rel} was modified")); + } + _ => {} + } + } + } + JvmUnplan { + changes: changes.into_iter().collect(), + drifted, + still_wired, + } +} + +/// Whether the build still wires the patch at `c`: the index lists it and +/// both the root file and the guard are in place. +pub fn wired_checked(read: ReadFn<'_>, c: &Coords<'_>) -> Result { + let indexed = coursier_tree::indexed(read, c)?; + let ours = |rel: &str, expected: &str| read(rel).is_some_and(|b| is_ours(&b, expected)); + Ok(indexed && ours(ROOT_FILE, ROOT_BYTES) && ours(GUARD_REL, GUARD_BYTES)) +} + +/// The committed tree bytes of the patch at `c`. +pub fn committed(read: ReadFn<'_>, c: &Coords<'_>) -> Option { + coursier_tree::committed(read, c) +} + +#[cfg(test)] +mod tests { + use super::super::testing::{dirs, populate, revert, snapshot, vendor}; + use super::*; + + const UUID: &str = "abcdef12-3456-4789-8abc-def012345678"; + const OTHER: &str = "12345678-3456-4789-8abc-def012345678"; + const UPDATE: &str = "fedcba98-3456-4789-8abc-def012345678"; + + fn patch(a: &'static str, uuid: &'static str, jar: &'static [u8]) -> JvmPatch<'static> { + JvmPatch { + group_id: "com.typesafe", + artifact_id: a, + version: "1.4.3", + uuid, + jar, + upstream_pom: b"\n", + upstream_module: None, + extra_artifacts: &[], + patched_members: &[], + } + } + + fn fs(files: &[(&str, &str)]) -> impl Fn(&str) -> Option> { + let map: BTreeMap> = files + .iter() + .map(|(k, v)| (k.to_string(), v.as_bytes().to_vec())) + .collect(); + move |p: &str| map.get(p).cloned() + } + + #[test] + fn detects_project_scala_or_root_file_without_other_builds() { + assert_eq!(detect(&fs(&[(PROJECT_FILE, "")])), Some(Shape::ScalaCli)); + assert_eq!( + detect(&fs(&[(ROOT_FILE, ROOT_BYTES)])), + Some(Shape::ScalaCli) + ); + assert_eq!(detect(&fs(&[("main.scala", "")])), None); + // `.mill-version` alone is no Mill build. + assert_eq!( + detect(&fs(&[(PROJECT_FILE, ""), (".mill-version", "")])), + Some(Shape::ScalaCli) + ); + for other in [ + "pom.xml", + "settings.gradle", + "settings.gradle.kts", + "build.gradle", + "build.gradle.kts", + "build.mill", + "build.mill.yaml", + "build.sc", + ] { + assert_eq!( + detect(&fs(&[(PROJECT_FILE, ""), (other, "")])), + None, + "{other}" + ); + } + assert!(is_owned_file(GUARD_REL) && is_owned_file(INDEX_REL)); + assert!(!is_owned_file("project.scala")); + } + + #[test] + fn plans_owned_files_only() { + let plan = plan(&fs(&[("main.scala", "x")]), &patch("config", UUID, b"J")).unwrap(); + let rels: Vec<&str> = plan.writes.iter().map(|w| w.rel.as_str()).collect(); + assert!( + rels.contains(&ROOT_FILE) && rels.contains(&GUARD_REL), + "{rels:?}" + ); + assert!(rels + .iter() + .all(|r| *r == ROOT_FILE || r.starts_with(".socket/vendor/coursier"))); + let by = |rel: &str| { + plan.writes + .iter() + .find(|w| w.rel == rel) + .unwrap() + .bytes + .clone() + }; + assert_eq!(by(ROOT_FILE), ROOT_BYTES.as_bytes()); + assert_eq!(by(GUARD_REL), GUARD_BYTES.as_bytes()); + assert_eq!( + plan.jar_rel, + ".socket/vendor/coursier/com/typesafe/config/1.4.3/config-1.4.3.jar" + ); + assert!(plan.warnings.is_empty()); + assert!(owns(&plan.records)); + let with_project = + super::plan(&fs(&[(PROJECT_FILE, "")]), &patch("config", UUID, b"J")).unwrap(); + assert_eq!( + with_project + .warnings + .iter() + .map(|w| w.code) + .collect::>(), + ["vendor_scala_cli_directives_split"] + ); + } + + #[test] + fn modified_owned_files_are_refused() { + for rel in [ROOT_FILE, GUARD_REL] { + for body in [ + "// managed by socket-patch\n//> using dep x:y:1\n", + "object Main\n", + ] { + let err = plan(&fs(&[(rel, body)]), &patch("config", UUID, b"J")).unwrap_err(); + assert_eq!(err.code, "vendor_scala_cli_owned_file_modified", "{rel}"); + assert!(err.detail.contains(rel)); + } + } + // A CRLF checkout of the owned text is still ours. + let crlf = ROOT_BYTES.replace('\n', "\r\n"); + assert!(plan(&fs(&[(ROOT_FILE, &crlf)]), &patch("config", UUID, b"J")).is_ok()); + } + + #[test] + fn non_canonical_uuid_is_refused() { + let err = plan(&fs(&[]), &patch("config", "../x", b"J")).unwrap_err(); + assert_eq!(err.code, "unsafe_coordinates"); + } + + #[tokio::test] + async fn vendor_then_revert_is_byte_exact_and_replan_is_a_noop() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + populate( + root, + &[ + (PROJECT_FILE, "//> using scala 3.3.6\n"), + ("main.scala", "x\n"), + ], + ); + let (pristine, pristine_dirs) = (snapshot(root), dirs(root)); + let mut ledger = BTreeMap::new(); + let p = patch("config", UUID, b"PATCHED"); + vendor(root, Shape::ScalaCli, &p, &mut ledger) + .await + .unwrap(); + let wired = snapshot(root); + assert_eq!(wired[ROOT_FILE], ROOT_BYTES.as_bytes()); + assert_eq!(wired[GUARD_REL], GUARD_BYTES.as_bytes()); + assert_eq!(wired[GITIGNORE_REL], b"!*\n"); + let read = |rel: &str| super::super::apply::read_project_file(root, rel); + assert_eq!(wired_checked(&read, &p.coords()), Ok(true)); + let again = plan(&read, &p).unwrap(); + assert!(again.writes.is_empty(), "{:?}", again.writes); + assert_eq!(committed(&read, &p.coords()).unwrap().0, b"PATCHED"); + let out = revert(root, &p, &mut ledger).await; + assert!(out.success && !out.kept_artifact, "{out:?}"); + assert_eq!(snapshot(root), pristine); + assert_eq!(dirs(root), pristine_dirs); + } + + #[tokio::test] + async fn two_patches_revert_in_either_order() { + for first_out in [0usize, 1] { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + populate(root, &[(PROJECT_FILE, "")]); + let (pristine, pristine_dirs) = (snapshot(root), dirs(root)); + let patches = [patch("config", UUID, b"ONE"), patch("other", OTHER, b"TWO")]; + let mut ledger = BTreeMap::new(); + for p in &patches { + vendor(root, Shape::ScalaCli, p, &mut ledger).await.unwrap(); + } + let read = |rel: &str| super::super::apply::read_project_file(root, rel); + let rows = coursier_tree::parse_index(&read(INDEX_REL).unwrap()).unwrap(); + assert_eq!(rows.len(), 4); + let (a, b) = (&patches[first_out], &patches[1 - first_out]); + let out = revert(root, a, &mut ledger).await; + assert!(out.success && !out.kept_artifact, "{out:?}"); + assert_eq!(wired_checked(&read, &a.coords()), Ok(false)); + assert_eq!(wired_checked(&read, &b.coords()), Ok(true)); + assert!(read(ROOT_FILE).is_some() && read(GUARD_REL).is_some()); + let out = revert(root, b, &mut ledger).await; + assert!(out.success, "{out:?}"); + assert_eq!(snapshot(root), pristine, "first out: {first_out}"); + assert_eq!(dirs(root), pristine_dirs); + } + } + + #[tokio::test] + async fn update_rewires_and_sweeps_then_reverts_to_pristine() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + populate(root, &[(PROJECT_FILE, "")]); + let pristine = snapshot(root); + let mut ledger = BTreeMap::new(); + vendor( + root, + Shape::ScalaCli, + &patch("config", UUID, b"V1"), + &mut ledger, + ) + .await + .unwrap(); + let v2 = patch("config", UPDATE, b"V2"); + vendor(root, Shape::ScalaCli, &v2, &mut ledger) + .await + .unwrap(); + let read = |rel: &str| super::super::apply::read_project_file(root, rel); + assert_eq!(wired_checked(&read, &v2.coords()), Ok(true)); + let rows = coursier_tree::parse_index(&read(INDEX_REL).unwrap()).unwrap(); + assert!(rows.iter().all(|r| r.uuid == UPDATE)); + assert_eq!(committed(&read, &v2.coords()).unwrap().0, b"V2"); + let out = revert(root, &v2, &mut ledger).await; + assert!(out.success && !out.kept_artifact, "{out:?}"); + assert_eq!(snapshot(root), pristine); + } + + #[tokio::test] + async fn drifted_root_file_keeps_the_guard_and_tree() { + let tmp = tempfile::tempdir().unwrap(); + let root = tmp.path(); + populate(root, &[(PROJECT_FILE, "")]); + let mut ledger = BTreeMap::new(); + let p = patch("config", UUID, b"J"); + vendor(root, Shape::ScalaCli, &p, &mut ledger) + .await + .unwrap(); + let edited = format!("{ROOT_BYTES}//> using dep x:y:1\n"); + std::fs::write(root.join(ROOT_FILE), &edited).unwrap(); + let out = revert(root, &p, &mut ledger).await; + assert!(out.success && out.kept_artifact, "{out:?}"); + assert!(out + .warnings + .iter() + .any(|w| w.code == "vendor_lock_entry_drifted")); + assert_eq!( + std::fs::read_to_string(root.join(ROOT_FILE)).unwrap(), + edited + ); + assert!(root.join(GUARD_REL).exists()); + assert!(root.join(p_jar(&p)).exists()); + } + + fn p_jar(p: &JvmPatch<'_>) -> String { + format!( + "{}/{}-{}.jar", + coursier_tree::tree_dir(&p.coords()), + p.artifact_id, + p.version + ) + } + + #[test] + fn unplan_leaves_a_malformed_index_and_modified_files() { + let c = patch("config", UUID, b"J").coords(); + let out = unplan(&fs(&[(INDEX_REL, "garbage\n")]), &c, &[]); + assert!(out.still_wired && out.changes.is_empty()); + assert_eq!(out.drifted.len(), 1); + // Last out with a modified guard: the guard stays, drifted. + let create = |rel: &str| { + super::super::fragment( + rel, + super::super::OWNED_FILE_KIND, + "owned", + super::super::WiringAction::Added, + None, + serde_json::json!({ "op": "create" }), + ) + }; + let records = vec![create(ROOT_FILE), create(GUARD_REL)]; + let out = unplan( + &fs(&[(ROOT_FILE, ROOT_BYTES), (GUARD_REL, "// edited\n")]), + &c, + &records, + ); + assert_eq!(out.changes, vec![(ROOT_FILE.to_string(), None)]); + assert_eq!(out.drifted, [format!("{GUARD_REL} was modified")]); + assert!(!out.still_wired); + // A file never created by vendor is never deleted. + let out = unplan(&fs(&[(ROOT_FILE, ROOT_BYTES)]), &c, &[]); + assert!(out.still_wired, "the root file still includes the guard"); + assert!(out.changes.is_empty()); + } + + #[test] + fn wired_checked_needs_index_root_and_guard() { + let mut writes_files = BTreeMap::new(); + let p = patch("config", UUID, b"J"); + let plan = plan(&|_: &str| None, &p).unwrap(); + for w in &plan.writes { + writes_files.insert(w.rel.clone(), w.bytes.clone()); + } + for drop in [None, Some(ROOT_FILE), Some(GUARD_REL), Some(INDEX_REL)] { + let mut files = writes_files.clone(); + if let Some(rel) = drop { + files.remove(rel); + } + let read = move |p: &str| files.get(p).cloned(); + assert_eq!( + wired_checked(&read, &p.coords()), + Ok(drop.is_none()), + "{drop:?}" + ); + } + let bad = fs(&[(INDEX_REL, "#nope\n")]); + assert!(wired_checked(&bad, &p.coords()).is_err()); + } +} diff --git a/crates/socket-patch-core/src/vendor/maven_repo.rs b/crates/socket-patch-core/src/vendor/maven_repo.rs index 34f3cb032..85cc676e1 100644 --- a/crates/socket-patch-core/src/vendor/maven_repo.rs +++ b/crates/socket-patch-core/src/vendor/maven_repo.rs @@ -726,10 +726,12 @@ async fn legacy_mixed_root(project_root: &Path) -> bool { } /// The `not_build_root` refusal detail when `project_root` is a module of a -/// Maven reactor or a project of a Gradle build rooted above it: vendoring +/// Maven reactor, a project of a Gradle build or an sbt subproject of a +/// build rooted above it: vendoring /// there would wire a build nobody runs and leave the real one unpatched /// (#428). Ancestors are searched up to the enclosing git checkout. pub(super) fn not_build_root(project_root: &Path) -> Option { + let project = super::jvm::apply::ProjectReader::new(project_root); let own_settings = ["settings.gradle", "settings.gradle.kts"] .iter() .any(|f| project_root.join(f).is_file()); @@ -752,6 +754,12 @@ pub(super) fn not_build_root(project_root: &Path) -> Option { ancestor.display() )); } + if super::jvm::sbt::nested_in_build(&|p: &str| project.read(p), &|p: &str| reader.read(p)) { + return Some(format!( + "reason: not_build_root: run vendor from sbt build root {}", + ancestor.display() + )); + } let read_text = |p: &str| crate::gradle::dsl::decode(&reader.read(p)?); // Gradle reads the Groovy settings first. let settings = ["settings.gradle", "settings.gradle.kts"] @@ -889,10 +897,42 @@ impl LocalSources { return Ok(Some(bytes)); } } + // An Ivy cache keeps no `-.pom` beside the jar, but may hold + // the pristine pom as `ivy-.xml.original` (no checksum sidecar, + // so it is never an authenticated copy). + if ext == "pom" && classifier.is_none() && !authenticated { + if let Some(dir) = &self.installed_dir { + let (g, a, v) = gav; + if let Some(bytes) = crate::crawlers::ivy_cache::installed_pom(dir, g, a, v) { + return Ok(Some(bytes)); + } + } + } Ok(None) } } +/// The vendored sbt / scala-cli gate for `purl` over the project at +/// `project_root`, for a caller about to restore a hosted pin upstream (a +/// takeover or an eject) before vendoring: `Err((code, detail))` when the +/// gate would stop the patch (a skip or a refusal), so the caller keeps the +/// hosted wiring instead of ending neither hosted nor vendored. `Ok` for +/// any other project shape or a non-Maven purl. +pub async fn jvm_gate_preflight( + project_root: &Path, + purl: &str, +) -> Result<(), (&'static str, String)> { + let Some((g, a, v)) = parse_maven_purl(purl) else { + return Ok(()); + }; + let Some(shape) = jvm_shape(project_root).await else { + return Ok(()); + }; + super::jvm::sbt_gate::for_shape(shape, project_root, &g, &a, &v) + .map(|_| ()) + .map_err(|stop| stop.code_and_detail(purl)) +} + /// The committed tree bytes for `record` (jar, upstream pom, module, and /// the classifier artifacts) when the jar's patched members hash to the /// record's `afterHash`es: a re-run then needs no jar source at all (the @@ -926,6 +966,11 @@ async fn jvm_committed_patch( ), (super::jvm::gradle::tree_dir(&coords), v.to_string()), ], + Shape::Sbt => vec![( + super::jvm::sbt::tree_dir(&coords), + coords.suffixed_version(), + )], + Shape::ScalaCli => vec![(super::jvm::coursier_tree::tree_dir(&coords), v.to_string())], Shape::Other => return None, }; for (dir, tree_version) in &trees { @@ -954,6 +999,11 @@ async fn jvm_committed_patch( .map(|(jar, pom)| (jar, pom, None))?, Vec::new(), ), + Shape::Sbt => (super::jvm::sbt::committed(&read, &coords)?, Vec::new()), + Shape::ScalaCli => ( + super::jvm::scala_cli::committed(&read, &coords)?, + Vec::new(), + ), _ => ( super::jvm::gradle::committed(&read, &coords)?, super::jvm::gradle::committed_extras(&read, &coords)?, @@ -1007,6 +1057,13 @@ async fn vendor_maven_jvm( }; let gradle = matches!(shape, Shape::Gradle | Shape::Mixed); let display_path = project_root.join(".socket/vendor"); + // sbt / scala-cli pins are gated on the build's own resolution first. + let gate = + super::jvm::sbt_gate::for_shape(shape, project_root, &group_id, &artifact_id, &version); + let gate_pass = match gate.map_err(|stop| stop.into_outcome(purl)) { + Ok(pass) => pass, + Err(outcome) => return outcome, + }; if record.files.is_empty() { let reader = super::jvm::apply::ProjectReader::new(project_root); let probe_pom = format!("{group_id}{artifact_id}{version}"); @@ -1048,7 +1105,7 @@ async fn vendor_maven_jvm( let local = LocalSources::new(project_root, installed_dir, &group_id); let gav = (group_id.clone(), artifact_id.clone(), version.clone()); - let mut warnings: Vec = Vec::new(); + let mut warnings: Vec = gate_pass.warnings; let committed = jvm_committed_patch(shape, purl, project_root, record).await; let was_committed = committed.is_some(); let (jar_bytes, mut pom_bytes, mut module_bytes, mut extras, mut result) = match committed { @@ -1203,7 +1260,13 @@ async fn vendor_maven_jvm( { return refused("vendor_jvm_shape_unsupported", "reason: maven_config_changed: revert the existing Maven wiring before selecting --maven-config=none"); } - let planned = super::jvm::plan_with_config(shape, &read, &list, &patch, config_enabled); + let planned = match shape { + // The pin records the gate's digest (every build source). + Shape::Sbt => { + super::jvm::sbt::plan_with_digest(&read, &patch, gate_pass.deps_digest.as_deref()) + } + _ => super::jvm::plan_with_config(shape, &read, &list, &patch, config_enabled), + }; if let Some(rel) = reader.escaped() { return refused( "vendor_jvm_shape_unsupported", diff --git a/crates/socket-patch-core/src/vex/discover/mod.rs b/crates/socket-patch-core/src/vex/discover/mod.rs index 84c54151f..b786ebca7 100644 --- a/crates/socket-patch-core/src/vex/discover/mod.rs +++ b/crates/socket-patch-core/src/vex/discover/mod.rs @@ -206,6 +206,10 @@ pub(crate) mod npm; pub(crate) mod nuget; pub(crate) mod pypi_locks; pub(crate) mod pypi_other; +pub(crate) mod sbt; +pub use sbt::{ + DIAG_SBT_OWNED_FILE_MODIFIED, DIAG_SBT_RESOLUTION_UNVERIFIED, DIAG_VENDORED_TREE_MISSING, +}; pub(crate) mod vlt; pub(crate) mod yarn; @@ -768,6 +772,7 @@ async fn discover_with_ctx(ctx: DiscoverCtx<'_>) -> Discovery { composer::extract(&ctx, &mut out).await; maven::extract(&ctx, &mut out).await; gradle::extract(&ctx, &mut out).await; + sbt::extract(&ctx, &mut out).await; nuget::extract(&ctx, &mut out).await; deno::extract(&ctx, &mut out).await; out.contest_across_locks(); @@ -3040,6 +3045,8 @@ mod tests { "gradle.lockfile", "pom.xml", "settings-gradle.lockfile", + "socket-patch-vendor.sbt", + "socket-patch.sbt", ], ), ("nuget", &["NuGet.Config", "NuGet.config", "nuget.config"]), diff --git a/crates/socket-patch-core/src/vex/discover/sbt.rs b/crates/socket-patch-core/src/vex/discover/sbt.rs new file mode 100644 index 000000000..b80465f7b --- /dev/null +++ b/crates/socket-patch-core/src/vex/discover/sbt.rs @@ -0,0 +1,380 @@ +//! sbt — the generated `socket-patch.sbt` (hosted) and +//! `socket-patch-vendor.sbt` (vendored) at the build root. +//! +//! A pin row ties a uuid to its GAV directly, but a row proves only that +//! the file asks for the patch: sbt may still resolve another version (a +//! project-level `dependencyOverrides :=`) or another copy (a stale Ivy +//! origin, `mavenLocal`). So every strictly parsed hosted pin is a ref +//! (the management commands restore and eject it like any other), but it +//! carries a lock pin, and is thereby attestable from the wiring, only +//! when the build's local resolution evidence (`crawlers::sbt_evidence`) +//! verifies it: every version sbt recorded for the GA is the pinned +//! `-socket.`, and every artifact file recorded for it hashes to +//! one of the pin's sha256s, the jar's among them. Otherwise the diagnostic +//! `sbt_resolution_unverified`, and the ref stays unattested (it must still +//! be verified against an installed copy). +//! +//! The check is on content, not location, like the generated file's own +//! load-time verifier: Ivy legitimately serves a second checkout from the +//! first checkout's `file:` origin (`docs/design/sbt-template-probe.md`, +//! case i), and a copy whose bytes are the pinned ones is the patch. +//! +//! Vendored pins are attested by the vendor ledger; this extractor only +//! diagnoses what would make that attestation a lie: a tree file gone or +//! changed (`vendored_tree_missing`) or an unverified resolution. +//! +//! A generated file socket-patch cannot parse strictly is +//! `sbt_owned_file_modified` (a foreign file under the name is not ours and +//! is ignored). + +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; + +use super::{DiscoverCtx, Discovery, PatchedRef, DIAG_REF_INVALID}; +use crate::formats::sbt::owned_file::{ + parse, OwnedFileError, SbtFileMode, SbtPin, HOSTED_FILE, VENDORED_FILE, VENDORED_REPO_REL, +}; +use crate::formats::sbt::JvmResolution; +use crate::utils::purl::maven_purl; +use crate::vendor::lock_inventory::LockIntegrity; + +/// The generated file was edited (strict parse failed). +pub const DIAG_SBT_OWNED_FILE_MODIFIED: &str = "sbt_owned_file_modified"; +/// A pin whose resolution the local evidence does not verify. +pub const DIAG_SBT_RESOLUTION_UNVERIFIED: &str = "sbt_resolution_unverified"; +/// A vendored pin whose committed tree files are missing or modified. +pub const DIAG_VENDORED_TREE_MISSING: &str = "vendored_tree_missing"; + +pub(crate) async fn extract(ctx: &DiscoverCtx<'_>, out: &mut Discovery) { + let hosted = ctx.read_text(HOSTED_FILE, out).await; + let vendored = ctx.read_text(VENDORED_FILE, out).await; + if hosted.is_none() && vendored.is_none() { + return; + } + let res = evidence(ctx.root).await; + let mut hashes = Hashes::default(); + if let Some(text) = hosted { + if let Some(pins) = strict(SbtFileMode::Hosted, &text, out) { + for pin in pins { + hosted_ref(ctx, &pin, res.as_ref(), &mut hashes, out).await; + } + } + } + if let Some(text) = vendored { + if let Some(pins) = strict(SbtFileMode::Vendored, &text, out) { + for pin in pins { + vendored_check(ctx, &pin, res.as_ref(), &mut hashes, out).await; + } + } + } +} + +/// The build's resolution evidence, read off disk (`None` when there is +/// none). +async fn evidence(root: &Path) -> Option { + let root = root.to_path_buf(); + tokio::task::spawn_blocking(move || { + let e = crate::crawlers::sbt_evidence::discover(&root)?; + crate::crawlers::sbt_evidence::resolution(&e) + }) + .await + .ok() + .flatten() +} + +/// The pins of a generated file of `mode`, or `None` after a diagnostic. +fn strict(mode: SbtFileMode, text: &str, out: &mut Discovery) -> Option> { + match parse(mode, text) { + Ok(file) => Some(file.pins.into_values().collect()), + Err(OwnedFileError::Foreign) => None, + Err(OwnedFileError::Modified(why)) => { + out.diag( + DIAG_SBT_OWNED_FILE_MODIFIED, + mode.file(), + format!( + "{} is not what socket-patch generated ({why}); its pins are not \ + attested", + mode.file() + ), + ); + None + } + } +} + +/// sha256 hex of files by absolute path, memoised (`None` = unreadable). +#[derive(Default)] +struct Hashes(BTreeMap>); + +impl Hashes { + async fn of(&mut self, path: &Path) -> Option { + if let Some(known) = self.0.get(path) { + return known.clone(); + } + let hex = crate::vendor::verify::file_sha256_hex(path).await; + self.0.insert(path.to_path_buf(), hex.clone()); + hex + } +} + +/// Why the evidence does not verify `pin` (see the module doc); `Ok` when +/// it does. +async fn verify( + pin: &SbtPin, + res: Option<&JvmResolution>, + hashes: &mut Hashes, +) -> Result<(), String> { + let ga = format!("{}:{}", pin.group, pin.artifact); + let Some(res) = res else { + return Err(format!( + "no sbt resolution evidence under target/ shows how {ga} resolves; run `sbt update`" + )); + }; + let versions = res.versions(&pin.group, &pin.artifact); + if versions.is_empty() { + return Err(format!( + "the build's resolution evidence does not resolve {ga}; run `sbt update`" + )); + } + if let Some(other) = versions.iter().find(|v| **v != pin.sv) { + return Err(format!( + "the build resolves {ga}:{other}, not the pinned {}", + pin.sv + )); + } + let paths: Vec<&PathBuf> = res + .artifacts + .get(&(pin.group.clone(), pin.artifact.clone(), pin.sv.clone())) + .into_iter() + .flatten() + .collect(); + if paths.is_empty() { + return Err(format!( + "the build's resolution evidence records no artifact file for {ga}:{}", + pin.sv + )); + } + let mut jar_seen = false; + for path in paths { + match hashes.of(path).await { + Some(got) if got == pin.jar_sha256 => jar_seen = true, + Some(got) if got == pin.pom_sha256 => {} + Some(got) => { + return Err(format!( + "{ga}:{} resolved to {} with sha256 {got}, which is not pinned", + pin.sv, + path.display() + )) + } + None => { + return Err(format!( + "{ga}:{} resolved to {}, which cannot be read", + pin.sv, + path.display() + )) + } + } + } + if !jar_seen { + return Err(format!( + "no resolved artifact of {ga}:{} is the pinned jar", + pin.sv + )); + } + Ok(()) +} + +async fn hosted_ref( + ctx: &DiscoverCtx<'_>, + pin: &SbtPin, + res: Option<&JvmResolution>, + hashes: &mut Hashes, + out: &mut Discovery, +) { + let index = pin.index_url.as_deref().unwrap_or_default(); + let jar_url = format!("{index}/{}", pin.repo_path("jar")); + let named = ctx.hosted_uuid(&jar_url); + let Some(purl) = maven_purl(&pin.group, &pin.artifact, &pin.base) else { + out.diag( + DIAG_REF_INVALID, + HOSTED_FILE, + format!( + "{HOSTED_FILE}: {}:{}:{} is not a usable Maven coordinate", + pin.group, pin.artifact, pin.base + ), + ); + return; + }; + if named.as_deref() != Some(pin.uuid.as_str()) { + out.diag( + DIAG_REF_INVALID, + HOSTED_FILE, + format!( + "{HOSTED_FILE}: the row for patch {} downloads from {jar_url}, which is not a \ + Socket-hosted URL of that patch", + pin.uuid + ), + ); + return; + } + let locked = match verify(pin, res, hashes).await { + Ok(()) => Some(LockIntegrity::Sha256Hex(pin.jar_sha256.clone())), + Err(why) => { + out.diag( + DIAG_SBT_RESOLUTION_UNVERIFIED, + HOSTED_FILE, + format!("{HOSTED_FILE}: patch {} ({purl}): {why}", pin.uuid), + ); + None + } + }; + out.push(PatchedRef::hosted( + purl, + pin.uuid.clone(), + HOSTED_FILE, + Some(&jar_url), + locked, + true, + )); +} + +async fn vendored_check( + ctx: &DiscoverCtx<'_>, + pin: &SbtPin, + res: Option<&JvmResolution>, + hashes: &mut Hashes, + out: &mut Discovery, +) { + for (ext, want) in [("pom", &pin.pom_sha256), ("jar", &pin.jar_sha256)] { + let rel = format!("{VENDORED_REPO_REL}/{}", pin.repo_path(ext)); + let got = hashes.of(&ctx.root.join(&rel)).await; + if got.as_deref() != Some(want.as_str()) { + out.diag( + DIAG_VENDORED_TREE_MISSING, + VENDORED_FILE, + format!( + "{VENDORED_FILE}: patch {} pins {rel}, which is {}", + pin.uuid, + if got.is_some() { "modified" } else { "missing" } + ), + ); + return; + } + } + if let Err(why) = verify(pin, res, hashes).await { + out.diag( + DIAG_SBT_RESOLUTION_UNVERIFIED, + VENDORED_FILE, + format!("{VENDORED_FILE}: patch {}: {why}", pin.uuid), + ); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sha2::{Digest as _, Sha256}; + + const UUID: &str = "abcdef12-0000-4000-8000-000000000001"; + const SV: &str = "3.11-socket.abcdef12"; + + fn pin(jar: &str) -> SbtPin { + SbtPin { + uuid: UUID.into(), + group: "org.apache.commons".into(), + artifact: "commons-lang3".into(), + base: "3.11".into(), + sv: SV.into(), + pom_sha256: "a".repeat(64), + jar_sha256: jar.into(), + deps_digest: "0a1b2c3d".into(), + index_url: Some(format!( + "https://patch.socket.dev/patch-registry/maven/t/{UUID}/maven2" + )), + } + } + + fn res(versions: &[&str], artifact: Option<&Path>) -> JvmResolution { + let mut r = JvmResolution::default(); + let ga = ( + "org.apache.commons".to_string(), + "commons-lang3".to_string(), + ); + for v in versions { + r.modules + .entry(ga.clone()) + .or_default() + .entry(v.to_string()) + .or_default() + .insert(format!("target/x:compile@{v}")); + } + if let Some(p) = artifact { + r.artifacts + .entry((ga.0.clone(), ga.1.clone(), SV.into())) + .or_default() + .insert(p.to_path_buf()); + } + r.in_scope.insert(ga); + r.projects_seen.insert(".".into()); + r + } + + #[tokio::test] + async fn verify_needs_the_pinned_version_and_bytes() { + let tmp = tempfile::tempdir().unwrap(); + let jar = tmp.path().join("x.jar"); + std::fs::write(&jar, b"patched").unwrap(); + let sha = hex::encode(Sha256::digest(b"patched")); + let mut h = Hashes::default(); + assert_eq!( + verify(&pin(&sha), Some(&res(&[SV], Some(&jar))), &mut h).await, + Ok(()) + ); + + let why = verify(&pin(&sha), None, &mut h).await.unwrap_err(); + assert!(why.contains("no sbt resolution evidence"), "{why}"); + let why = verify(&pin(&sha), Some(&res(&[], None)), &mut h) + .await + .unwrap_err(); + assert!(why.contains("does not resolve"), "{why}"); + // Shadowed: a project still resolves the base version. + let why = verify(&pin(&sha), Some(&res(&[SV, "3.11"], Some(&jar))), &mut h) + .await + .unwrap_err(); + assert!(why.contains("3.11, not the pinned"), "{why}"); + let why = verify(&pin(&sha), Some(&res(&[SV], None)), &mut h) + .await + .unwrap_err(); + assert!(why.contains("no artifact file"), "{why}"); + // Elsewhere: another file, other bytes (ivy-local, mavenLocal). + let other = tmp.path().join("evil.jar"); + std::fs::write(&other, b"evil").unwrap(); + let why = verify(&pin(&sha), Some(&res(&[SV], Some(&other))), &mut h) + .await + .unwrap_err(); + assert!(why.contains("which is not pinned"), "{why}"); + let gone = tmp.path().join("gone.jar"); + let why = verify(&pin(&sha), Some(&res(&[SV], Some(&gone))), &mut h) + .await + .unwrap_err(); + assert!(why.contains("cannot be read"), "{why}"); + } + + #[tokio::test] + async fn verify_accepts_the_pinned_bytes_anywhere() { + // Ivy serves a second checkout from the first one's origin. + let tmp = tempfile::tempdir().unwrap(); + let jar = tmp.path().join("other-checkout.jar"); + std::fs::write(&jar, b"patched").unwrap(); + let sha = hex::encode(Sha256::digest(b"patched")); + assert_eq!( + verify( + &pin(&sha), + Some(&res(&[SV], Some(&jar))), + &mut Hashes::default() + ) + .await, + Ok(()) + ); + } +} diff --git a/crates/socket-patch-core/src/vex/discover/testing/golden.rs b/crates/socket-patch-core/src/vex/discover/testing/golden.rs index 7c73c6761..3e2cd9875 100644 --- a/crates/socket-patch-core/src/vex/discover/testing/golden.rs +++ b/crates/socket-patch-core/src/vex/discover/testing/golden.rs @@ -301,8 +301,9 @@ fn corpus() -> Vec { let name = top.file_name().unwrap().to_string_lossy().into_owned(); match name.as_str() { GOLDEN_DIR => {} - // Tables and store listings, not projects. - "vlt" | "vlt-trees" | "vendor" => {} + // Tables and store listings, not projects (`sbt`: build-tool + // resolution records, read by the sbt evidence parser only). + "vlt" | "vlt-trees" | "vendor" | "sbt" => {} // Redirect cases: `///{input,expected}` — // each side is a project root (nested files included). "redirect" => { @@ -521,7 +522,7 @@ mod tests { #[test] fn table_fixture_dirs_are_not_corpus_projects() { let corpus = corpus(); - for skipped in ["vlt", "vlt-trees", "vendor"] { + for skipped in ["vlt", "vlt-trees", "vendor", "sbt"] { let nested = format!("{skipped}/"); assert!( corpus diff --git a/crates/socket-patch-core/tests/crawler_gradle_e2e.rs b/crates/socket-patch-core/tests/crawler_gradle_e2e.rs index 85f968213..6699dc880 100644 --- a/crates/socket-patch-core/tests/crawler_gradle_e2e.rs +++ b/crates/socket-patch-core/tests/crawler_gradle_e2e.rs @@ -903,6 +903,22 @@ async fn pom_and_gradle_get_both_roots() { assert_eq!(m.roots(false).await, vec![m.gradle_files21(), m.m2()]); } +/// An sbt build beside a Gradle build that never declares `mavenLocal()` +/// keeps m2: the sbt build's own resolvers (`Resolver.mavenLocal`) are not +/// in the Gradle scripts, so the Gradle gate cannot rule `~/.m2` out. +#[tokio::test] +async fn sbt_beside_gradle_keeps_m2() { + let m = Machine::new(); + m.write("settings.gradle", "rootProject.name = 'p'\n"); + m.write("build.gradle", GRADLE_ONLY); + assert_eq!(m.gate(), M2Gate::Ignored); + m.write("build.sbt", "resolvers += Resolver.mavenLocal\n"); + assert_eq!(m.gate(), M2Gate::NotGradleOnly); + let roots = m.roots(false).await; + assert!(roots.contains(&m.m2()), "{roots:?}"); + assert!(roots.contains(&m.gradle_files21()), "{roots:?}"); +} + /// A pom-only project never reads the Gradle cache; a non-JVM cwd gets no /// root at all unless the scan is global. #[tokio::test] diff --git a/crates/socket-patch-core/tests/crawler_maven_e2e.rs b/crates/socket-patch-core/tests/crawler_maven_e2e.rs index def6d6bb5..bbd5aed18 100644 --- a/crates/socket-patch-core/tests/crawler_maven_e2e.rs +++ b/crates/socket-patch-core/tests/crawler_maven_e2e.rs @@ -18,6 +18,48 @@ fn options_at(root: &Path) -> CrawlerOptions { } } +/// Keeps the machine's Coursier / Ivy caches out of a test that pins the +/// exact repo list (a JVM marker or `--global` also crawls them): `HOME` +/// points at an empty directory and the variables naming a cache are unset +/// until drop, which restores them. Only inside `#[serial]` tests. +struct NoJvmCaches { + _home: tempfile::TempDir, + saved: Vec<(&'static str, Option)>, +} + +impl NoJvmCaches { + fn new() -> Self { + let home = tempfile::tempdir().unwrap(); + let keys = [ + "HOME", + "USERPROFILE", + "XDG_CACHE_HOME", + "LOCALAPPDATA", + "COURSIER_CACHE", + "SBT_OPTS", + "JAVA_OPTS", + ]; + let saved = keys.iter().map(|k| (*k, std::env::var_os(k))).collect(); + for key in keys { + std::env::remove_var(key); + } + std::env::set_var("HOME", home.path()); + std::env::set_var("USERPROFILE", home.path()); + Self { _home: home, saved } + } +} + +impl Drop for NoJvmCaches { + fn drop(&mut self) { + for (key, value) in &self.saved { + match value { + Some(v) => std::env::set_var(key, v), + None => std::env::remove_var(key), + } + } + } +} + /// Stage a maven m2-layout package: //// /// with a minimal pom.xml. async fn stage_maven_pkg( @@ -260,6 +302,7 @@ async fn get_maven_repo_paths_home_dot_m2_fallback() { #[tokio::test] #[serial] async fn get_maven_repo_paths_global_mode_with_maven_repo_local() { + let _no_jvm_caches = NoJvmCaches::new(); let tmp = tempfile::tempdir().unwrap(); let repo = tmp.path().join("custom-m2"); tokio::fs::create_dir_all(&repo).await.unwrap(); @@ -517,6 +560,7 @@ async fn get_maven_repo_paths_no_marker_returns_empty() { #[tokio::test] #[serial] async fn get_maven_repo_paths_with_pom_xml_returns_repo() { + let _no_jvm_caches = NoJvmCaches::new(); let tmp = tempfile::tempdir().unwrap(); tokio::fs::write(tmp.path().join("pom.xml"), b"") .await @@ -617,6 +661,7 @@ async fn get_maven_repo_paths_with_build_gradle_kts_returns_repo() { #[tokio::test] #[serial] async fn get_maven_repo_paths_m2_home_fallback() { + let _no_jvm_caches = NoJvmCaches::new(); let tmp = tempfile::tempdir().unwrap(); tokio::fs::write(tmp.path().join("pom.xml"), b"") .await diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/build.sbt new file mode 100644 index 000000000..3f6508916 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/build.sbt @@ -0,0 +1,3 @@ +scalaVersion in ThisBuild := "2.10.7" +lazy val root = (project in file(".")).aggregate(e) +lazy val e = project.settings(crossScalaVersions := Seq("2.10.7", "2.11.12"), libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.11") diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml new file mode 100644 index 000000000..b4c2ee282 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml new file mode 100644 index 000000000..cb1fb98c5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml new file mode 100644 index 000000000..8eb3ad39c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml new file mode 100644 index 000000000..af958b104 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml new file mode 100644 index 000000000..5a21d8153 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml new file mode 100644 index 000000000..2a72edf3c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml new file mode 100644 index 000000000..79c723dcb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml new file mode 100644 index 000000000..16bfdbc77 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile-internal.xml new file mode 100644 index 000000000..d35cd7415 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile.xml new file mode 100644 index 000000000..2c5aa23c6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-compile.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-optional.xml new file mode 100644 index 000000000..92eb2657f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-provided.xml new file mode 100644 index 000000000..be0bcb8d4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime-internal.xml new file mode 100644 index 000000000..a9292bc3e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime.xml new file mode 100644 index 000000000..c5bc48151 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-runtime.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test-internal.xml new file mode 100644 index 000000000..cedf4c858 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test-internal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test.xml new file mode 100644 index 000000000..719a951a0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/scala-2.11/resolution-cache/reports/e-e_2.11-test.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..5fc52d5d8 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..a3f84b051 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/inputs new file mode 100644 index 000000000..2839cee33 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/output new file mode 100644 index 000000000..ac0cd2757 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/e/target/streams/$global/update/$global/streams/update_cache_2.11/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/build.properties new file mode 100644 index 000000000..8e682c526 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.18 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile-internal.xml new file mode 100644 index 000000000..564bfb4f0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile-internal.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile.xml new file mode 100644 index 000000000..956bcd725 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-compile.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-optional.xml new file mode 100644 index 000000000..3e6a208d2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-provided.xml new file mode 100644 index 000000000..de1e6a35c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-provided.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime-internal.xml new file mode 100644 index 000000000..694ffce55 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime-internal.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime.xml new file mode 100644 index 000000000..6830610e3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-runtime.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test-internal.xml new file mode 100644 index 000000000..f7a8f4d17 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test-internal.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test.xml new file mode 100644 index 000000000..f23b673b2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x13-build-test.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..f5a1770f5 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/cross/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml new file mode 100644 index 000000000..6b361b4a7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml new file mode 100644 index 000000000..970851640 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml new file mode 100644 index 000000000..aab265c25 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml new file mode 100644 index 000000000..e29c2559b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml new file mode 100644 index 000000000..931a780e4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml new file mode 100644 index 000000000..3e61b78b3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..1416b0fad Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml new file mode 100644 index 000000000..dc2f7ab02 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml new file mode 100644 index 000000000..ce083d6c9 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml new file mode 100644 index 000000000..fdbfdae83 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml new file mode 100644 index 000000000..202789a14 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml new file mode 100644 index 000000000..76eac9779 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml new file mode 100644 index 000000000..50fc8979b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..9537f84a7 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml new file mode 100644 index 000000000..57f29ff34 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml new file mode 100644 index 000000000..b2a466c91 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml new file mode 100644 index 000000000..04bbcfdcb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml new file mode 100644 index 000000000..554829b62 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml new file mode 100644 index 000000000..9e6bd8e50 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml new file mode 100644 index 000000000..a6454389f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..56a713c13 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..8c43ae1c3 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/project/build.properties new file mode 100644 index 000000000..8e682c526 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.18 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml new file mode 100644 index 000000000..9ca61a850 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml new file mode 100644 index 000000000..b03574f4f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml new file mode 100644 index 000000000..6c464d128 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml new file mode 100644 index 000000000..f8b5eb311 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml new file mode 100644 index 000000000..353bdad7b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml new file mode 100644 index 000000000..21d7d507a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..a361507c5 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml new file mode 100644 index 000000000..1a7649313 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml new file mode 100644 index 000000000..1f166d2bc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-optional.xml new file mode 100644 index 000000000..696283062 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-provided.xml new file mode 100644 index 000000000..4ae65d0d6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml new file mode 100644 index 000000000..9f55b6d12 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml new file mode 100644 index 000000000..96ff8c681 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml new file mode 100644 index 000000000..c085f0499 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml new file mode 100644 index 000000000..49e793428 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..6c0916e4a Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..f2bbf36b5 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/build.sbt new file mode 100644 index 000000000..9c6982767 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/build.sbt @@ -0,0 +1,5 @@ +scalaVersion in ThisBuild := "2.10.7" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("2.10.7", "2.11.12"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml new file mode 100644 index 000000000..76e4eabe4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile.xml new file mode 100644 index 000000000..a1716196a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-compile.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-optional.xml new file mode 100644 index 000000000..dc4d24337 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-provided.xml new file mode 100644 index 000000000..1e0d39cc4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml new file mode 100644 index 000000000..63ef328ac --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime.xml new file mode 100644 index 000000000..027d3264f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml new file mode 100644 index 000000000..b1d40d41f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test.xml new file mode 100644 index 000000000..20c5b3b4a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/resolution-cache/reports/d-d-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs new file mode 100644 index 000000000..6a130c176 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/output new file mode 100644 index 000000000..e4dd9d567 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/d/target/streams/$global/update/$global/streams/update_cache/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml new file mode 100644 index 000000000..3baa16e61 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml new file mode 100644 index 000000000..1236e60b8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-compile.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml new file mode 100644 index 000000000..8eb3ad39c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml new file mode 100644 index 000000000..af958b104 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml new file mode 100644 index 000000000..a9c637436 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml new file mode 100644 index 000000000..92a66400f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-runtime.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml new file mode 100644 index 000000000..870a8d5a7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml new file mode 100644 index 000000000..d494ae77a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/scala-2.10/resolution-cache/reports/e-e_2.10-test.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..768a83481 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..da1c44c8d Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/build.properties new file mode 100644 index 000000000..8e682c526 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.18 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile-internal.xml new file mode 100644 index 000000000..c4a3ab645 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile-internal.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile.xml new file mode 100644 index 000000000..576fa30ab --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-compile.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-optional.xml new file mode 100644 index 000000000..1b7d420bc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-provided.xml new file mode 100644 index 000000000..207cd9b1a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-provided.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime-internal.xml new file mode 100644 index 000000000..0d275856d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime-internal.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime.xml new file mode 100644 index 000000000..1a187b9fd --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-runtime.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test-internal.xml new file mode 100644 index 000000000..39240bf8a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test-internal.xml @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test.xml new file mode 100644 index 000000000..5ffb89c0f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-test.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..d2c8e007b Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml new file mode 100644 index 000000000..100f31483 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml new file mode 100644 index 000000000..de37970db --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-optional.xml new file mode 100644 index 000000000..00495e7c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-provided.xml new file mode 100644 index 000000000..c04b43cdb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml new file mode 100644 index 000000000..31ab2733c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml new file mode 100644 index 000000000..99fcd830b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml new file mode 100644 index 000000000..839fac684 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml new file mode 100644 index 000000000..9f1522e0d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..5fa6e3b47 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..aaac6a915 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/matrix/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml new file mode 100644 index 000000000..d80ea8d15 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml new file mode 100644 index 000000000..7aba8fc20 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml new file mode 100644 index 000000000..f8b5775f0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml new file mode 100644 index 000000000..450541c1c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml new file mode 100644 index 000000000..e478c976e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test-internal.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml new file mode 100644 index 000000000..852817bed --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/scala-2.10/resolution-cache/reports/a-a_2.10-test.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..d5835b550 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml new file mode 100644 index 000000000..94bb7450f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml new file mode 100644 index 000000000..3669bc2db --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-compile.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml new file mode 100644 index 000000000..cdef7e011 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml new file mode 100644 index 000000000..25df49b3b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-runtime.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml new file mode 100644 index 000000000..59f4b155f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml new file mode 100644 index 000000000..3af0c58a1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/scala-2.10/resolution-cache/reports/b-b_2.10-test.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..4d329dddf Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml new file mode 100644 index 000000000..4f485e855 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml new file mode 100644 index 000000000..f3bb261a8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-compile.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml new file mode 100644 index 000000000..664cef51f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml new file mode 100644 index 000000000..877a29a63 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-runtime.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml new file mode 100644 index 000000000..1d378961e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml new file mode 100644 index 000000000..4ea68d155 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/scala-2.10/resolution-cache/reports/c-c_2.10-test.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs new file mode 100644 index 000000000..3a573c026 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/inputs differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..d2fb27f75 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/project/build.properties new file mode 100644 index 000000000..8e682c526 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.18 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml new file mode 100644 index 000000000..378ecea76 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml new file mode 100644 index 000000000..d68b12fbf --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml new file mode 100644 index 000000000..99f6fcb0d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml new file mode 100644 index 000000000..b694dff14 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml new file mode 100644 index 000000000..4063ea7b0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml new file mode 100644 index 000000000..8baa3e0b1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/scala-2.10/resolution-cache/reports/root-root_2.10-test.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/streams/$global/update/$global/streams/update_cache_2.10/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/streams/$global/update/$global/streams/update_cache_2.10/output new file mode 100644 index 000000000..8e789f826 Binary files /dev/null and b/crates/socket-patch-core/tests/fixtures/sbt/evidence/0.13.18/test-compile/target/streams/$global/update/$global/streams/update_cache_2.10/output differ diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..86d91ca92 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..e377d8ab6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..b6fd29daa --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/project/build.properties new file mode 100644 index 000000000..e0a1aa023 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.13.0 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..6ffdec122 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/gson-bump/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..805019a7a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-1555161059 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..c30529354 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/build.sbt new file mode 100644 index 000000000..972924016 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "2.12.18" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("2.12.18", "2.13.12"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/inputs new file mode 100644 index 000000000..452373b79 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/inputs @@ -0,0 +1 @@ +732872066 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/output new file mode 100644 index 000000000..6c623ac1e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/d/target/update/update_cache/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..a999876c1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-1628111593 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a5e506fcc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs new file mode 100644 index 000000000..3c9cf6995 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs @@ -0,0 +1 @@ +267125450 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/output new file mode 100644 index 000000000..5005105cc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/e/target/scala-2.13/update/update_cache_2.13/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.13.12"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"]],"evicted":false},{"module":{"organization":"io.github.java-diff-utils","name":"java-diff-utils","revision":"4.12"},"artifacts":[[{"name":"java-diff-utils","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"]],"evicted":false},{"module":{"organization":"org.jline","name":"jline","revision":"3.22.0"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.13.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/build.properties new file mode 100644 index 000000000..e0a1aa023 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.13.0 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..5afdb9ec7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-117300134 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..d99c18a72 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..b01041761 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-2145184126 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..1becc2527 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/matrix/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..86d91ca92 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..cddf0c9e3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..b6fd29daa --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/project/build.properties new file mode 100644 index 000000000..e0a1aa023 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.13.0 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..6ffdec122 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.13.0/test-compile/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.21"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.21"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.21"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.21/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml new file mode 100644 index 000000000..2d1c516b2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml new file mode 100644 index 000000000..c86d9b2db --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml new file mode 100644 index 000000000..8e6db9b0a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml new file mode 100644 index 000000000..048c92fbe --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml new file mode 100644 index 000000000..c781ac2df --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml new file mode 100644 index 000000000..52336ebc0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..58d1462da --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/a/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/U/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[{"organization":"junit","name":"junit","modules":[{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false}]},{"organization":"org.hamcrest","name":"hamcrest-core","modules":[{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[{"organization":"junit","name":"junit","modules":[{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false}]},{"organization":"org.hamcrest","name":"hamcrest-core","modules":[{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":60,"downloadTime":3,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar":1341868082000,"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///work/1.2.8/U/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951042369,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar":1613233912000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar":1594560720000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml new file mode 100644 index 000000000..923902a7f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml new file mode 100644 index 000000000..7e8a3e9d6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml new file mode 100644 index 000000000..743daf5f9 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml new file mode 100644 index 000000000..7c38d9dd0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml new file mode 100644 index 000000000..1d34a6064 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml new file mode 100644 index 000000000..79e0d7b77 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..866d7d306 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/b/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/U/b/target/scala-2.12/resolution-cache/b/b_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":177,"downloadTime":61,"downloadSize":0,"cached":false},"stamps":{"file:///work/1.2.8/U/b/target/scala-2.12/resolution-cache/b/b_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951061351,"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar":1614372051000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar":1664031429000,"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.10.1.jar":1673019840000,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml new file mode 100644 index 000000000..43f33a0c8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml new file mode 100644 index 000000000..c8183be5b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml new file mode 100644 index 000000000..c22cdb004 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml new file mode 100644 index 000000000..03f4c865f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml new file mode 100644 index 000000000..f8ad68e53 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml new file mode 100644 index 000000000..c91970609 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..b65c4f81b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/c/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/U/c/target/scala-2.12/resolution-cache/c/c_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":97,"downloadTime":3,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar":1614372051000,"file:///work/1.2.8/U/c/target/scala-2.12/resolution-cache/c/c_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951042212,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/project/build.properties new file mode 100644 index 000000000..c0bab0494 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml new file mode 100644 index 000000000..5fe7f78c1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml new file mode 100644 index 000000000..c2961aea3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml new file mode 100644 index 000000000..e60a4d657 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml new file mode 100644 index 000000000..798745c5f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml new file mode 100644 index 000000000..ca32c53eb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml new file mode 100644 index 000000000..4417c08ef --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..6850e77fc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/gson-bump/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/U/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":39,"downloadTime":1,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///work/1.2.8/U/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951042418,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar":1594560720000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml new file mode 100644 index 000000000..72fd59538 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml new file mode 100644 index 000000000..53fe7093e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml new file mode 100644 index 000000000..7c0b0e41f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml new file mode 100644 index 000000000..b7ed3b44b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml new file mode 100644 index 000000000..d8736c666 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml new file mode 100644 index 000000000..1618dbeda --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml new file mode 100644 index 000000000..975e8f614 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml new file mode 100644 index 000000000..79042baa2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/inputs new file mode 100644 index 000000000..81669ec3d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/inputs @@ -0,0 +1 @@ +1745334697 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..1d28c7150 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/a/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/build.sbt new file mode 100644 index 000000000..972924016 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "2.12.18" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("2.12.18", "2.13.12"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml new file mode 100644 index 000000000..47db83caf --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile.xml new file mode 100644 index 000000000..ce6bd0b1a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-compile.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-optional.xml new file mode 100644 index 000000000..100ae955f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-provided.xml new file mode 100644 index 000000000..f9a3172ec --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml new file mode 100644 index 000000000..b10054add --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime.xml new file mode 100644 index 000000000..9269e81a1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml new file mode 100644 index 000000000..22fcdc55d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test.xml new file mode 100644 index 000000000..fd37e4e3b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/resolution-cache/reports/d-d-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs new file mode 100644 index 000000000..ffb102050 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/inputs @@ -0,0 +1 @@ +748855677 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/output new file mode 100644 index 000000000..8c4b4c78a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/d/target/streams/$global/update/$global/streams/update_cache/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/d/target/resolution-cache/d/d/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile-internal.xml new file mode 100644 index 000000000..60fe90a84 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile.xml new file mode 100644 index 000000000..f90b66cbc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-compile.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-optional.xml new file mode 100644 index 000000000..ca5cbbfa3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-provided.xml new file mode 100644 index 000000000..409360fd4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime-internal.xml new file mode 100644 index 000000000..0f5a02599 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime.xml new file mode 100644 index 000000000..3a3544713 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-runtime.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test-internal.xml new file mode 100644 index 000000000..c8cc7fc56 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test.xml new file mode 100644 index 000000000..0b5396744 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.12/resolution-cache/reports/e-e_2.12-test.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile-internal.xml new file mode 100644 index 000000000..9808b4398 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile.xml new file mode 100644 index 000000000..38359e95a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-compile.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-optional.xml new file mode 100644 index 000000000..9ad14a758 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-provided.xml new file mode 100644 index 000000000..bf95c7cca --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime-internal.xml new file mode 100644 index 000000000..dc9f0a0f9 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime.xml new file mode 100644 index 000000000..1a13d5bc2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-runtime.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test-internal.xml new file mode 100644 index 000000000..5a91f3050 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test-internal.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test.xml new file mode 100644 index 000000000..47b8247ac --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/scala-2.13/resolution-cache/reports/e-e_2.13-test.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/inputs new file mode 100644 index 000000000..5169a7693 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/inputs @@ -0,0 +1 @@ +-1132062095 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..85e64bce5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/e/target/scala-2.12/resolution-cache/e/e_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/inputs new file mode 100644 index 000000000..37375e91e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/inputs @@ -0,0 +1 @@ +-1107847944 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/output new file mode 100644 index 000000000..cef261c80 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/e/target/streams/$global/update/$global/streams/update_cache_2.13/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/e/target/scala-2.13/resolution-cache/e/e_2.13/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"],[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11-tests.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.13.12"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.13.12.jar"]],"evicted":false},{"module":{"organization":"io.github.java-diff-utils","name":"java-diff-utils","revision":"4.12"},"artifacts":[[{"name":"java-diff-utils","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/io.github.java-diff-utils/java-diff-utils/jars/java-diff-utils-4.12.jar"]],"evicted":false},{"module":{"organization":"org.jline","name":"jline","revision":"3.22.0"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.jline/jline/jars/jline-3.22.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.13.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-5.13.0.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.13.12.jar"]],"evicted":false}]},{"organization":"org.jline","name":"jline","modules":[{"module":{"organization":"org.jline","name":"jline","revision":"3.22.0"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.jline/jline/jars/jline-3.22.0.jar"]],"evicted":false}]},{"organization":"net.java.dev.jna","name":"jna","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.13.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-5.13.0.jar"]],"evicted":false}]},{"organization":"io.github.java-diff-utils","name":"java-diff-utils","modules":[{"module":{"organization":"io.github.java-diff-utils","name":"java-diff-utils","revision":"4.12"},"artifacts":[[{"name":"java-diff-utils","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/io.github.java-diff-utils/java-diff-utils/jars/java-diff-utils-4.12.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.13.12"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.13.12.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.12.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/build.properties new file mode 100644 index 000000000..c0bab0494 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile-internal.xml new file mode 100644 index 000000000..00faee123 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile-internal.xml @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile.xml new file mode 100644 index 000000000..eeafb4c24 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-compile.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-optional.xml new file mode 100644 index 000000000..17364529d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-provided.xml new file mode 100644 index 000000000..8da04b68d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-provided.xml @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime-internal.xml new file mode 100644 index 000000000..13b7222da --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime-internal.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime.xml new file mode 100644 index 000000000..02dd117e4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-runtime.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test-internal.xml new file mode 100644 index 000000000..ba3f9bf1e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test-internal.xml @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test.xml new file mode 100644 index 000000000..a9589b334 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/scala-2.12/sbt-1.0/resolution-cache/reports/default-x-build-test.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/inputs new file mode 100644 index 000000000..f45558802 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/inputs @@ -0,0 +1 @@ +467888809 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..d3583b7ca --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/project/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/project/target/scala-2.12/sbt-1.0/resolution-cache/default/x-build/scala_2.12/sbt_1.0/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}],"details":[{"organization":"org.scala-sbt","name":"sbt","modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ivy","name":"ivy","modules":[{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"com.github.ben-manes.caffeine","name":"caffeine","modules":[{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-core_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-scripted_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main-settings_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"core-macros_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"command_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"template-resolver","modules":[{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"protocol_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","modules":[{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"actions_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-persist_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"sbinary_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false}]},{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","modules":[{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false}]},{"organization":"com.google.protobuf","name":"protobuf-java","modules":[{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"sourcecode_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false}]},{"organization":"com.trueaccord.lenses","name":"lenses_2.12","modules":[{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.4"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okhttp3","name":"okhttp","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okio","name":"okio","modules":[{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"org.reactivestreams","name":"reactive-streams","modules":[{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"ssl-config-core_2.12","modules":[{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"config","modules":[{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false}]},{"organization":"com.jcraft","name":"jsch","modules":[{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.5"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-tracking_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"testing_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"launcher-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.0"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"test-agent","modules":[{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"test-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"task-system_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-cache_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"tasks_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"run_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-logging_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.logging.log4j","name":"log4j-core","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false}]},{"organization":"org.slf4j","name":"slf4j-api","modules":[{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false}]},{"organization":"com.lmax","name":"disruptor","modules":[{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-api","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"completion_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-control_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"io_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.1"},"artifacts":[],"evicted":true},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"net.java.dev.jna","name":"jna-platform","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false}]},{"organization":"net.java.dev.jna","name":"jna","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false}]},{"organization":"com.swoval","name":"apple-file-events","modules":[{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"logic_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-relation_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"collections_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-position_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.spire-math","name":"jawn-parser_2.12","modules":[{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}],"details":[{"organization":"org.scala-sbt","name":"sbt","modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ivy","name":"ivy","modules":[{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"com.github.ben-manes.caffeine","name":"caffeine","modules":[{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-core_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-scripted_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main-settings_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"core-macros_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"command_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"template-resolver","modules":[{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"protocol_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","modules":[{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"actions_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-persist_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"sbinary_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false}]},{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","modules":[{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false}]},{"organization":"com.google.protobuf","name":"protobuf-java","modules":[{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"sourcecode_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false}]},{"organization":"com.trueaccord.lenses","name":"lenses_2.12","modules":[{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.4"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okhttp3","name":"okhttp","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okio","name":"okio","modules":[{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"org.reactivestreams","name":"reactive-streams","modules":[{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"ssl-config-core_2.12","modules":[{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"config","modules":[{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false}]},{"organization":"com.jcraft","name":"jsch","modules":[{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.5"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-tracking_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"testing_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"launcher-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.0"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"test-agent","modules":[{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"test-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"task-system_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-cache_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"tasks_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"run_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-logging_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.logging.log4j","name":"log4j-core","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false}]},{"organization":"org.slf4j","name":"slf4j-api","modules":[{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false}]},{"organization":"com.lmax","name":"disruptor","modules":[{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-api","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"completion_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-control_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"io_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.1"},"artifacts":[],"evicted":true},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"net.java.dev.jna","name":"jna-platform","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false}]},{"organization":"net.java.dev.jna","name":"jna","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false}]},{"organization":"com.swoval","name":"apple-file-events","modules":[{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"logic_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-relation_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"collections_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-position_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.spire-math","name":"jawn-parser_2.12","modules":[{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}],"details":[{"organization":"org.scala-sbt","name":"sbt","modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.2.8"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main_2.12/jars/main_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile_2.12/jars/zinc-compile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-ivy_2.12/jars/librarymanagement-ivy_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ivy","name":"ivy","modules":[{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ivy/ivy/jars/ivy-2.3.0-sbt-cb9cc189e9f3af519f9f102e6c5d446488ff6832.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-caffeine_2.12/jars/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"com.github.ben-manes.caffeine","name":"caffeine","modules":[{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.ben-manes.caffeine/caffeine/jars/caffeine-2.5.6.jar"]],"evicted":false}]},{"organization":"com.github.cb372","name":"scalacache-core_2.12","modules":[{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.github.cb372/scalacache-core_2.12/jars/scalacache-core_2.12-0.20.0.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.1"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-slf4j-impl/jars/log4j-slf4j-impl-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-plugin_2.12/jars/scripted-plugin_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.2.8"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/scripted-sbt-redux_2.12/jars/scripted-sbt-redux_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-scripted_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-scripted_2.12/jars/util-scripted_2.12-1.2.4.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"main-settings_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.2.8"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/main-settings_2.12/jars/main-settings_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"core-macros_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.2.8"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/core-macros_2.12/jars/core-macros_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"command_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.2.8"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/command_2.12/jars/command_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"template-resolver","modules":[{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/template-resolver/jars/template-resolver-0.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"protocol_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.2.8"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/protocol_2.12/jars/protocol_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","modules":[{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.0"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt.ipcsocket/ipcsocket/jars/ipcsocket-1.0.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"actions_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.2.8"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/actions_2.12/jars/actions_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc_2.12/jars/zinc_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-persist_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-persist_2.12/jars/zinc-persist_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"sbinary_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/sbinary_2.12/jars/sbinary_2.12-0.5.0.jar"]],"evicted":false}]},{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","modules":[{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.scalapb/scalapb-runtime_2.12/jars/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false}]},{"organization":"com.google.protobuf","name":"protobuf-java","modules":[{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.3.1"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.google.protobuf/protobuf-java/bundles/protobuf-java-3.3.1.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse_2.12/jars/fastparse_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/fastparse-utils_2.12/jars/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false}]},{"organization":"com.lihaoyi","name":"sourcecode_2.12","modules":[{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lihaoyi/sourcecode_2.12/jars/sourcecode_2.12-0.1.3.jar"]],"evicted":false}]},{"organization":"com.trueaccord.lenses","name":"lenses_2.12","modules":[{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.trueaccord.lenses/lenses_2.12/jars/lenses_2.12-0.4.12.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-core_2.12/jars/zinc-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-ivy-integration_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-ivy-integration_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-ivy-integration_2.12/jars/zinc-ivy-integration_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-compile-core_2.12/jars/zinc-compile-core_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.5"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.12/bundles/scala-parser-combinators_2.12-1.0.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.0.4"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/librarymanagement-core_2.12/jars/librarymanagement-core_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp-urlconnection/jars/okhttp-urlconnection-3.7.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-okhttp_2.12/jars/gigahorse-okhttp_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okhttp3","name":"okhttp","modules":[{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.7.0"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okhttp3/okhttp/jars/okhttp-3.7.0.jar"]],"evicted":false}]},{"organization":"com.squareup.okio","name":"okio","modules":[{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.12.0"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.squareup.okio/okio/jars/okio-1.12.0.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.3.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/gigahorse-core_2.12/jars/gigahorse-core_2.12-0.3.0.jar"]],"evicted":false}]},{"organization":"org.reactivestreams","name":"reactive-streams","modules":[{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.0"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.reactivestreams/reactive-streams/jars/reactive-streams-1.0.0.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"ssl-config-core_2.12","modules":[{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.2.2"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/ssl-config-core_2.12/bundles/ssl-config-core_2.12-0.2.2.jar"]],"evicted":false}]},{"organization":"com.typesafe","name":"config","modules":[{"module":{"organization":"com.typesafe","name":"config","revision":"1.2.0"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/com.typesafe/config/bundles/config-1.2.0.jar"]],"evicted":false}]},{"organization":"com.jcraft","name":"jsch","modules":[{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.jcraft/jsch/jars/jsch-0.1.54.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.5"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-apiinfo_2.12/jars/zinc-apiinfo_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classfile_2.12/jars/zinc-classfile_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.2.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-bridge_2.12/jars/compiler-bridge_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-tracking_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-tracking_2.12/jars/util-tracking_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"testing_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.2.8"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/testing_2.12/jars/testing_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"launcher-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/launcher-interface/jars/launcher-interface-1.0.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.0.0"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"test-agent","modules":[{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.2.8"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-agent/jars/test-agent-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"test-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"task-system_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.2.8"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/task-system_2.12/jars/task-system_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-cache_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-cache_2.12/jars/util-cache_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-murmurhash_2.12/jars/sjson-new-murmurhash_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"tasks_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.2.8"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/tasks_2.12/jars/tasks_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"run_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.2.8"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/run_2.12/jars/run_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.2.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/zinc-classpath_2.12/jars/zinc-classpath_2.12-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"compiler-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.2.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/compiler-interface/jars/compiler-interface-1.2.5.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-logging_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-logging_2.12/jars/util-logging_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.logging.log4j","name":"log4j-core","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.1"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.11.1.jar"]],"evicted":false}]},{"organization":"org.slf4j","name":"slf4j-api","modules":[{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.25"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.25.jar"]],"evicted":false}]},{"organization":"com.lmax","name":"disruptor","modules":[{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.lmax/disruptor/jars/disruptor-3.4.2.jar"]],"evicted":false}]},{"organization":"org.apache.logging.log4j","name":"log4j-api","modules":[{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.1"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.11.1.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-interface","modules":[{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.4"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-interface/jars/util-interface-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"completion_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.2.8"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/completion_2.12/jars/completion_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-control_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-control_2.12/jars/util-control_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"io_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.2"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/io_2.12/jars/io_2.12-1.2.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.1"},"artifacts":[],"evicted":true},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.2.0"},"artifacts":[],"evicted":true}]},{"organization":"net.java.dev.jna","name":"jna-platform","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"4.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar"]],"evicted":false}]},{"organization":"net.java.dev.jna","name":"jna","modules":[{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"4.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/net.java.dev.jna/jna/jars/jna-4.5.0.jar"]],"evicted":false}]},{"organization":"com.swoval","name":"apple-file-events","modules":[{"module":{"organization":"com.swoval","name":"apple-file-events","revision":"1.3.2"},"artifacts":[[{"name":"apple-file-events","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.swoval/apple-file-events/jars/apple-file-events-1.3.2.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"logic_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.2.8"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/logic_2.12/jars/logic_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-relation_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-relation_2.12/jars/util-relation_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-sbt","name":"collections_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.2.8"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/collections_2.12/jars/collections_2.12-1.2.8.jar"]],"evicted":false}]},{"organization":"org.scala-sbt","name":"util-position_2.12","modules":[{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.4"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-sbt/util-position_2.12/jars/util-position_2.12-1.2.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.2.2"},"artifacts":[],"evicted":true}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-scalajson_2.12/jars/sjson-new-scalajson_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.spire-math","name":"jawn-parser_2.12","modules":[{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.spire-math/jawn-parser_2.12/jars/jawn-parser_2.12-0.10.4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/shaded-scalajson_2.12/jars/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false}]},{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","modules":[{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.2"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.eed3si9n/sjson-new-core_2.12/jars/sjson-new-core_2.12-0.8.2.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml new file mode 100644 index 000000000..4cc944cd7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml new file mode 100644 index 000000000..e9ef7df4e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml new file mode 100644 index 000000000..cfa8cf879 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml new file mode 100644 index 000000000..8da22cd9d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml new file mode 100644 index 000000000..55e845333 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml new file mode 100644 index 000000000..bbcca2051 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml new file mode 100644 index 000000000..5c250846f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml new file mode 100644 index 000000000..e21a95a59 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/inputs new file mode 100644 index 000000000..5b383d9e2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/inputs @@ -0,0 +1 @@ +800044774 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..3a38ee687 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/matrix/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/x/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.18.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.18.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.18.jar"]],"evicted":false}]}]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml new file mode 100644 index 000000000..2786de79b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml new file mode 100644 index 000000000..f52882123 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml new file mode 100644 index 000000000..b34db63a3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml new file mode 100644 index 000000000..c2e19b70c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml new file mode 100644 index 000000000..3bf5265e7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml new file mode 100644 index 000000000..34f1f4821 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..6e0b12d88 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/a/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/T/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[{"organization":"junit","name":"junit","modules":[{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false}]},{"organization":"org.hamcrest","name":"hamcrest-core","modules":[{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[{"organization":"junit","name":"junit","modules":[{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar"]],"evicted":false}]},{"organization":"org.hamcrest","name":"hamcrest-core","modules":[{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":44,"downloadTime":3,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar":1341868082000,"file:///work/1.2.8/T/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951055216,"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/junit/junit/jars/junit-4.13.2.jar":1613233912000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar":1594560720000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml new file mode 100644 index 000000000..6f599b17f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml new file mode 100644 index 000000000..99c9111a6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-compile.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml new file mode 100644 index 000000000..76fdf6008 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml new file mode 100644 index 000000000..702110aeb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-runtime.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml new file mode 100644 index 000000000..caf00b245 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test-internal.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml new file mode 100644 index 000000000..aa14d2bbc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/scala-2.12/resolution-cache/reports/b-b_2.12-test.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..829c7b833 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/b/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/T/b/target/scala-2.12/resolution-cache/b/b_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}],"details":[{"organization":"com.google.code.gson","name":"gson","modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":42,"downloadTime":23,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar":1614372051000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.10.0.jar":1664031429000,"file:///root/.ivy2/cache/com.google.code.gson/gson/jars/gson-2.8.9.jar":1635537600000,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000,"file:///work/1.2.8/T/b/target/scala-2.12/resolution-cache/b/b_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951055141}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml new file mode 100644 index 000000000..20695d3b5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml new file mode 100644 index 000000000..daf28cfd3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-compile.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml new file mode 100644 index 000000000..b3eb7397b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml new file mode 100644 index 000000000..e43d58cc8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-runtime.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml new file mode 100644 index 000000000..1ae867ea0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test-internal.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml new file mode 100644 index 000000000..d096266ba --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/scala-2.12/resolution-cache/reports/c-c_2.12-test.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..2bc074252 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/c/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/T/c/target/scala-2.12/resolution-cache/c/c_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[],"evicted":true}]},{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":31,"downloadTime":2,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar":1614372051000,"file:///work/1.2.8/T/c/target/scala-2.12/resolution-cache/c/c_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951055257,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/project/build.properties new file mode 100644 index 000000000..c0bab0494 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml new file mode 100644 index 000000000..10ddf3c79 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml new file mode 100644 index 000000000..ca87921c8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml new file mode 100644 index 000000000..00237a31f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml new file mode 100644 index 000000000..8e12fef4e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml new file mode 100644 index 000000000..b88c06f12 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml new file mode 100644 index 000000000..692c0da1c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/streams/$global/update/$global/streams/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/streams/$global/update/$global/streams/update_cache_2.12/output new file mode 100644 index 000000000..e60601611 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.2.8/test-compile/target/streams/$global/update/$global/streams/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.2.8/T/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}],"details":[{"organization":"org.apache.commons","name":"commons-text","modules":[{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false}]},{"organization":"org.apache.commons","name":"commons-lang3","modules":[{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[{"organization":"org.scala-lang","name":"scala-compiler","modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.7"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar"]],"evicted":false}]},{"organization":"jline","name":"jline","modules":[{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","modules":[{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-reflect","modules":[{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.7"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar"]],"evicted":false}]},{"organization":"org.scala-lang","name":"scala-library","modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.7"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar"]],"evicted":false}]}]}],"stats":{"resolveTime":31,"downloadTime":2,"downloadSize":0,"cached":false},"stamps":{"file:///root/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.7.jar":1538037357000,"file:///work/1.2.8/T/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml":1790951055295,"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar":1522055915000,"file:///root/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.12.7.jar":1538037115000,"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-1.0.6.jar":1478010075000,"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar":1594560720000,"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar":1595364047000,"file:///root/.ivy2/cache/org.scala-lang/scala-compiler/jars/scala-compiler-2.12.7.jar":1538037450000}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..93303de6a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a2af23b89 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..c6f884f88 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/project/build.properties new file mode 100644 index 000000000..0837f7a13 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.13 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..436943d55 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/gson-bump/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..d60ac3ec8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +909376692 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..520084908 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/build.sbt new file mode 100644 index 000000000..972924016 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "2.12.18" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("2.12.18", "2.13.12"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/inputs new file mode 100644 index 000000000..90ed7b3f4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/inputs @@ -0,0 +1 @@ +-570917114 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/output new file mode 100644 index 000000000..999675835 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/d/target/update/update_cache/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..b077a7ee6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-544870845 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..5247bd4f1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs new file mode 100644 index 000000000..6bbacea7d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs @@ -0,0 +1 @@ +-1824578983 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/output new file mode 100644 index 000000000..9c34f8063 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/e/target/scala-2.13/update/update_cache_2.13/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.13.12"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"]],"evicted":false},{"module":{"organization":"io.github.java-diff-utils","name":"java-diff-utils","revision":"4.12"},"artifacts":[[{"name":"java-diff-utils","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"]],"evicted":false},{"module":{"organization":"org.jline","name":"jline","revision":"3.22.0"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.13.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/build.properties new file mode 100644 index 000000000..0837f7a13 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.13 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..c9f75397b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +1890397245 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..847d5fecc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.3.13"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.3.4"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.3.13"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.3.13"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.3.13"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.3.13"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.3.13"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-lm-integration_2.12","revision":"1.3.13"},"artifacts":[[{"name":"zinc-lm-integration_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.1.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.2"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.2"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.2"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"lm-coursier-shaded_2.12","revision":"2.0.0-RC6-4"},"artifacts":[[{"name":"lm-coursier-shaded_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.3.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"file-tree-views","revision":"2.1.3"},"artifacts":[[{"name":"file-tree-views","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"5.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.3.13"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.3.13"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.3.13"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.3.13"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.3.13"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.3.13"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.26"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.3.3"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.7.0"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.3.13"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.3.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.1"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.1.2"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.14.2"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.4.0"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.2"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.17.2"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.3.3"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.3.13"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.3.4"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.3.13"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.3.13"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.3.13"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.3.13"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.3.13"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-lm-integration_2.12","revision":"1.3.13"},"artifacts":[[{"name":"zinc-lm-integration_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.1.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.2"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.2"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.2"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"lm-coursier-shaded_2.12","revision":"2.0.0-RC6-4"},"artifacts":[[{"name":"lm-coursier-shaded_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.3.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"file-tree-views","revision":"2.1.3"},"artifacts":[[{"name":"file-tree-views","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"5.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.3.13"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.3.13"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.3.13"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.3.13"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.3.13"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.3.13"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.26"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.3.3"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.7.0"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.3.13"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.3.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.1"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.1.2"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.14.2"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.4.0"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.2"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.17.2"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.3.3"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-sbt","name":"sbt","revision":"1.3.13"},"artifacts":[[{"name":"sbt","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.3.13/sbt-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.3.13/main_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"io_2.12","revision":"1.3.4"},"artifacts":[[{"name":"io_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.3.4/io_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"logic_2.12","revision":"1.3.13"},"artifacts":[[{"name":"logic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.3.13/logic_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"actions_2.12","revision":"1.3.13"},"artifacts":[[{"name":"actions_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.3.13/actions_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"main-settings_2.12","revision":"1.3.13"},"artifacts":[[{"name":"main-settings_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.3.13/main-settings_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"run_2.12","revision":"1.3.13"},"artifacts":[[{"name":"run_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.3.13/run_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"command_2.12","revision":"1.3.13"},"artifacts":[[{"name":"command_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.3.13/command_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"collections_2.12","revision":"1.3.13"},"artifacts":[[{"name":"collections_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.3.13/collections_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-sbt-redux_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-sbt-redux_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-sbt-redux_2.12/1.3.13/scripted-sbt-redux_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"scripted-plugin_2.12","revision":"1.3.13"},"artifacts":[[{"name":"scripted-plugin_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.3.13/scripted-plugin_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-lm-integration_2.12","revision":"1.3.13"},"artifacts":[[{"name":"zinc-lm-integration_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.3.13/zinc-lm-integration_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.3.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.3.0/scala-xml_2.12-1.3.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"launcher-interface","revision":"1.1.4"},"artifacts":[[{"name":"launcher-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.1.4/launcher-interface-1.1.4.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-api","revision":"2.11.2"},"artifacts":[[{"name":"log4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-core","revision":"2.11.2"},"artifacts":[[{"name":"log4j-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.logging.log4j","name":"log4j-slf4j-impl","revision":"2.11.2"},"artifacts":[[{"name":"log4j-slf4j-impl","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-caffeine_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-caffeine_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-caffeine_2.12/0.20.0/scalacache-caffeine_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"lm-coursier-shaded_2.12","revision":"2.0.0-RC6-4"},"artifacts":[[{"name":"lm-coursier-shaded_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.0-RC6-4/lm-coursier-shaded_2.12-2.0.0-RC6-4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-logging_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-logging_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.3.3/util-logging_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-core_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.3.4/librarymanagement-core_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"librarymanagement-ivy_2.12","revision":"1.3.4"},"artifacts":[[{"name":"librarymanagement-ivy_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.3.4/librarymanagement-ivy_2.12-1.3.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.3.5"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.3.5/compiler-interface-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.3.5/zinc-compile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.swoval","name":"file-tree-views","revision":"2.1.3"},"artifacts":[[{"name":"file-tree-views","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.3/file-tree-views-2.1.3.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.5.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna-platform","revision":"5.5.0"},"artifacts":[[{"name":"jna-platform","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-relation_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-relation_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.3.3/util-relation_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"completion_2.12","revision":"1.3.13"},"artifacts":[[{"name":"completion_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.3.13/completion_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"task-system_2.12","revision":"1.3.13"},"artifacts":[[{"name":"task-system_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.3.13/task-system_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"tasks_2.12","revision":"1.3.13"},"artifacts":[[{"name":"tasks_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.3.13/tasks_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"testing_2.12","revision":"1.3.13"},"artifacts":[[{"name":"testing_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.3.13/testing_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-scalajson_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.8.3/sjson-new-scalajson_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-tracking_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-tracking_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.3.3/util-tracking_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classpath_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classpath_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.3.5/zinc-classpath_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-apiinfo_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-apiinfo_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.3.5/zinc-apiinfo_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.3.5/zinc_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"core-macros_2.12","revision":"1.3.13"},"artifacts":[[{"name":"core-macros_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.3.13/core-macros_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-cache_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-cache_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.3.3/util-cache_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-control_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-control_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.3.3/util-control_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"protocol_2.12","revision":"1.3.13"},"artifacts":[[{"name":"protocol_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.3.13/protocol_2.12-1.3.13.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-core_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.8.3/sjson-new-core_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"template-resolver","revision":"0.1"},"artifacts":[[{"name":"template-resolver","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-position_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-position_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.3.3/util-position_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-scripted_2.12","revision":"1.3.3"},"artifacts":[[{"name":"util-scripted_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-scripted_2.12/1.3.3/util-scripted_2.12-1.3.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-compile-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-compile-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.3.5/zinc-compile-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.26"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar"]],"evicted":false},{"module":{"organization":"com.github.cb372","name":"scalacache-core_2.12","revision":"0.20.0"},"artifacts":[[{"name":"scalacache-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/cb372/scalacache-core_2.12/0.20.0/scalacache-core_2.12-0.20.0.jar"]],"evicted":false},{"module":{"organization":"com.github.ben-manes.caffeine","name":"caffeine","revision":"2.5.6"},"artifacts":[[{"name":"caffeine","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.5.6/caffeine-2.5.6.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.3.3"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.3.3/util-interface-1.3.3.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"com.lmax","name":"disruptor","revision":"3.4.2"},"artifacts":[[{"name":"disruptor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"com.jcraft","name":"jsch","revision":"0.1.54"},"artifacts":[[{"name":"jsch","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-okhttp_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-okhttp_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.5.0/gigahorse-okhttp_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp-urlconnection","revision":"3.7.0"},"artifacts":[[{"name":"okhttp-urlconnection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection/3.7.0/okhttp-urlconnection-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ivy","name":"ivy","revision":"2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad"},"artifacts":[[{"name":"ivy","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad/ivy-2.3.0-sbt-839fad1cdc07cf6fc81364d74c323867230432ad.jar"]],"evicted":false},{"module":{"organization":"com.google.protobuf","name":"protobuf-java","revision":"3.7.0"},"artifacts":[[{"name":"protobuf-java","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.7.0/protobuf-java-3.7.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-agent","revision":"1.3.13"},"artifacts":[[{"name":"test-agent","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.3.13/test-agent-1.3.13.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"test-interface","revision":"1.0"},"artifacts":[[{"name":"test-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"shaded-scalajson_2.12","revision":"1.0.0-M4"},"artifacts":[[{"name":"shaded-scalajson_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar"]],"evicted":false},{"module":{"organization":"org.spire-math","name":"jawn-parser_2.12","revision":"0.10.4"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/spire-math/jawn-parser_2.12/0.10.4/jawn-parser_2.12-0.10.4.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-bridge_2.12","revision":"1.3.5"},"artifacts":[[{"name":"compiler-bridge_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.3.5/compiler-bridge_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-classfile_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-classfile_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.3.5/zinc-classfile_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-core_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.3.5/zinc-core_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"zinc-persist_2.12","revision":"1.3.5"},"artifacts":[[{"name":"zinc-persist_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.3.5/zinc-persist_2.12-1.3.5.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"sjson-new-murmurhash_2.12","revision":"0.8.3"},"artifacts":[[{"name":"sjson-new-murmurhash_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.8.3/sjson-new-murmurhash_2.12-0.8.3.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt.ipcsocket","name":"ipcsocket","revision":"1.0.1"},"artifacts":[[{"name":"ipcsocket","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.0.1/ipcsocket-1.0.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-parser-combinators_2.12","revision":"1.1.2"},"artifacts":[[{"name":"scala-parser-combinators_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar"]],"evicted":false},{"module":{"organization":"com.eed3si9n","name":"gigahorse-core_2.12","revision":"0.5.0"},"artifacts":[[{"name":"gigahorse-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.5.0/gigahorse-core_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okhttp3","name":"okhttp","revision":"3.14.2"},"artifacts":[[{"name":"okhttp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.2/okhttp-3.14.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.scalapb","name":"scalapb-runtime_2.12","revision":"0.6.0"},"artifacts":[[{"name":"scalapb-runtime_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/scalapb/scalapb-runtime_2.12/0.6.0/scalapb-runtime_2.12-0.6.0.jar"]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"sbinary_2.12","revision":"0.5.0"},"artifacts":[[{"name":"sbinary_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.0/sbinary_2.12-0.5.0.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"ssl-config-core_2.12","revision":"0.4.0"},"artifacts":[[{"name":"ssl-config-core_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.4.0/ssl-config-core_2.12-0.4.0.jar"]],"evicted":false},{"module":{"organization":"org.reactivestreams","name":"reactive-streams","revision":"1.0.2"},"artifacts":[[{"name":"reactive-streams","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar"]],"evicted":false},{"module":{"organization":"com.squareup.okio","name":"okio","revision":"1.17.2"},"artifacts":[[{"name":"okio","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar"]],"evicted":false},{"module":{"organization":"com.trueaccord.lenses","name":"lenses_2.12","revision":"0.4.12"},"artifacts":[[{"name":"lenses_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/trueaccord/lenses/lenses_2.12/0.4.12/lenses_2.12-0.4.12.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse_2.12/0.4.2/fastparse_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.typesafe","name":"config","revision":"1.3.3"},"artifacts":[[{"name":"config","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.3.3/config-1.3.3.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fastparse-utils_2.12","revision":"0.4.2"},"artifacts":[[{"name":"fastparse-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fastparse-utils_2.12/0.4.2/fastparse-utils_2.12-0.4.2.jar"]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_2.12","revision":"0.1.3"},"artifacts":[[{"name":"sourcecode_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_2.12/0.1.3/sourcecode_2.12-0.1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..62e2618ea --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +694074582 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..dfcd32612 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/matrix/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.18/scala-compiler-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.18/scala-reflect-2.12.18.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..93303de6a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..446d701c3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..c6f884f88 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/project/build.properties new file mode 100644 index 000000000..0837f7a13 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.13 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..436943d55 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.3.13/test-compile/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.10"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.10"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"1.0.6"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false},{"module":{"organization":"org.fusesource.jansi","name":"jansi","revision":"1.12"},"artifacts":[[{"name":"jansi","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.12/jansi-1.12.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.10"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.10/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/build.sbt.lock b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/build.sbt.lock new file mode 100644 index 000000000..93a3bd644 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/build.sbt.lock @@ -0,0 +1,61 @@ +{ + "lockVersion" : 1, + "timestamp" : "2026-10-02T17:00:25.176328429Z", + "configurations" : [ + "compile", + "optional", + "provided", + "runtime", + "test" + ], + "dependencies" : [ + { + "org" : "org.apache.commons", + "name" : "commons-lang3", + "version" : "3.11", + "artifacts" : [ + { + "name" : "commons-lang3.jar", + "hash" : "sha1:68e9a6adf7cf8eb7e9d31bbc554c7c75eeaac568" + } + ], + "configurations" : [ + "compile", + "runtime", + "test" + ] + }, + { + "org" : "org.apache.commons", + "name" : "commons-text", + "version" : "1.9", + "artifacts" : [ + { + "name" : "commons-text.jar", + "hash" : "sha1:ba6ac8c2807490944a0a27f6f8e68fb5ed2e80e2" + } + ], + "configurations" : [ + "compile", + "runtime", + "test" + ] + }, + { + "org" : "org.scala-lang", + "name" : "scala-library", + "version" : "2.12.18", + "artifacts" : [ + { + "name" : "scala-library.jar", + "hash" : "sha1:fa825f984172f6801e3d8c476071b1823c0a925b" + } + ], + "configurations" : [ + "compile", + "runtime", + "test" + ] + } + ] +} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..f21bba742 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +734238907 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..948b2b47c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.10"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt new file mode 100644 index 000000000..9b00dd450 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt @@ -0,0 +1,3 @@ +ThisBuild / scalaVersion := "2.12.18" +lazy val root = (project in file(".")).aggregate(a) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt.lock b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt.lock new file mode 100644 index 000000000..824fbed2c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/build.sbt.lock @@ -0,0 +1,29 @@ +{ + "lockVersion" : 1, + "timestamp" : "2026-10-02T17:00:25.162529512Z", + "configurations" : [ + "compile", + "optional", + "provided", + "runtime", + "test" + ], + "dependencies" : [ + { + "org" : "org.scala-lang", + "name" : "scala-library", + "version" : "2.12.18", + "artifacts" : [ + { + "name" : "scala-library.jar", + "hash" : "sha1:fa825f984172f6801e3d8c476071b1823c0a925b" + } + ], + "configurations" : [ + "compile", + "runtime", + "test" + ] + } + ] +} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/plugins.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/plugins.sbt new file mode 100644 index 000000000..ca42cd1ea --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("software.purpledragon" % "sbt-dependency-lock" % "1.5.1") diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..082f20f69 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +996637525 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..7a451dd6d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"sbt-dependency-lock","revision":"1.5.1"},"artifacts":[[{"name":"sbt-dependency-lock","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/sbt-dependency-lock_2.12_1.0/1.5.1/sbt-dependency-lock_2.12_1.0-1.5.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-core_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-core_2.12/0.14.9/circe-core_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-generic_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-generic_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-generic_2.12/0.14.9/circe-generic_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-parser_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-parser_2.12/0.14.9/circe-parser_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"software.purpledragon","name":"text-utils_2.12","revision":"1.3.1"},"artifacts":[[{"name":"text-utils_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/software/purpledragon/text-utils_2.12/1.3.1/text-utils_2.12-1.3.1.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-numbers_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-numbers_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-numbers_2.12/0.14.9/circe-numbers_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-core_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-core_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/2.12.0/cats-core_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"com.chuusai","name":"shapeless_2.12","revision":"2.3.12"},"artifacts":[[{"name":"shapeless_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/chuusai/shapeless_2.12/2.3.12/shapeless_2.12-2.3.12.jar"]],"evicted":false},{"module":{"organization":"io.circe","name":"circe-jawn_2.12","revision":"0.14.9"},"artifacts":[[{"name":"circe-jawn_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/circe/circe-jawn_2.12/0.14.9/circe-jawn_2.12-0.14.9.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"cats-kernel_2.12","revision":"2.12.0"},"artifacts":[[{"name":"cats-kernel_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-kernel_2.12/2.12.0/cats-kernel_2.12-2.12.0.jar"]],"evicted":false},{"module":{"organization":"org.typelevel","name":"jawn-parser_2.12","revision":"1.6.0"},"artifacts":[[{"name":"jawn-parser_2.12","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/typelevel/jawn-parser_2.12/1.6.0/jawn-parser_2.12-1.6.0.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/socket-patch.sbt new file mode 100644 index 000000000..03a0f8f3d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/socket-patch.sbt @@ -0,0 +1 @@ +ThisBuild / dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.10" diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..c01706993 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-307506809 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..afbe6729d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/dependency-lock/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..735ba7cda --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a93aae137 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a2d01c1ba --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..dfeaa48c8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/gson-bump/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/build.sbt new file mode 100644 index 000000000..fe58075af --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/build.sbt @@ -0,0 +1,2 @@ +ThisBuild / scalaVersion := "2.12.18" +libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9" diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..0a8245950 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +227146458 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..373f02d73 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..9fd601d75 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +978433178 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..4aeb79c55 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/implicit-root/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..e2a1949df --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +2103793835 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..00b89c14d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/build.sbt new file mode 100644 index 000000000..972924016 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "2.12.18" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("2.12.18", "2.13.12"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/inputs new file mode 100644 index 000000000..18f8a4c8b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/inputs @@ -0,0 +1 @@ +-1870256156 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/output new file mode 100644 index 000000000..56cda8abe --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/d/target/update/update_cache/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..151bd985d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +1236998879 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..7dec2d2ae --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs new file mode 100644 index 000000000..a216f3b5d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/inputs @@ -0,0 +1 @@ +1367099112 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/output new file mode 100644 index 000000000..245256efc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/e/target/scala-2.13/update/update_cache_2.13/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.13.12"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.12/scala-compiler-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.13.12"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.12/scala-reflect-2.13.12.jar"]],"evicted":false},{"module":{"organization":"io.github.java-diff-utils","name":"java-diff-utils","revision":"4.12"},"artifacts":[[{"name":"java-diff-utils","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.12/java-diff-utils-4.12.jar"]],"evicted":false},{"module":{"organization":"org.jline","name":"jline","revision":"3.22.0"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline/3.22.0/jline-3.22.0.jar"]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.13.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.12"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..07c4c6928 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-281502155 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..373f02d73 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..db31ba3c2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-1050036838 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..afbe6729d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/matrix/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..735ba7cda --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/b/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/b/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..6fbf692d8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/b/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/c/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/c/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a2d01c1ba --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/c/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..dfeaa48c8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/test-compile/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml new file mode 100644 index 000000000..ea2eb294d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile-internal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml new file mode 100644 index 000000000..e9e60e45d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-compile.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml new file mode 100644 index 000000000..7c0b0e41f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml new file mode 100644 index 000000000..b7ed3b44b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml new file mode 100644 index 000000000..4147e0d30 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime-internal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml new file mode 100644 index 000000000..04600ba63 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-runtime.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-scala-doc-tool.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-scala-doc-tool.xml new file mode 100644 index 000000000..84e1d49e7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-scala-doc-tool.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml new file mode 100644 index 000000000..c327b1fb4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test-internal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml new file mode 100644 index 000000000..6711a9d41 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/resolution-cache/reports/a-a_2.12-test.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..b3ea4e777 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +-989473692 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..a2018b0a4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/a/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.9.9/n/a/target/scala-2.12/resolution-cache/a/a_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-text/jars/commons-text-1.9.jar"]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.12.0.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/build.sbt new file mode 100644 index 000000000..df7a452e2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/build.sbt @@ -0,0 +1,4 @@ +ThisBuild / scalaVersion := "2.12.18" +ThisBuild / useCoursier := false +lazy val root = (project in file(".")).aggregate(a) +lazy val a = project.settings(libraryDependencies ++= Seq("org.apache.commons" % "commons-text" % "1.9", "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs new file mode 100644 index 000000000..ceac30b29 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +47531641 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output new file mode 100644 index 000000000..373f02d73 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":".","configurations":[{"configuration":{"name":"compile"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"},"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml new file mode 100644 index 000000000..4cc944cd7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml new file mode 100644 index 000000000..e9ef7df4e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-compile.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml new file mode 100644 index 000000000..cfa8cf879 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-optional.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml new file mode 100644 index 000000000..8da22cd9d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-provided.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml new file mode 100644 index 000000000..55e845333 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml new file mode 100644 index 000000000..bbcca2051 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-scala-doc-tool.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-scala-doc-tool.xml new file mode 100644 index 000000000..6eead7de6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-scala-doc-tool.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml new file mode 100644 index 000000000..5c250846f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test-internal.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml new file mode 100644 index 000000000..e21a95a59 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/resolution-cache/reports/root-root_2.12-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/inputs new file mode 100644 index 000000000..c847d5d2d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/inputs @@ -0,0 +1 @@ +1090585118 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/output new file mode 100644 index 000000000..b39419af5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/1.9.9/use-coursier-false/target/scala-2.12/update/update_cache_2.12/output @@ -0,0 +1 @@ +{"cachedDescriptor":"file:///work/1.9.9/n/target/scala-2.12/resolution-cache/root/root_2.12/0.1.0-SNAPSHOT/resolved.xml.xml","configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala-compiler","revision":"2.12.18"},"artifacts":[[{"name":"scala-compiler","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-compiler.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.12.18"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-library.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-reflect","revision":"2.12.18"},"artifacts":[[{"name":"scala-reflect","type":"jar","extension":"jar"},"file:///root/.sbt/boot/scala-2.12.18/lib/scala-reflect.jar"]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-xml_2.12","revision":"2.1.0"},"artifacts":[[{"name":"scala-xml_2.12","type":"bundle","extension":"jar"},"file:///root/.ivy2/cache/org.scala-lang.modules/scala-xml_2.12/bundles/scala-xml_2.12-2.1.0.jar"]],"evicted":false},{"module":{"organization":"jline","name":"jline","revision":"2.14.6"},"artifacts":[[{"name":"jline","type":"jar","extension":"jar"},"file:///root/.ivy2/cache/jline/jline/jars/jline-2.14.6.jar"]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/build.sbt new file mode 100644 index 000000000..a55442adc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.10.1")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output new file mode 100644 index 000000000..97b8c3485 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951280504"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output new file mode 100644 index 000000000..dbd37d06d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.10.1"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951298432"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output new file mode 100644 index 000000000..057e0f5b8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951280509"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output new file mode 100644 index 000000000..d17b3d32e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/gson-bump/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951280445"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/build.sbt new file mode 100644 index 000000000..34ee167d0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/build.sbt @@ -0,0 +1,2 @@ +ThisBuild / scalaVersion := "3.8.4" +libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9" diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/inputs new file mode 100644 index 000000000..f54abd8e2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/inputs @@ -0,0 +1 @@ +1111604990 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/output new file mode 100644 index 000000000..8a6821d6f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1-build/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/inputs new file mode 100644 index 000000000..e6d1e9161 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/inputs @@ -0,0 +1 @@ +397058372 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/output new file mode 100644 index 000000000..93e2b8528 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/implicit-root/target/out/jvm/scala-3.8.4/my_proj-1/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/build.sbt new file mode 100644 index 000000000..85a2d40c0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/build.sbt @@ -0,0 +1,5 @@ +ThisBuild / scalaVersion := "3.8.4" +lazy val root = (project in file(".")).aggregate(a, d, e) +lazy val a = project.settings(libraryDependencies += "org.apache.commons" % "commons-text" % "1.9") +lazy val d = project.settings(crossPaths := false, autoScalaLibrary := false, libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") +lazy val e = project.settings(crossScalaVersions := Seq("3.3.4", "3.8.4"), libraryDependencies ++= Seq("org.apache.commons" % "commons-lang3" % "3.11", "org.apache.commons" % "commons-lang3" % "3.11" classifier "tests")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/inputs new file mode 100644 index 000000000..cb2743548 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/inputs @@ -0,0 +1 @@ +778231801 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/output new file mode 100644 index 000000000..890ab326e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.3.4/e/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.3.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.3.4/scaladoc_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.3.4/scaladoc_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.3.4/scala3-compiler_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.3.4/scala3-compiler_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.3.4/scala3-tasty-inspector_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.3.4/scala3-tasty-inspector_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"2.15.1"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.15.1/jackson-dataformat-yaml-2.15.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.15.1/jackson-dataformat-yaml-2.15.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.3.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.3.4/scala3-interfaces-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.3.4/scala3-interfaces-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.3.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.3.4/tasty-core_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.3.4/tasty-core_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.6.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.6.0-scala-1/scala-asm-9.6.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.6.0-scala-1/scala-asm-9.6.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.9.6"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.25.1"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.25.1/jline-reader-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.25.1/jline-reader-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.25.1"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.25.1/jline-terminal-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.25.1/jline-terminal-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jna","revision":"3.25.1"},"artifacts":[[{"name":"jline-terminal-jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.25.1/jline-terminal-jna-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.25.1/jline-terminal-jna-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.15.1"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.1/jackson-annotations-2.15.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.15.1/jackson-annotations-2.15.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.15.1"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.1/jackson-core-2.15.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.15.1/jackson-core-2.15.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.15.1"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.1/jackson-databind-2.15.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.15.1/jackson-databind-2.15.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"org.yaml","name":"snakeyaml","revision":"2.0"},"artifacts":[[{"name":"snakeyaml","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/yaml/snakeyaml/2.0/snakeyaml-2.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/yaml/snakeyaml/2.0/snakeyaml-2.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.9.8"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.8/util-interface-1.9.8.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.8/util-interface-1.9.8.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.25.1"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.25.1/jline-native-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.25.1/jline-native-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.14.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.3.4/scala3-compiler_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.3.4/scala3-compiler_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.3.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.3.4/scala3-interfaces-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.3.4/scala3-interfaces-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.3.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.3.4/tasty-core_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.3.4/tasty-core_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.6.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.6.0-scala-1/scala-asm-9.6.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.6.0-scala-1/scala-asm-9.6.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.9.6"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.25.1"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.25.1/jline-reader-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.25.1/jline-reader-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.25.1"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.25.1/jline-terminal-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.25.1/jline-terminal-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jna","revision":"3.25.1"},"artifacts":[[{"name":"jline-terminal-jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.25.1/jline-terminal-jna-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.25.1/jline-terminal-jna-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.9.8"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.8/util-interface-1.9.8.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.8/util-interface-1.9.8.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.25.1"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.25.1/jline-native-3.25.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.25.1/jline-native-3.25.1.jar","second":0}]],"evicted":false},{"module":{"organization":"net.java.dev.jna","name":"jna","revision":"5.14.0"},"artifacts":[[{"name":"jna","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.3.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.4/scala3-library_3-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"2.13.14"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.14/scala-library-2.13.14.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.3.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.3.4/scala3-sbt-bridge-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.3.4/scala3-sbt-bridge-3.3.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.3.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.3.4/scala3-sbt-bridge-3.3.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.3.4/scala3-sbt-bridge-3.3.4.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/inputs new file mode 100644 index 000000000..457b7af49 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/inputs @@ -0,0 +1 @@ +1924290334 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output new file mode 100644 index 000000000..a09a77c53 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/inputs new file mode 100644 index 000000000..0951c467f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/inputs @@ -0,0 +1 @@ +-1230976928 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/output new file mode 100644 index 000000000..e31576e52 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/e/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","classifier":"tests","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11-tests.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs new file mode 100644 index 000000000..7621244b4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs @@ -0,0 +1 @@ +945513818 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output new file mode 100644 index 000000000..e0b68625d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs new file mode 100644 index 000000000..5cb75740c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs @@ -0,0 +1 @@ +780937949 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output new file mode 100644 index 000000000..8a6821d6f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/inputs new file mode 100644 index 000000000..3cf699ef7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/inputs @@ -0,0 +1 @@ +-1100481411 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/output new file mode 100644 index 000000000..23e17a8dc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/matrix/target/out/jvm/u/d/update/update_cache/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/build.sbt new file mode 100644 index 000000000..f620ed99c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/build.sbt @@ -0,0 +1,6 @@ +lazy val text19 = "org.apache.commons" % "commons-text" % "1.9" +lazy val text110 = "org.apache.commons" % "commons-text" % "1.10.0" +lazy val root = (project in file(".")).aggregate(a, b, c).settings(libraryDependencies += text19) +lazy val a = project.settings(libraryDependencies ++= Seq(text19, "junit" % "junit" % "4.13.2" % Test)) +lazy val b = project.settings(libraryDependencies ++= Seq(text110, "com.google.code.gson" % "gson" % "2.8.9")) +lazy val c = project.settings(libraryDependencies ++= Seq(text19, "org.apache.commons" % "commons-lang3" % "3.12.0")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output new file mode 100644 index 000000000..10ee8c70f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/a/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"junit","name":"junit","revision":"4.13.2"},"artifacts":[[{"name":"junit","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false},{"module":{"organization":"org.hamcrest","name":"hamcrest-core","revision":"1.3"},"artifacts":[[{"name":"hamcrest-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951292255"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output new file mode 100644 index 000000000..5e2631865 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/b/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.10.0"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951292263"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output new file mode 100644 index 000000000..aad8ec5d1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/c/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.12.0"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951292233"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output new file mode 100644 index 000000000..1fbea9bd0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/test-compile/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-text","revision":"1.9"},"artifacts":[[{"name":"commons-text","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.apache.commons","name":"commons-lang3","revision":"3.11"},"artifacts":[[{"name":"commons-lang3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{"resolveTime":-1,"downloadTime":-1,"downloadSize":-1,"cached":false,"stamp":"1790951292233"},"stamps":{}} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/build.sbt new file mode 100644 index 000000000..33679fd30 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/build.sbt @@ -0,0 +1,3 @@ +ThisBuild / scalaVersion := "3.8.4" +lazy val root = (project in file(".")).aggregate(xb) +lazy val xb = Project("x-build", file("xb")).settings(libraryDependencies += "com.google.code.gson" % "gson" % "2.8.9") diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs new file mode 100644 index 000000000..7621244b4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/inputs @@ -0,0 +1 @@ +945513818 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output new file mode 100644 index 000000000..e0b68625d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/root/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs new file mode 100644 index 000000000..36c7a48ec --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/inputs @@ -0,0 +1 @@ +-1540510717 \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output new file mode 100644 index 000000000..93e2b8528 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/2.0.9/x-build/target/out/jvm/scala-3.8.4/x-build/update/update_cache_3/output @@ -0,0 +1 @@ +{"cachedDescriptor":{"first":".","second":0},"configurations":[{"configuration":{"name":"compile"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"compile-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"docs"},"modules":[],"details":[]},{"configuration":{"name":"optional"},"modules":[],"details":[]},{"configuration":{"name":"plugin"},"modules":[],"details":[]},{"configuration":{"name":"pom"},"modules":[],"details":[]},{"configuration":{"name":"provided"},"modules":[],"details":[]},{"configuration":{"name":"runtime"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"runtime-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-doc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scaladoc_3","revision":"3.8.4"},"artifacts":[[{"name":"scaladoc_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scaladoc_3/3.8.4/scaladoc_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-tasty-inspector_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-tasty-inspector_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-tasty-inspector_3/3.8.4/scala3-tasty-inspector_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark","revision":"0.62.2"},"artifacts":[[{"name":"flexmark","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark/0.62.2/flexmark-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-ast","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-ast","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-ast/0.62.2/flexmark-util-ast-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-data","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-data","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-data/0.62.2/flexmark-util-data-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-html","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-html","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-html/0.62.2/flexmark-util-html-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-anchorlink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-anchorlink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-anchorlink/0.62.2/flexmark-ext-anchorlink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-autolink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-autolink/0.62.2/flexmark-ext-autolink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-emoji","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-emoji","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-emoji/0.62.2/flexmark-ext-emoji-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-strikethrough","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-strikethrough","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-strikethrough/0.62.2/flexmark-ext-gfm-strikethrough-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-gfm-tasklist","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-gfm-tasklist","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-gfm-tasklist/0.62.2/flexmark-ext-gfm-tasklist-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-wikilink","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-wikilink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-wikilink/0.62.2/flexmark-ext-wikilink-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-tables","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-tables","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-tables/0.62.2/flexmark-ext-tables-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-yaml-front-matter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-yaml-front-matter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-yaml-front-matter/0.62.2/flexmark-ext-yaml-front-matter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"nl.big-o","name":"liqp","revision":"0.8.2"},"artifacts":[[{"name":"liqp","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/nl/big-o/liqp/0.8.2/liqp-0.8.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jsoup","name":"jsoup","revision":"1.17.2"},"artifacts":[[{"name":"jsoup","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jsoup/jsoup/1.17.2/jsoup-1.17.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.dataformat","name":"jackson-dataformat-yaml","revision":"3.1.2"},"artifacts":[[{"name":"jackson-dataformat-yaml","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/dataformat/jackson-dataformat-yaml/3.1.2/jackson-dataformat-yaml-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-builder","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-builder","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-builder/0.62.2/flexmark-util-builder-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-collection","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-collection","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-collection/0.62.2/flexmark-util-collection-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-dependency","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-dependency","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-dependency/0.62.2/flexmark-util-dependency-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-format","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-format","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-format/0.62.2/flexmark-util-format-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-misc","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-misc","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-misc/0.62.2/flexmark-util-misc-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-sequence","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-sequence","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-sequence/0.62.2/flexmark-util-sequence-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-visitor","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-visitor","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-visitor/0.62.2/flexmark-util-visitor-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jetbrains","name":"annotations","revision":"15.0"},"artifacts":[[{"name":"annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/15.0/annotations-15.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util/0.62.2/flexmark-util-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.nibor.autolink","name":"autolink","revision":"0.6.0"},"artifacts":[[{"name":"autolink","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/nibor/autolink/autolink/0.6.0/autolink-0.6.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-jira-converter","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-jira-converter","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-jira-converter/0.62.2/flexmark-jira-converter-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.antlr","name":"antlr4-runtime","revision":"4.7.2"},"artifacts":[[{"name":"antlr4-runtime","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-annotations","revision":"2.21"},"artifacts":[[{"name":"jackson-annotations","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-core","revision":"2.12.1"},"artifacts":[[{"name":"jackson-core","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.12.1/jackson-core-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.core","name":"jackson-databind","revision":"2.12.1"},"artifacts":[[{"name":"jackson-databind","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.12.1/jackson-databind-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.fasterxml.jackson.datatype","name":"jackson-datatype-jsr310","revision":"2.12.1"},"artifacts":[[{"name":"jackson-datatype-jsr310","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.1/jackson-datatype-jsr310-2.12.1.jar","second":0}]],"evicted":false},{"module":{"organization":"ua.co.k","name":"strftime4j","revision":"1.0.5"},"artifacts":[[{"name":"strftime4j","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/ua/co/k/strftime4j/1.0.5/strftime4j-1.0.5.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-core","revision":"3.1.2"},"artifacts":[[{"name":"jackson-core","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-core/3.1.2/jackson-core-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"tools.jackson.core","name":"jackson-databind","revision":"3.1.2"},"artifacts":[[{"name":"jackson-databind","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/tools/jackson/core/jackson-databind/3.1.2/jackson-databind-3.1.2.jar","second":0}]],"evicted":false},{"module":{"organization":"org.snakeyaml","name":"snakeyaml-engine","revision":"3.0.1"},"artifacts":[[{"name":"snakeyaml-engine","type":"bundle","extension":"jar","url":"https://repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/snakeyaml/snakeyaml-engine/3.0.1/snakeyaml-engine-3.0.1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-util-options","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-util-options","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-util-options/0.62.2/flexmark-util-options-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-ins","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-ins","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-ins/0.62.2/flexmark-ext-ins-0.62.2.jar","second":0}]],"evicted":false},{"module":{"organization":"com.vladsch.flexmark","name":"flexmark-ext-superscript","revision":"0.62.2"},"artifacts":[[{"name":"flexmark-ext-superscript","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/vladsch/flexmark/flexmark-ext-superscript/0.62.2/flexmark-ext-superscript-0.62.2.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-repl-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"scala-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"sources"},"modules":[],"details":[]},{"configuration":{"name":"test"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"test-internal"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"com.google.code.gson","name":"gson","revision":"2.8.9"},"artifacts":[[{"name":"gson","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false}],"details":[]},{"configuration":{"name":"zinc-tool"},"modules":[{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-sbt-bridge","revision":"3.8.4"},"artifacts":[[{"name":"scala3-sbt-bridge","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-sbt-bridge/3.8.4/scala3-sbt-bridge-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-compiler_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-compiler_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-compiler_3/3.8.4/scala3-compiler_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-repl_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-repl_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-repl_3/3.8.4/scala3-repl_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-interfaces","revision":"3.8.4"},"artifacts":[[{"name":"scala3-interfaces","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-interfaces/3.8.4/scala3-interfaces-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"tasty-core_3","revision":"3.8.4"},"artifacts":[[{"name":"tasty-core_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/tasty-core_3/3.8.4/tasty-core_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala3-library_3","revision":"3.8.4"},"artifacts":[[{"name":"scala3-library_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.8.4/scala3-library_3-3.8.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang.modules","name":"scala-asm","revision":"9.9.0-scala-1"},"artifacts":[[{"name":"scala-asm","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"compiler-interface","revision":"1.10.7"},"artifacts":[[{"name":"compiler-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-reader","revision":"3.29.0"},"artifacts":[[{"name":"jline-reader","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.29.0/jline-reader-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.29.0/jline-terminal-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-terminal-jni","revision":"3.29.0"},"artifacts":[[{"name":"jline-terminal-jni","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.29.0/jline-terminal-jni-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"pprint_3","revision":"0.9.3"},"artifacts":[[{"name":"pprint_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/pprint_3/0.9.3/pprint_3-0.9.3.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"fansi_3","revision":"0.5.1"},"artifacts":[[{"name":"fansi_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/fansi_3/0.5.1/fansi_3-0.5.1.jar","second":0}]],"evicted":false},{"module":{"organization":"com.lihaoyi","name":"sourcecode_3","revision":"0.4.4"},"artifacts":[[{"name":"sourcecode_3","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lihaoyi/sourcecode_3/0.4.4/sourcecode_3-0.4.4.jar","second":0}]],"evicted":false},{"module":{"organization":"io.get-coursier","name":"interface","revision":"1.0.28"},"artifacts":[[{"name":"interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/interface/1.0.28/interface-1.0.28.jar","second":0}]],"evicted":false},{"module":{"organization":"org.virtuslab","name":"using_directives","revision":"1.1.4"},"artifacts":[[{"name":"using_directives","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/virtuslab/using_directives/1.1.4/using_directives-1.1.4.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-lang","name":"scala-library","revision":"3.8.4"},"artifacts":[[{"name":"scala-library","type":"jar","extension":"jar"},{"first":"file:///root/.sbt/boot/scala-3.8.4/lib/scala-library.jar","second":0}]],"evicted":false},{"module":{"organization":"org.scala-sbt","name":"util-interface","revision":"1.10.7"},"artifacts":[[{"name":"util-interface","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar","second":0}]],"evicted":false},{"module":{"organization":"org.jline","name":"jline-native","revision":"3.29.0"},"artifacts":[[{"name":"jline-native","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-native/3.29.0/jline-native-3.29.0.jar","second":0}]],"evicted":false},{"module":{"organization":"org.slf4j","name":"slf4j-api","revision":"1.7.36"},"artifacts":[[{"name":"slf4j-api","type":"jar","extension":"jar","url":"https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar"},{"first":"file:///root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar","second":0}]],"evicted":false}],"details":[]}],"stats":{},"stamps":{}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/README.md b/crates/socket-patch-core/tests/fixtures/sbt/evidence/README.md new file mode 100644 index 000000000..33471bbe2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/README.md @@ -0,0 +1,50 @@ +# sbt resolution evidence fixtures + +Real `target/` trees from the sbt scoping probe (docker, `eclipse-temurin:8` +for 0.13.18 / 1.2.8 / 1.3.13 and `:17` for 1.9.9 / 1.13.0 / 2.0.9), one +directory per sbt version: + +- `test-compile/` — after `sbt test:compile` (`Test/compile` on 1.x/2.x): + every configuration of every project resolved. +- `gson-bump/` — then `b`'s gson edited 2.8.9 → 2.10.1 and + `export b/compile:dependencyClasspath` run: only `b`'s files were rewritten. + +The build (`build.sbt`, identical in every directory) is a root aggregating +`a`, `b`, `c`: + +| project | dependencies | +|---|---| +| root | commons-text 1.9 | +| a | commons-text 1.9 (→ commons-lang3 3.11) + junit 4.13.2 % Test (→ hamcrest-core 1.3) | +| b | commons-text 1.10.0 + gson (b only) | +| c | commons-text 1.9 + commons-lang3 3.12.0 (evicts 3.11) | + +Only the files the evidence parser reads are kept: `build.sbt`, the Ivy XML +reports (`resolution-cache/reports/*.xml`) and each `update_cache*/output` +plus its sibling `inputs`. `project/build.properties` was written to name the +version. JSON update caches were minified and pruned to the fields the parser +reads (module coordinates, `evicted`/`evictedReason`, artifact +name/type/extension/classifier/url and the cached-file URI, `details`); the +0.13 update cache is binary sbinary and kept verbatim. Absolute paths +(`/work///…`, `/root/.cache/coursier/v1/…`, +`/root/.ivy2/cache/…`) are the container's. + +## L2 evidence probe scenarios + +These come from the L2 evidence probe (`docs/design/sbt-evidence-probe.md`). Each probe root was named `x` unless noted otherwise, so on sbt 2 the meta-build id is `x-build`: + +- `matrix/` (all six versions): a root aggregating three projects, after `update` then `+e/update`. + - `a`: commons-text 1.9. + - `d`: `crossPaths := false`, gson 2.8.9. + - `e`: cross-built, commons-lang3 3.11 plus its `tests` classifier. + - The meta-build records (`project/target/…`, sbt 2 `x-build`) are kept, except 0.13's binary one. +- `0.13.18/cross/` (root `x13`): `project e` then `+update`, with Scala 2.10 and 2.11 reports. +- `2.0.9/x-build/`: a user project `Project("x-build", file("xb"))` in root `x`, which shares the meta-build's record directory. +- `{1.9.9,2.0.9}/implicit-root/` (root `My_Proj.1`): no declared root project. +- `1.9.9/use-coursier-false/`: Ivy reports plus JSON, with artifacts in `~/.ivy2/cache`. +- `1.9.9/dependency-lock/`: the `build.sbt.lock` files that sbt-dependency-lock 1.5.1 wrote. No `target/` is kept. +- `scala-cli-1.17.1/directory/`: the Bloop project files of a scala-cli directory build. + - Main and `--test` files, written with the Bloop server. + - Pruned to `project.{name,directory,resolution}`. + +Ivy reports are minified: only the `ivy-report`, `info`, `module`, `revision` and `artifact` elements are kept, with the attributes the parser reads. The `docs`, `sources`, `pom`, `plugin` and `scala-tool` reports are dropped. diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196-test.json b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196-test.json new file mode 100644 index 000000000..017a07808 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196-test.json @@ -0,0 +1 @@ +{"version":"1.4.0","project":{"name":"sc-server_baeca91196-test","directory":"/sc-server/.scala-build","resolution":{"modules":[{"organization":"org.scala-lang","name":"scala3-library_3","version":"3.3.6","artifacts":[{"name":"scala3-library_3","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.6/scala3-library_3-3.3.6.jar"}]},{"organization":"junit","name":"junit","version":"4.13.2","artifacts":[{"name":"junit","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"}]},{"organization":"org.apache.commons","name":"commons-text","version":"1.9","artifacts":[{"name":"commons-text","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"}]},{"organization":"com.google.code.gson","name":"gson","version":"2.8.9","artifacts":[{"name":"gson","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"}]},{"organization":"org.scala-lang","name":"scala-library","version":"2.13.16","artifacts":[{"name":"scala-library","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.16/scala-library-2.13.16.jar"}]},{"organization":"org.hamcrest","name":"hamcrest-core","version":"1.3","artifacts":[{"name":"hamcrest-core","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"}]},{"organization":"org.apache.commons","name":"commons-lang3","version":"3.11","artifacts":[{"name":"commons-lang3","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"}]}]},"test":{}}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196.json b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196.json new file mode 100644 index 000000000..07a0eb4b2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/.scala-build/.bloop/sc-server_baeca91196.json @@ -0,0 +1 @@ +{"version":"1.4.0","project":{"name":"sc-server_baeca91196","directory":"/sc-server/.scala-build","resolution":{"modules":[{"organization":"org.scala-lang","name":"scala3-library_3","version":"3.3.6","artifacts":[{"name":"scala3-library_3","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.6/scala3-library_3-3.3.6.jar"}]},{"organization":"org.apache.commons","name":"commons-text","version":"1.9","artifacts":[{"name":"commons-text","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar"}]},{"organization":"com.google.code.gson","name":"gson","version":"2.8.9","artifacts":[{"name":"gson","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"}]},{"organization":"org.scala-lang","name":"scala-library","version":"2.13.16","artifacts":[{"name":"scala-library","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.16/scala-library-2.13.16.jar"}]},{"organization":"org.apache.commons","name":"commons-lang3","version":"3.11","artifacts":[{"name":"commons-lang3","path":"/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar"}]}]}}} \ No newline at end of file diff --git a/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/project.scala b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/project.scala new file mode 100644 index 000000000..0dd23308a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/evidence/scala-cli-1.17.1/directory/project.scala @@ -0,0 +1,4 @@ +//> using scala 3.3.6 +//> using dep org.apache.commons:commons-text:1.9 +//> using dep com.google.code.gson:gson:2.8.9 +//> using test.dep junit:junit:4.13.2 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-1pin.sbt new file mode 100644 index 000000000..bea2078d0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-1pin.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +socketPatchHostedRows in Global := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +onLoad in Global := (onLoad in Global).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(SettingKey[Seq[(String, String, String, String, String, String)]](k) in Global).getOrElse(Nil)) + if (x.getOpt(socketPatchHostedApplied in Global).isDefined) s + else x.append((socketPatchHostedApplied in Global := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](update in p := socketPatchHostedVerify(p.project, pins, (allDependencies in p).value, (update in p).value), externalResolvers in p := { val (ours, rest) = (externalResolvers in p).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-2pin.sbt new file mode 100644 index 000000000..aa8abacad --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-013-2pin.sbt @@ -0,0 +1,68 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +socketPatchHostedRows in Global := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +onLoad in Global := (onLoad in Global).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(SettingKey[Seq[(String, String, String, String, String, String)]](k) in Global).getOrElse(Nil)) + if (x.getOpt(socketPatchHostedApplied in Global).isDefined) s + else x.append((socketPatchHostedApplied in Global := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](update in p := socketPatchHostedVerify(p.project, pins, (allDependencies in p).value, (update in p).value), externalResolvers in p := { val (ours, rest) = (externalResolvers in p).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-1pin.sbt new file mode 100644 index 000000000..c3caedb38 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-1pin.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-2pin.sbt new file mode 100644 index 000000000..518f0095f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-1-2pin.sbt @@ -0,0 +1,68 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-1pin.sbt new file mode 100644 index 000000000..eca651c34 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-1pin.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-2pin.sbt new file mode 100644 index 000000000..dde64fb86 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/hosted-2-2pin.sbt @@ -0,0 +1,68 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "https://localhost:8443/patch-registry/maven/good/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "https://localhost:8443/patch-registry/maven/good/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-1pin.sbt new file mode 100644 index 000000000..feb107632 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-1pin.sbt @@ -0,0 +1,64 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +socketPatchVendorRows in Global := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +onLoad in Global := (onLoad in Global).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(SettingKey[Seq[(String, String, String, String, String, String)]](k) in Global).getOrElse(Nil)) + if (x.getOpt(socketPatchVendorApplied in Global).isDefined) s + else x.append((socketPatchVendorApplied in Global := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](update in p := socketPatchVendorVerify(p.project, pins, (allDependencies in p).value, (update in p).value), externalResolvers in p := { val (ours, rest) = (externalResolvers in p).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-2pin.sbt new file mode 100644 index 000000000..d3ad0ca88 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-013-2pin.sbt @@ -0,0 +1,67 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", ""), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +socketPatchVendorRows in Global := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +onLoad in Global := (onLoad in Global).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(SettingKey[Seq[(String, String, String, String, String, String)]](k) in Global).getOrElse(Nil)) + if (x.getOpt(socketPatchVendorApplied in Global).isDefined) s + else x.append((socketPatchVendorApplied in Global := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](update in p := socketPatchVendorVerify(p.project, pins, (allDependencies in p).value, (update in p).value), externalResolvers in p := { val (ours, rest) = (externalResolvers in p).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-1pin.sbt new file mode 100644 index 000000000..0fc989b1d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-1pin.sbt @@ -0,0 +1,64 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-2pin.sbt new file mode 100644 index 000000000..d1a53c4d7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-1-2pin.sbt @@ -0,0 +1,67 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", ""), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-1pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-1pin.sbt new file mode 100644 index 000000000..cd3683a1f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-1pin.sbt @@ -0,0 +1,64 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-2pin.sbt b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-2pin.sbt new file mode 100644 index 000000000..23070531d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/owned_file/vendored-2-2pin.sbt @@ -0,0 +1,67 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "769677b191e5c2d2b1a616d8ae779909f1008955758ddfb3414c4b007154b237", ""), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "60588301ab3c82c261151a35fad5e547a635e0e5b90985f4c2a668e5cea0ac2e", "") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=4e5f6a7b +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-warnings.json new file mode 100644 index 000000000..83e343306 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_overrides_assignment" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/build.sbt new file mode 100644 index 000000000..35466698e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/build.sbt @@ -0,0 +1,10 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) + +dependencyOverrides := Seq.empty diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/resolution.json new file mode 100644 index 000000000..4e9ff2661 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/assignment-after-wiring/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/basic/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-warnings.json new file mode 100644 index 000000000..dfefab659 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/expected-warnings.json @@ -0,0 +1,4 @@ +[ + "redirect_maven_no_pom", + "redirect_sbt_build_root_unknown" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/build-root-unknown/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-warnings.json new file mode 100644 index 000000000..fd085932e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_classifier_unsupported" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/resolution.json new file mode 100644 index 000000000..f100fa199 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/classifier/resolution.json @@ -0,0 +1,60 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + [ + "tests" + ] + ] + ], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-confirmation.json new file mode 100644 index 000000000..eafcf0440 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-confirmation.json @@ -0,0 +1,7 @@ +{ + "confirmed": [ + "12345678-0000-4000-8000-000000000002", + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-edits.json new file mode 100644 index 000000000..eb5c7982a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-text", + "new": { + "uuid": "12345678-0000-4000-8000-000000000002", + "version": "1.9-socket.12345678" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected/socket-patch.sbt new file mode 100644 index 000000000..eb2f4ce72 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/expected/socket-patch.sbt @@ -0,0 +1,68 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/build.sbt new file mode 100644 index 000000000..b07129898 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11", + "org.apache.commons" % "commons-text" % "1.9" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/socket-patch.sbt new file mode 100644 index 000000000..fd50308d0 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/overrides.json new file mode 100644 index 000000000..b7f334977 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/overrides.json @@ -0,0 +1,50 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + }, + { + "ecosystem": "maven", + "name": "commons-text", + "namespace": "org.apache.commons", + "version": "1.9", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "12345678-0000-4000-8000-000000000002", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-text/1.9/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/commons-text-1.9-socket.12345678.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2", + "identifiers": { + "name": "org.apache.commons/commons-text", + "version": "1.9", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-text", + "mavenSuffixedVersion": "1.9-socket.12345678", + "mavenPomSha256": "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2" + } + }, + "integrity": { + "sha256": "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/resolution.json new file mode 100644 index 000000000..86ac69fdf --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crlf/resolution.json @@ -0,0 +1,75 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ], + [ + [ + "org.apache.commons", + "commons-text" + ], + { + "1.9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ], + [ + [ + "org.apache.commons", + "commons-text", + "1.9" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ], + [ + "org.apache.commons", + "commons-text" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/build.sbt new file mode 100644 index 000000000..7ca273a27 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) +crossPaths := false diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/project/build.properties new file mode 100644 index 000000000..e0a1aa023 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.13.0 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/crosspaths-false/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-warnings.json new file mode 100644 index 000000000..3729c7704 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_pin_declared_newer" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/build.sbt new file mode 100644 index 000000000..096813262 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.12.0" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/resolution.json new file mode 100644 index 000000000..1f5b145ec --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/declared-newer-after-wiring/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "ffff0000", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-warnings.json new file mode 100644 index 000000000..48fb2c675 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_dependency_lock_present" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/build.sbt.lock b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/build.sbt.lock new file mode 100644 index 000000000..e69de29bb diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/dependency-lock/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-warnings.json new file mode 100644 index 000000000..a9f62008f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_owned_file_foreign" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/socket-patch.sbt new file mode 100644 index 000000000..35345d3d5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/input/socket-patch.sbt @@ -0,0 +1,2 @@ +// my own settings +ThisBuild / version := "1.0" diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/foreign-owned-file/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-warnings.json new file mode 100644 index 000000000..f2b63dea7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_resolution_incomplete" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/build.sbt new file mode 100644 index 000000000..93a42efc3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) +lazy val core = project.in(file("core")) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/resolution.json new file mode 100644 index 000000000..c3ad95c24 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/incomplete-evidence/resolution.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + ".", + "core" + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected/socket-patch.sbt new file mode 100644 index 000000000..12c0b4c72 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +socketPatchHostedRows in Global := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +onLoad in Global := (onLoad in Global).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(SettingKey[Seq[(String, String, String, String, String, String)]](k) in Global).getOrElse(Nil)) + if (x.getOpt(socketPatchHostedApplied in Global).isDefined) s + else x.append((socketPatchHostedApplied in Global := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](update in p := socketPatchHostedVerify(p.project, pins, (allDependencies in p).value, (update in p).value), externalResolvers in p := { val (ours, rest) = (externalResolvers in p).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/project/build.properties new file mode 100644 index 000000000..8e682c526 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.18 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/resolution.json new file mode 100644 index 000000000..10ca2f2d1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/ivy-evidence-0.13/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/restore.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/restore.json new file mode 100644 index 000000000..99610e7fb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/last-pin-removed/restore.json @@ -0,0 +1,6 @@ +[ + { + "purl": "pkg:maven/org.apache.commons/commons-lang3@3.11", + "uuid": "abcdef12-0000-4000-8000-000000000001" + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-warnings.json new file mode 100644 index 000000000..2c8a75ce5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_meta_build_only" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/build.sbt new file mode 100644 index 000000000..5c11ebabf --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-text" % "1.9" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/resolution.json new file mode 100644 index 000000000..17424a09f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/meta-build-only/resolution.json @@ -0,0 +1,55 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-text" + ], + { + "1.9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-text", + "1.9" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-text" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-confirmation.json new file mode 100644 index 000000000..c1620ff75 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-confirmation.json @@ -0,0 +1,4 @@ +{ + "confirmed": [], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-warnings.json new file mode 100644 index 000000000..c44a4bcf6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_mill_manual_snippet" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/input/.mill-version b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/input/.mill-version new file mode 100644 index 000000000..e69de29bb diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/input/build.mill b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/input/build.mill new file mode 100644 index 000000000..e69de29bb diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/mill-snippet/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-warnings.json new file mode 100644 index 000000000..7f21aaf12 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_missing_override" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/overrides.json new file mode 100644 index 000000000..9c8565eba --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/overrides.json @@ -0,0 +1,25 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-override/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-warnings.json new file mode 100644 index 000000000..6d89e388d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_integrity_missing" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/overrides.json new file mode 100644 index 000000000..56aefb2c8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/overrides.json @@ -0,0 +1,25 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/missing-pom-sha/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-warnings.json new file mode 100644 index 000000000..2c8af8334 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_no_resolution_evidence" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-doc-memory/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-warnings.json new file mode 100644 index 000000000..2c8af8334 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_no_resolution_evidence" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/resolution.json new file mode 100644 index 000000000..269525323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/no-evidence/resolution.json @@ -0,0 +1,13 @@ +{ + "v": 1, + "root": "/project", + "resolution": null, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/build.sbt new file mode 100644 index 000000000..5c11ebabf --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-text" % "1.9" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/resolution.json new file mode 100644 index 000000000..2782d2e70 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/not-resolved-silent/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-text" + ], + { + "1.9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-text", + "1.9" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-text" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-warnings.json new file mode 100644 index 000000000..bc9edbbe8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_override_build_repos" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/.sbtopts b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/.sbtopts new file mode 100644 index 000000000..74ec403f8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/.sbtopts @@ -0,0 +1 @@ +-Dsbt.override.build.repos=true diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-build-repos/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-confirmation.json new file mode 100644 index 000000000..ab064fa68 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-confirmation.json @@ -0,0 +1,7 @@ +{ + "confirmed": [], + "refused": [ + "0fedcba9-0000-4000-8000-000000000000", + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-warnings.json new file mode 100644 index 000000000..bb0b22160 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/expected-warnings.json @@ -0,0 +1,4 @@ +[ + "redirect_sbt_override_conflict", + "redirect_sbt_override_conflict" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/overrides.json new file mode 100644 index 000000000..cf941cbfb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/overrides.json @@ -0,0 +1,50 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + }, + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "0fedcba9-0000-4000-8000-000000000000", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/0fedcba9-0000-4000-8000-000000000000/commons-lang3-3.11-socket.0fedcba9.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/0fedcba9-0000-4000-8000-000000000000/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.0fedcba9", + "mavenPomSha256": "b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0" + } + }, + "integrity": { + "sha256": "c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/override-conflict/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-warnings.json new file mode 100644 index 000000000..83e343306 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_overrides_assignment" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/build.sbt new file mode 100644 index 000000000..0d3a9e87d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) +dependencyOverrides := Seq("org.apache.commons" % "commons-lang3" % "3.11") diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/overrides-assignment/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-warnings.json new file mode 100644 index 000000000..21c4a6aeb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_owned_file_modified" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/socket-patch.sbt new file mode 100644 index 000000000..1589dcbde --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch!: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/resolution.json new file mode 100644 index 000000000..4e9ff2661 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/owned-file-modified/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-edits.json new file mode 100644 index 000000000..93724ee25 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-edits.json @@ -0,0 +1,41 @@ +[ + { + "path": "pom.xml", + "kind": "redirect_maven_dep_version", + "action": "rewritten", + "key": "org.apache.commons:commons-lang3", + "original": "3.11", + "new": "3.11-socket.abcdef12" + }, + { + "path": "pom.xml", + "kind": "redirect_maven_repository", + "action": "added", + "key": "socket-patch-abcdef12-0000-4000-8000-000000000001", + "new": { + "id": "socket-patch-abcdef12-0000-4000-8000-000000000001", + "url": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2" + } + }, + { + "path": ".mvn/maven.config", + "kind": "redirect_maven_config", + "action": "added", + "key": "trustedChecksums" + }, + { + "path": ".mvn/checksums/checksums.sha256", + "kind": "redirect_maven_trusted_checksums", + "action": "added" + }, + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-warnings.json new file mode 100644 index 000000000..6da55c8a8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_maven_pom_ignored_sbt_build" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/checksums/checksums.sha256 b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/checksums/checksums.sha256 new file mode 100644 index 000000000..f284b645a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/checksums/checksums.sha256 @@ -0,0 +1,2 @@ +c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1 org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar +b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1 org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/maven.config b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/maven.config new file mode 100644 index 000000000..d3b91570d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/.mvn/maven.config @@ -0,0 +1,6 @@ +-Daether.artifactResolver.postProcessor.trustedChecksums=true +-Daether.artifactResolver.postProcessor.trustedChecksums.checksumAlgorithms=SHA-256 +-Daether.artifactResolver.postProcessor.trustedChecksums.failIfMissing=false +-Daether.trustedChecksumsSource.summaryFile=true +-Daether.trustedChecksumsSource.summaryFile.basedir=${session.rootDirectory}/.mvn/checksums +-Daether.trustedChecksumsSource.summaryFile.originAware=false diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/pom.xml b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/pom.xml new file mode 100644 index 000000000..472a35bb6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + dev.socket.test + app + 1.0.0 + + + org.apache.commons + commons-lang3 + 3.11-socket.abcdef12 + + + + + socket-patch-abcdef12-0000-4000-8000-000000000001 + https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2 + + true + fail + + + false + + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/pom.xml b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/pom.xml new file mode 100644 index 000000000..d46698114 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + dev.socket.test + app + 1.0.0 + + + org.apache.commons + commons-lang3 + 3.11 + + + diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/pom-also-present/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/overrides.json new file mode 100644 index 000000000..e489a25d9 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "sha256-B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1" + } + }, + "integrity": { + "sha256": "sha256:c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/prefixed-sha/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-warnings.json new file mode 100644 index 000000000..b81d6bfb5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_pin_unverifiable" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/resolution.json new file mode 100644 index 000000000..dcb67a3b7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump-stale/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": true, + "wiring_newer": false, + "deps_digest": "ffff0000", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-edits.json new file mode 100644 index 000000000..cd277f386 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-edits.json @@ -0,0 +1,14 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin_rechecked", + "action": "updated", + "key": "org.apache.commons:commons-lang3", + "original": { + "deps": "0a1b2c3d" + }, + "new": { + "deps": "ffff0000" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected/socket-patch.sbt new file mode 100644 index 000000000..fc1fa55c6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=ffff0000 +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/resolution.json new file mode 100644 index 000000000..1f5b145ec --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-after-dep-bump/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "ffff0000", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/resolution.json new file mode 100644 index 000000000..c7cb1dd6e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-before-update/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": true, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/resolution.json new file mode 100644 index 000000000..4e9ff2661 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/rerun-idempotent/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-warnings.json new file mode 100644 index 000000000..b878f839c --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_resolved_elsewhere" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/resolution.json new file mode 100644 index 000000000..bdbfad159 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolved-elsewhere/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/home/u/.ivy2/local/org.apache.commons/commons-lang3/3.11-socket.abcdef12/jars/commons-lang3.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-warnings.json new file mode 100644 index 000000000..9cee85407 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_resolvers_assignment" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/build.sbt new file mode 100644 index 000000000..1d075e994 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) +resolvers := Seq(Resolver.mavenCentral) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/resolvers-assignment/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected/socket-patch.sbt new file mode 100644 index 000000000..2afd305cb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/project/build.properties new file mode 100644 index 000000000..ddca111e1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.0.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/sbt2-evidence/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-confirmation.json new file mode 100644 index 000000000..c1620ff75 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-confirmation.json @@ -0,0 +1,4 @@ +{ + "confirmed": [], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-warnings.json new file mode 100644 index 000000000..24547c570 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_scala_cli_manual_snippet" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/input/project.scala b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/input/project.scala new file mode 100644 index 000000000..e69de29bb diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-cli-snippet/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-warnings.json new file mode 100644 index 000000000..fc98a2f2f --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_scala_runtime_unsupported" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/overrides.json new file mode 100644 index 000000000..16362344a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "scala-library", + "namespace": "org.scala-lang", + "version": "2.12.18", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.scala-lang/scala-library/2.12.18/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/scala-library-2.12.18-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.scala-lang/scala-library", + "version": "2.12.18", + "mavenGroupId": "org.scala-lang", + "mavenArtifactId": "scala-library", + "mavenSuffixedVersion": "2.12.18-socket.abcdef12", + "mavenPomSha256": "b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3" + } + }, + "integrity": { + "sha256": "c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/resolution.json new file mode 100644 index 000000000..02cc8cd60 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/scala-runtime/resolution.json @@ -0,0 +1,75 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ], + [ + [ + "org.scala-lang", + "scala-library" + ], + { + "2.12.18": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ], + [ + [ + "org.scala-lang", + "scala-library", + "2.12.18" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.18/scala-library-2.12.18.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ], + [ + "org.scala-lang", + "scala-library" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-warnings.json new file mode 100644 index 000000000..6573c39e4 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_override_shadowed" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/resolution.json new file mode 100644 index 000000000..acdb8ae1b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/shadowed-after-wiring/resolution.json @@ -0,0 +1,53 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ], + "3.11-socket.abcdef12": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.abcdef12" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-warnings.json new file mode 100644 index 000000000..9a29e6f32 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_resolution_stale" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/resolution.json new file mode 100644 index 000000000..076fbb2c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/stale-evidence/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": true, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-confirmation.json new file mode 100644 index 000000000..eafcf0440 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-confirmation.json @@ -0,0 +1,7 @@ +{ + "confirmed": [ + "12345678-0000-4000-8000-000000000002", + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-edits.json new file mode 100644 index 000000000..cf1e7c3f1 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-edits.json @@ -0,0 +1,22 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + }, + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-text", + "new": { + "uuid": "12345678-0000-4000-8000-000000000002", + "version": "1.9-socket.12345678" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected/socket-patch.sbt new file mode 100644 index 000000000..4f2f496b6 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/expected/socket-patch.sbt @@ -0,0 +1,68 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12", // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/build.sbt new file mode 100644 index 000000000..6bfe5b3d5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11", + "org.apache.commons" % "commons-text" % "1.9" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/overrides.json new file mode 100644 index 000000000..b7f334977 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/overrides.json @@ -0,0 +1,50 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + }, + { + "ecosystem": "maven", + "name": "commons-text", + "namespace": "org.apache.commons", + "version": "1.9", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "12345678-0000-4000-8000-000000000002", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-text/1.9/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/commons-text-1.9-socket.12345678.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2", + "identifiers": { + "name": "org.apache.commons/commons-text", + "version": "1.9", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-text", + "mavenSuffixedVersion": "1.9-socket.12345678", + "mavenPomSha256": "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2" + } + }, + "integrity": { + "sha256": "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/resolution.json new file mode 100644 index 000000000..e8d4e33f5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/two-patches/resolution.json @@ -0,0 +1,75 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ], + [ + [ + "org.apache.commons", + "commons-text" + ], + { + "1.9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ], + [ + [ + "org.apache.commons", + "commons-text", + "1.9" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ], + [ + "org.apache.commons", + "commons-text" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-warnings.json new file mode 100644 index 000000000..92900f907 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_unsafe_value" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/overrides.json new file mode 100644 index 000000000..b04fcc577 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2?x=1", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsafe-url/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-warnings.json new file mode 100644 index 000000000..fbfd88c55 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_unsupported_version" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/project/build.properties new file mode 100644 index 000000000..133a8f197 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.17 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/unsupported-version/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-edits.json new file mode 100644 index 000000000..afd68a46e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-edits.json @@ -0,0 +1,16 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin_updated", + "action": "updated", + "key": "org.apache.commons:commons-lang3", + "original": { + "uuid": "0fedcba9-0000-4000-8000-000000000000", + "version": "3.11-socket.0fedcba9" + }, + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-warnings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected-warnings.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected/socket-patch.sbt new file mode 100644 index 000000000..5a380260b --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/socket-patch.sbt new file mode 100644 index 000000000..2207160bb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/input/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.0fedcba9", "org/apache/commons/commons-lang3/3.11-socket.0fedcba9/commons-lang3-3.11-socket.0fedcba9.pom", "b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/0fedcba9-0000-4000-8000-000000000000/maven2/org/apache/commons/commons-lang3/3.11-socket.0fedcba9/commons-lang3-3.11-socket.0fedcba9.pom"), // socket-patch 0fedcba9-0000-4000-8000-000000000000 + ("org.apache.commons", "commons-lang3", "3.11-socket.0fedcba9", "org/apache/commons/commons-lang3/3.11-socket.0fedcba9/commons-lang3-3.11-socket.0fedcba9.jar", "c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/0fedcba9-0000-4000-8000-000000000000/maven2/org/apache/commons/commons-lang3/3.11-socket.0fedcba9/commons-lang3-3.11-socket.0fedcba9.jar") // socket-patch 0fedcba9-0000-4000-8000-000000000000 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.0fedcba9" // socket-patch 0fedcba9-0000-4000-8000-000000000000 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/resolution.json new file mode 100644 index 000000000..db5eec3b2 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/update-same-ga/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11-socket.0fedcba9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11-socket.0fedcba9" + ], + [ + "/project/.socket/sbt-hosted/maven2/org/apache/commons/commons-lang3/3.11-socket.0fedcba9/commons-lang3-3.11-socket.0fedcba9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-confirmation.json new file mode 100644 index 000000000..1798d1006 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-confirmation.json @@ -0,0 +1,8 @@ +{ + "confirmed": [ + "12345678-0000-4000-8000-000000000002" + ], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-edits.json new file mode 100644 index 000000000..eb5c7982a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-text", + "new": { + "uuid": "12345678-0000-4000-8000-000000000002", + "version": "1.9-socket.12345678" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-warnings.json new file mode 100644 index 000000000..d3ff938ca --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_vendored_conflict" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected/socket-patch.sbt new file mode 100644 index 000000000..f7093b6e8 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom", "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.pom"), // socket-patch 12345678-0000-4000-8000-000000000002 + ("org.apache.commons", "commons-text", "1.9-socket.12345678", "org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar", "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2/org/apache/commons/commons-text/1.9-socket.12345678/commons-text-1.9-socket.12345678.jar") // socket-patch 12345678-0000-4000-8000-000000000002 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-text" % "1.9-socket.12345678" // socket-patch 12345678-0000-4000-8000-000000000002 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/build.sbt new file mode 100644 index 000000000..6bfe5b3d5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11", + "org.apache.commons" % "commons-text" % "1.9" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/socket-patch-vendor.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/socket-patch-vendor.sbt new file mode 100644 index 000000000..0fc989b1d --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/input/socket-patch-vendor.sbt @@ -0,0 +1,64 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/overrides.json new file mode 100644 index 000000000..b7f334977 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/overrides.json @@ -0,0 +1,50 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + }, + { + "ecosystem": "maven", + "name": "commons-text", + "namespace": "org.apache.commons", + "version": "1.9", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "12345678-0000-4000-8000-000000000002", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-text/1.9/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/commons-text-1.9-socket.12345678.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/12345678-0000-4000-8000-000000000002/maven2", + "identifiers": { + "name": "org.apache.commons/commons-text", + "version": "1.9", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-text", + "mavenSuffixedVersion": "1.9-socket.12345678", + "mavenPomSha256": "b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2" + } + }, + "integrity": { + "sha256": "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/resolution.json new file mode 100644 index 000000000..e8d4e33f5 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-conflict/resolution.json @@ -0,0 +1,75 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ], + [ + [ + "org.apache.commons", + "commons-text" + ], + { + "1.9": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ], + [ + [ + "org.apache.commons", + "commons-text", + "1.9" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-text/1.9/commons-text-1.9.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ], + [ + "org.apache.commons", + "commons-text" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-warnings.json new file mode 100644 index 000000000..d3ff938ca --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_vendored_conflict" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/socket-patch-vendor.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/socket-patch-vendor.sbt new file mode 100644 index 000000000..ab61c9961 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/input/socket-patch-vendor.sbt @@ -0,0 +1,64 @@ +// Generated by socket-patch. Edited; re-run `socket-patch vendor`. +val socketPatchVendorPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b883c974d2b1e818d95e597c6c0c48ac79bd8bef5d148c2a55e503b061431f7f", ""), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "9a89cb5d42d1007bdf1c8fcaa621088adea13d4bb3ee3880c30eda55459b2940", "") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchVendorRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchVendorRows") +val socketPatchVendorApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchVendorFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch vendor`.") +def socketPatchVendorSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchVendorNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchVendorVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchVendorNewer(d.revision, base)) socketPatchVendorFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchVendorFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchVendorSha256(f) + if (!mine.exists(_._5 == got)) socketPatchVendorFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchVendorRows := socketPatchVendorPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/vendor/maven2").getCanonicalFile + socketPatchVendorPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchVendorSha256(f) != want) { + if (src.isEmpty) socketPatchVendorFail(if (f.isFile) "" + f + " has sha256 " + socketPatchVendorSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchVendorFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchVendorSha256(tmp) + if (got != want) socketPatchVendorFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch-vendor" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchVendorApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchVendorApplied := true) +: x.structure.allProjectRefs.flatMap(p => Seq[Def.Setting[_]](p / update := socketPatchVendorVerify(p.project, pins, (p / allDependencies).value, (p / update).value), p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest })), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/vendored-unparsable/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-confirmation.json new file mode 100644 index 000000000..83cd8c932 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [], + "refused": [ + "abcdef12-0000-4000-8000-000000000001" + ] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-edits.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-edits.json @@ -0,0 +1 @@ +[] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-warnings.json new file mode 100644 index 000000000..a7453c4fc --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_version_conflict" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/project/build.properties new file mode 100644 index 000000000..04267b14a --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.9 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/resolution.json new file mode 100644 index 000000000..de7d8c9de --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-conflict/resolution.json @@ -0,0 +1,63 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ], + "3.12.0": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ], + [ + [ + "org.apache.commons", + "commons-lang3", + "3.12.0" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-confirmation.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-confirmation.json new file mode 100644 index 000000000..b27712d64 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-confirmation.json @@ -0,0 +1,6 @@ +{ + "confirmed": [ + "abcdef12-0000-4000-8000-000000000001" + ], + "refused": [] +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-edits.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-edits.json new file mode 100644 index 000000000..52b6b2db7 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-edits.json @@ -0,0 +1,12 @@ +[ + { + "path": "socket-patch.sbt", + "kind": "redirect_sbt_pin", + "action": "added", + "key": "org.apache.commons:commons-lang3", + "new": { + "uuid": "abcdef12-0000-4000-8000-000000000001", + "version": "3.11-socket.abcdef12" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-warnings.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-warnings.json new file mode 100644 index 000000000..4c143cf1e --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected-warnings.json @@ -0,0 +1,3 @@ +[ + "redirect_sbt_version_untested" +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected/socket-patch.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected/socket-patch.sbt new file mode 100644 index 000000000..2afd305cb --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/expected/socket-patch.sbt @@ -0,0 +1,65 @@ +// Generated by socket-patch. Do not edit; re-run `socket-patch get`. +val socketPatchHostedPins = Seq[(String, String, String, String, String, String)]( + // (group, artifact, socket version, repo-relative path, sha256, source URL; "" = vendored) + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom", "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.pom"), // socket-patch abcdef12-0000-4000-8000-000000000001 + ("org.apache.commons", "commons-lang3", "3.11-socket.abcdef12", "org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar", "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1", "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2/org/apache/commons/commons-lang3/3.11-socket.abcdef12/commons-lang3-3.11-socket.abcdef12.jar") // socket-patch abcdef12-0000-4000-8000-000000000001 +) +val socketPatchHostedRows = SettingKey[Seq[(String, String, String, String, String, String)]]("socketPatchHostedRows") +val socketPatchHostedApplied = SettingKey[Boolean]("socketPatchApplied") +def socketPatchHostedFail(m: String): Nothing = sys.error("socket-patch: " + m + ". Re-run `socket-patch get`.") +def socketPatchHostedSha256(f: java.io.File): String = java.security.MessageDigest.getInstance("SHA-256") + .digest(java.nio.file.Files.readAllBytes(f.toPath)).map(b => "%02x".format(b & 0xff)).mkString +def socketPatchHostedNewer(v: String, base: String): Boolean = { + def nums(s: String): Seq[BigInt] = "^[0-9]+(\\.[0-9]+)*".r.findFirstIn(s.trim).toSeq.flatMap(_.split('.')).map(n => BigInt(n)) + nums(v).zipAll(nums(base), BigInt(0), BigInt(0)).find(t => t._1 != t._2).exists(t => t._1 > t._2) +} +def socketPatchHostedVerify(p: String, pins: Seq[(String, String, String, String, String, String)], deps: Seq[ModuleID], r: UpdateReport): UpdateReport = { + deps.foreach { d => pins.find(x => x._1 == d.organization && (x._2 == d.name || x._2.startsWith(d.name + "_"))).foreach { case (g, a, sv, _, _, _) => + val base = sv.substring(0, sv.lastIndexOf("-socket.")) + if (!d.revision.exists(c => "+[](),".indexOf(c) >= 0) && !d.revision.startsWith("latest.") && socketPatchHostedNewer(d.revision, base)) socketPatchHostedFail(p + " declares " + g + ":" + a + ":" + d.revision + " but socket-patch forces " + sv + " (a downgrade); roll the patch back, or declare " + base) + } } + r.configurations.foreach { c => c.modules.filter(!_.evicted).foreach { m => + val mine = pins.filter(x => x._1 == m.module.organization && x._2 == m.module.name) + mine.headOption.foreach { case (g, a, sv, _, _, _) => + if (m.module.revision != sv) socketPatchHostedFail(p + " resolves " + g + ":" + a + ":" + m.module.revision + ", expected " + sv + "; a dependencyOverrides := or resolver change in the build replaced socket-patch's") + m.artifacts.foreach { case (_, f) => + val got = socketPatchHostedSha256(f) + if (!mine.exists(_._5 == got)) socketPatchHostedFail(g + ":" + a + ":" + sv + " resolved to " + f + " with sha256 " + got + ", which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update") + } + } + } } + r +} +Global / socketPatchHostedRows := socketPatchHostedPins +inThisBuild(Seq( + resolvers += { + val repo = new java.io.File(baseDirectory.value, ".socket/sbt-hosted/maven2").getCanonicalFile + val gitignore = new java.io.File(repo.getParentFile, ".gitignore"); if (!gitignore.isFile) { repo.mkdirs(); java.nio.file.Files.write(gitignore.toPath, "*\n".getBytes) } + socketPatchHostedPins.foreach { case (_, _, _, rel, want, src) => + val f = new java.io.File(repo, rel) + if (!f.isFile || socketPatchHostedSha256(f) != want) { + if (src.isEmpty) socketPatchHostedFail(if (f.isFile) "" + f + " has sha256 " + socketPatchHostedSha256(f) + ", pinned " + want else "missing " + f) + f.getParentFile.mkdirs() + val tmp = java.io.File.createTempFile("socket-patch", ".part", f.getParentFile) + try { + try { + val c = new java.net.URL(src).openConnection(); c.setConnectTimeout(30000); c.setReadTimeout(120000) + val in = c.getInputStream + try java.nio.file.Files.copy(in, tmp.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) finally in.close() + } catch { case e: java.io.IOException => socketPatchHostedFail("cannot download " + src + " (" + e + ")") } + val got = socketPatchHostedSha256(tmp) + if (got != want) socketPatchHostedFail("" + src + " served sha256 " + got + ", pinned " + want) + java.nio.file.Files.move(tmp.toPath, f.toPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING) + } finally tmp.delete() + } + } + "socket-patch" at repo.toURI.toString + }, + dependencyOverrides += "org.apache.commons" % "commons-lang3" % "3.11-socket.abcdef12" // socket-patch abcdef12-0000-4000-8000-000000000001 deps=0a1b2c3d +)) +Global / onLoad := (Global / onLoad).value andThen { s => + val x = Project.extract(s) + val pins = Seq("socketPatchHostedRows", "socketPatchVendorRows").flatMap(k => x.getOpt(Global / SettingKey[Seq[(String, String, String, String, String, String)]](k)).getOrElse(Nil)) + if (x.getOpt(Global / socketPatchHostedApplied).isDefined) s + else x.appendWithoutSession((Global / socketPatchHostedApplied := true) +: x.structure.allProjectRefs.map(p => p / update := Def.uncached(socketPatchHostedVerify(p.project, pins, (p / allDependencies).value, (p / update).value))), s) +} diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/build.sbt b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/build.sbt new file mode 100644 index 000000000..4f5c27193 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / scalaVersion := "2.12.18" + +lazy val root = (project in file(".")) + .settings( + libraryDependencies ++= Seq( + "org.apache.commons" % "commons-lang3" % "3.11" + ) + ) diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/project/build.properties b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/project/build.properties new file mode 100644 index 000000000..f1fd7cdf3 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/input/project/build.properties @@ -0,0 +1 @@ +sbt.version=2.1.0 diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/overrides.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/overrides.json new file mode 100644 index 000000000..790d51173 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/overrides.json @@ -0,0 +1,26 @@ +[ + { + "ecosystem": "maven", + "name": "commons-lang3", + "namespace": "org.apache.commons", + "version": "3.11", + "token": "11111111-1111-4111-8111-111111111111", + "patchUuid": "abcdef12-0000-4000-8000-000000000001", + "artifactUrl": "https://patch.socket.dev/patch/maven/org.apache.commons/commons-lang3/3.11/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/commons-lang3-3.11-socket.abcdef12.jar", + "registryOverride": { + "kind": "maven2", + "indexUrl": "https://patch.socket.dev/patch-registry/maven/11111111-1111-4111-8111-111111111111/abcdef12-0000-4000-8000-000000000001/maven2", + "identifiers": { + "name": "org.apache.commons/commons-lang3", + "version": "3.11", + "mavenGroupId": "org.apache.commons", + "mavenArtifactId": "commons-lang3", + "mavenSuffixedVersion": "3.11-socket.abcdef12", + "mavenPomSha256": "b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1" + } + }, + "integrity": { + "sha256": "c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1" + } + } +] diff --git a/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/resolution.json b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/resolution.json new file mode 100644 index 000000000..8933eb323 --- /dev/null +++ b/crates/socket-patch-core/tests/fixtures/sbt/redirect/version-untested/resolution.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "root": "/project", + "resolution": { + "modules": [ + [ + [ + "org.apache.commons", + "commons-lang3" + ], + { + "3.11": [ + "target/scala-2.12/update/update_cache_2.12/output:compile" + ] + } + ] + ], + "artifacts": [ + [ + [ + "org.apache.commons", + "commons-lang3", + "3.11" + ], + [ + "/home/u/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar" + ] + ] + ], + "classifiers": [], + "in_scope": [ + [ + "org.apache.commons", + "commons-lang3" + ] + ], + "projects_seen": [ + "." + ], + "meta_build": [] + }, + "declared": [ + "." + ], + "stale": false, + "wiring_newer": false, + "deps_digest": "0a1b2c3d", + "read_error": null, + "findings": {} +} diff --git a/crates/socket-patch-core/tests/redirect_sbt_golden.rs b/crates/socket-patch-core/tests/redirect_sbt_golden.rs new file mode 100644 index 000000000..c37b0b7a2 --- /dev/null +++ b/crates/socket-patch-core/tests/redirect_sbt_golden.rs @@ -0,0 +1,353 @@ +//! Golden cases for the hosted sbt rewriter (`patch::redirect::sbt`), over +//! `tests/fixtures/sbt/redirect//`: +//! +//! - `input/`: the project's candidate files (UTF-8 text; a presence-only +//! file such as `build.sbt.lock` or `build.mill` is an empty file, as the +//! engine reads it); +//! - `resolution.json` (optional): the [`ResolutionDoc`] the engine's IO +//! layer would distil from the build's `target/` evidence, carried under +//! `SBT_RESOLUTION_KEY` exactly as the engine does; +//! - `overrides.json`: the granted overrides; +//! - `expected/`: the files the run writes (absent = writes nothing); +//! - `expected-edits.json`, `expected-warnings.json` (codes, in order) and +//! `expected-confirmation.json` (`confirmed` / `refused` sbt uuids): all +//! three required, so a refusal case proves WHY nothing changed. +//! +//! A case with `restore.json` (`[{purl, uuid}]`) instead runs the upstream +//! restore over `input/` and expects `expected/` to be the whole restored +//! `socket-patch.sbt` (absent = deleted). +//! +//! Every wiring case that creates `socket-patch.sbt` is also restored: its +//! confirmed pins out again must delete the file (no other bytes changed). +//! +//! This harness is separate from the TS-authored `redirect_golden.rs`; the +//! depscan port of these cases is a follow-up. +//! +//! `SOCKET_PATCH_BLESS_SBT_GOLDEN=1` rewrites every case's expectations +//! from the current output (review the diff before committing). + +use std::collections::{BTreeMap, BTreeSet}; +use std::fs; +use std::path::{Path, PathBuf}; + +use socket_patch_core::formats::sbt::owned_file::HOSTED_FILE; +use socket_patch_core::patch::redirect::sbt::{ResolutionDoc, SBT_RESOLUTION_KEY}; +use socket_patch_core::patch::redirect::upstream::{restore_upstream, HostedPin, RestoreOptions}; +use socket_patch_core::patch::redirect::{rewrite_registry_redirect, DepOverride, RewriteResult}; + +fn root() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/sbt/redirect") +} + +fn bless() -> bool { + std::env::var_os("SOCKET_PATCH_BLESS_SBT_GOLDEN").is_some() +} + +fn tree(dir: &Path) -> BTreeMap { + let mut out = BTreeMap::new(); + if !dir.is_dir() { + return out; + } + for entry in walkdir::WalkDir::new(dir) + .into_iter() + .filter_map(Result::ok) + { + if entry.file_type().is_file() { + let rel = entry + .path() + .strip_prefix(dir) + .unwrap() + .to_string_lossy() + .replace('\\', "/"); + let text = fs::read_to_string(entry.path()).unwrap_or_else(|e| { + panic!("{}: inputs are UTF-8 only: {e}", entry.path().display()) + }); + out.insert(rel, text); + } + } + out +} + +fn write_tree(dir: &Path, files: &BTreeMap) { + let _ = fs::remove_dir_all(dir); + for (rel, text) in files { + let path = dir.join(rel); + fs::create_dir_all(path.parent().unwrap()).unwrap(); + fs::write(path, text).unwrap(); + } +} + +fn read_json(path: &Path) -> serde_json::Value { + serde_json::from_str( + &fs::read_to_string(path).unwrap_or_else(|e| panic!("{}: {e}", path.display())), + ) + .unwrap_or_else(|e| panic!("{}: {e}", path.display())) +} + +fn write_json(path: &Path, value: &serde_json::Value) { + fs::write( + path, + format!("{}\n", serde_json::to_string_pretty(value).unwrap()), + ) + .unwrap(); +} + +/// Assert (or, blessing, record) `got` as `case/`. +fn expect_json(case: &Path, name: &str, got: serde_json::Value) { + let path = case.join(name); + if bless() { + write_json(&path, &got); + return; + } + assert!(path.is_file(), "{}: missing {name}", case.display()); + assert_eq!(got, read_json(&path), "{}: {name} mismatch", case.display()); +} + +fn expect_tree(case: &Path, got: &BTreeMap) { + let dir = case.join("expected"); + if bless() { + let _ = fs::remove_dir_all(&dir); + if !got.is_empty() { + write_tree(&dir, got); + } + return; + } + let want = tree(&dir); + assert_eq!( + got.keys().collect::>(), + want.keys().collect::>(), + "{}: written-file set mismatch", + case.display() + ); + for (rel, text) in got { + assert_eq!( + text.as_str(), + want[rel].as_str(), + "{}: {rel} byte-mismatch", + case.display() + ); + } +} + +fn input_files(case: &Path) -> BTreeMap { + let mut files = tree(&case.join("input")); + let resolution = case.join("resolution.json"); + if resolution.is_file() { + // Through the typed document, so a fixture's resolution.json is + // checked against the contract the engine's IO layer writes. + let text = fs::read_to_string(&resolution).unwrap(); + let doc = ResolutionDoc::parse(&text) + .unwrap_or_else(|e| panic!("{}: bad resolution.json: {e}", case.display())); + files.insert(SBT_RESOLUTION_KEY.to_string(), doc.to_json()); + } + files +} + +fn run(case: &Path) -> (BTreeMap, RewriteResult) { + let files = input_files(case); + let overrides: Vec = + serde_json::from_value(read_json(&case.join("overrides.json"))) + .unwrap_or_else(|e| panic!("{}: bad overrides.json: {e}", case.display())); + let result = rewrite_registry_redirect(&files, &overrides); + (files, result) +} + +async fn restore(input: &BTreeMap, pins: &[HostedPin]) -> Option { + let tmp = tempfile::tempdir().unwrap(); + write_tree(tmp.path(), input); + let out = restore_upstream( + tmp.path(), + pins, + &RestoreOptions { + offline: true, + ..Default::default() + }, + ) + .await; + assert_eq!(out.refused().count(), 0, "restore refused: {:?}", out.pins); + let after = tree(tmp.path()); + for (rel, text) in input { + if rel != HOSTED_FILE { + assert_eq!(after.get(rel), Some(text), "restore touched {rel}"); + } + } + after.get(HOSTED_FILE).cloned() +} + +async fn run_restore_case(case: &Path) { + let input = tree(&case.join("input")); + let pins: Vec = read_json(&case.join("restore.json")) + .as_array() + .expect("restore.json is an array") + .iter() + .map(|p| HostedPin { + purl: p["purl"].as_str().unwrap().to_string(), + uuid: p["uuid"].as_str().unwrap().to_string(), + files: vec![HOSTED_FILE.to_string()], + }) + .collect(); + let left = restore(&input, &pins).await; + let got: BTreeMap = left + .into_iter() + .map(|t| (HOSTED_FILE.to_string(), t)) + .collect(); + expect_tree(case, &got); +} + +#[tokio::test] +async fn redirect_sbt_golden_cases_match() { + let mut cases: Vec = fs::read_dir(root()) + .unwrap() + .map(|e| e.unwrap().path()) + .filter(|p| p.join("input").is_dir()) + .collect(); + cases.sort(); + assert!( + bless() || cases.len() >= 42, + "sbt golden cases went missing: {cases:?}" + ); + for case in &cases { + if case.join("restore.json").is_file() { + run_restore_case(case).await; + continue; + } + let (files, result) = run(case); + assert!( + !result.files.keys().any(|k| k.starts_with(">(), + ) + .unwrap(), + ); + expect_json( + case, + "expected-confirmation.json", + serde_json::json!({ + "confirmed": result.confirmed_sbt_uuids, + "refused": result.refused_sbt_uuids, + }), + ); + // A confirmed uuid is never also refused. + assert!( + result + .confirmed_sbt_uuids + .intersection(&result.refused_sbt_uuids) + .next() + .is_none(), + "{}: a uuid is both confirmed and refused", + case.display() + ); + // Deterministic. + let again = rewrite_registry_redirect( + &files, + &serde_json::from_value::>(read_json(&case.join("overrides.json"))) + .unwrap(), + ); + assert_eq!( + again.files, + result.files, + "{}: non-deterministic", + case.display() + ); + + // Idempotent on its own output: re-run over the written file before + // `sbt update` (the evidence predates the wiring), nothing more is + // written or edited and the same uuids are confirmed. + if !result.files.is_empty() { + let mut wired = files.clone(); + wired.extend(result.files.clone()); + if let Some(text) = wired.get(SBT_RESOLUTION_KEY) { + let mut doc = ResolutionDoc::parse(text).unwrap(); + doc.wiring_newer = true; + wired.insert(SBT_RESOLUTION_KEY.to_string(), doc.to_json()); + } + let overrides: Vec = + serde_json::from_value(read_json(&case.join("overrides.json"))).unwrap(); + let rerun = rewrite_registry_redirect(&wired, &overrides); + assert!( + rerun.files.is_empty() && rerun.edits.is_empty(), + "{}: re-run over its own output changed {:?} / {:?}", + case.display(), + rerun.files.keys().collect::>(), + rerun.edits + ); + assert_eq!( + rerun.confirmed_sbt_uuids, + result.confirmed_sbt_uuids, + "{}: re-run confirms another set", + case.display() + ); + } + + // A run that created the file is undone by restoring its pins. + if let (None, Some(_)) = (files.get(HOSTED_FILE), result.files.get(HOSTED_FILE)) { + let mut wired = tree(&case.join("input")); + wired.extend(result.files.clone()); + let overrides: Vec = + serde_json::from_value(read_json(&case.join("overrides.json"))).unwrap(); + let pins: Vec = overrides + .iter() + .filter(|o| result.confirmed_sbt_uuids.contains(&o.patch_uuid)) + .map(|o| HostedPin { + purl: format!( + "pkg:maven/{}/{}@{}", + o.namespace.as_deref().unwrap_or_default(), + o.name, + o.version + ), + uuid: o.patch_uuid.clone(), + files: vec![HOSTED_FILE.to_string()], + }) + .collect(); + assert_eq!( + restore(&wired, &pins).await, + None, + "{}: restoring every pin must delete {HOSTED_FILE}", + case.display() + ); + } + } +} + +#[test] +fn every_case_ships_its_expectations() { + for entry in fs::read_dir(root()).unwrap() { + let case = entry.unwrap().path(); + if !case.join("input").is_dir() { + continue; + } + let names: BTreeSet<&str> = if case.join("restore.json").is_file() { + BTreeSet::from(["restore.json"]) + } else { + BTreeSet::from([ + "overrides.json", + "expected-edits.json", + "expected-warnings.json", + "expected-confirmation.json", + ]) + }; + for name in names { + assert!( + case.join(name).is_file(), + "{}: missing {name}", + case.display() + ); + } + } +} diff --git a/docs/design/maven-vendoring.md b/docs/design/maven-vendoring.md index 1d91baf3c..17368ca15 100644 --- a/docs/design/maven-vendoring.md +++ b/docs/design/maven-vendoring.md @@ -11,6 +11,12 @@ Gradle support without automatically migrating existing single-POM repositories. Hosted Gradle wiring is a separate backend; see [ecosystem support](../ecosystems.md#gradle). +sbt build roots and scala-cli directory builds use the same backend and ledger +ecosystem (`jvm`): sbt through a generated `socket-patch-vendor.sbt` over the +reactor-style suffixed `.socket/vendor/maven2` tree, scala-cli through owned +files over a same-GAV `.socket/vendor/coursier` tree. Mill is not wired. See +[sbt, Mill and scala-cli support](sbt-support.md). + ## Commands ```sh diff --git a/docs/design/sbt-evidence-probe.md b/docs/design/sbt-evidence-probe.md new file mode 100644 index 000000000..6f69148e9 --- /dev/null +++ b/docs/design/sbt-evidence-probe.md @@ -0,0 +1,45 @@ +# sbt evidence probe (lane L2, step 0) + +This probe checks the evidence shapes that `formats/sbt/evidence.rs` and +`crawlers/sbt_evidence.rs` parse but the scoping probe +(`docs/design/sbt-support.md`) had not yet exercised. It ran on 2026-10-02 +against sbt 0.13.18, 1.2.8 and 1.3.13 (`eclipse-temurin:8-jdk`) and 1.9.9, +1.13.0 and 2.0.9 (`eclipse-temurin:17-jdk`), each in its own container with +`docker run --rm -m 2g`, and against scala-cli 1.17.1 (`eclipse-temurin:17-jdk`). +The minified outputs are committed under +`crates/socket-patch-core/tests/fixtures/sbt/evidence///`; their +README describes the pruning. The scratch harness is not in the repository. + +The main build (`matrix/`) is a root `x` that aggregates three projects: + +- `a`: commons-text 1.9; +- `d`: `crossPaths := false` and `autoScalaLibrary := false`, with gson 2.8.9; +- `e`: `crossScalaVersions` 2.12/2.13 (2.10/2.11 on 0.13, 3.3.4/3.8.4 on sbt 2), + with commons-lang3 3.11 plus its `tests` classifier. + +It ran `update` and then `+e/update`. + +## Results + +| Case | Result | Code consequence | +|---|---|---| +| `crossPaths := false` | 1.3+ writes `

/target/update/update_cache/output`. 0.13–1.2 write `

/target/streams/$global/update/$global/streams/update_cache/output`, with the Ivy reports in `

/target/resolution-cache/reports/`. **sbt 2 writes `target/out/jvm/u//update/update_cache/output`**, so the Scala segment is `u`, not `scala-*` | The sbt 2 pattern accepts any Scala segment and both `update_cache` spellings | +| `+update` cross-build | There is one record per Scala binary: `scala-2.12/…_2.12` and `scala-2.13/…_2.13` on 1.x, streams `update_cache_2.12` / `_2.13` on 1.2, and `scala-3.3.4/e` / `scala-3.8.4/e` (both `update_cache_3`) on sbt 2. On 0.13, `+e/update` crosses with the root's versions; `project e` then `+update` writes `scala-2.10` and `scala-2.11` reports (`0.13.18/cross/`) | The union over every record is the resolution | +| `useCoursier := false` (1.9.9, 1.3.13, 1.13.0) | Ivy reports appear under `

/target/scala-2.12/resolution-cache/reports/`, the JSON stays at its 1.3+ path, and the artifact paths point into `~/.ivy2/cache`. sbt 2 has no `useCoursier` setting (load error) | Both formats are read | +| `inputs` mtime | On every version, `update` rewrites each resolved project's `output` even when its `inputs` hash is unchanged (touching `build.sbt` refreshed every `output` mtime; `inputs` changed only when the dependencies did). A record the run did not resolve (the second Scala version of `e`) keeps its old mtime | `stale` compares the build sources with the newest `output` / `inputs` over the whole build | +| Load without `update` (review re-probe on 0.13.18, 1.9.9 and 2.0.9: `sbt projects` / `sbt "show name"` after touching `build.sbt`) | Every sbt load rewrites the meta-build's `output` (`project/target/…` on 0.13–1.x, `target/out/jvm/scala-*/-build/` on sbt 2); the libraries' `output` and every `inputs` keep their mtimes | The meta-build's records never date the evidence: only library records count for `stale` and `wiring_newer` | +| sbt 2 project named `x-build` in root `x` | The user project and the meta-build write the same `target/out/jvm/scala-3.8.4/x-build/` directory; the record held the user project after `update` | That id is always meta-build: the project's evidence counts as missing, so the gate returns `Incomplete` | +| sbt 2 implicit root | A root `My_Proj.1` with no declared root project gets the id `my_proj-1` and the meta-build id `my_proj-1-build` (`Project.normalizeModuleID`) | `evidence::sbt_id` maps the id to `.` | +| Classifier JSON | `artifacts[][0].classifier` is `"tests"`, beside a plain jar entry. The Ivy report has ``. sbt 2 wraps the cached-file URI as `artifacts[][1] = {"first": uri, "second": 0}` | Both shapes are parsed | +| `build.sbt.lock` (sbt-dependency-lock 1.5.1) | With a `ThisBuild / dependencyOverrides +=` added after `dependencyLockWrite`, `update` and `compile` still succeed and only warn ("Dependency lockfile is outdated"), because the default `dependencyLockAutoCheck` is `WarnOnError`. `dependencyLockCheck` fails with exit 1 and reports `3.11 -> 3.10`. Every project gets a lock (`build.sbt.lock`, `a/build.sbt.lock`). The plugin does not load on 1.2.8 | `*_dependency_lock_present` stays a refusal. The remedy is `sbt update` and then `sbt dependencyLockWrite` | +| scala-cli 1.17.1 directory mode | With the Bloop server (the default), `scala-cli compile .` writes `.scala-build/.bloop/_.json`, and `--test` writes `_-test.json`. `project.resolution.modules[]` lists every transitive module with `artifacts[].path`. **`--server=false` writes no Bloop file** | `crawlers/scala_evidence.rs` reads them. No Bloop file means no evidence | + +The meta-build shapes are as follows: + +- **1.x:** `project/target/scala-2.12/sbt-1.0/update/update_cache_2.12/output`. Its modules (Scala tooling) all show up in the libraries' `scala-tool` configuration too. +- **0.13:** `project/target/scala-2.10/sbt-0.13/resolution-cache/reports/default-x-build-*.xml`. +- **sbt 2:** `target/out/jvm/scala-/-build/`, which holds the sbt plugin classpath (for example jackson). + +`meta_build` is therefore "meta-build GAs that no library configuration in +`CONFIGS` resolves". A `-build` id that no declared project uses is also +treated as meta-build, which covers a root directory renamed after sbt ran. diff --git a/docs/design/sbt-support.md b/docs/design/sbt-support.md new file mode 100644 index 000000000..6d0027112 --- /dev/null +++ b/docs/design/sbt-support.md @@ -0,0 +1,244 @@ +# sbt, Mill and scala-cli support + +sbt, Mill and scala-cli builds resolve `pkg:maven` artifacts, so they are +**build shapes inside the `maven` ecosystem**, not an ecosystem of their own: +`ecosystems: [maven]` covers them, and every PURL, rollout budget and ledger +stays Maven's. + +## Modes + +| Tool | Agent (patch the cache in place) | Hosted | Vendored | +|---|---|---|---| +| sbt 0.13.18 – 1.2 (Ivy) | Ivy cache crawl | `socket-patch.sbt` | `socket-patch-vendor.sbt` + suffixed tree | +| sbt 1.3 – 1.13, 2.0 (Coursier) | Coursier cache crawl + sidecar resync | `socket-patch.sbt` | `socket-patch-vendor.sbt` + suffixed tree | +| sbt < 0.13.18 | Ivy cache crawl (untested) | refused | refused | +| Mill 0.11 – 1.x | Coursier cache crawl | snippet guidance | docs only (deferred) | +| scala-cli, directory build | Coursier cache crawl | snippet guidance | owned files + same-GAV tree (Linux, macOS) | +| scala-cli, single file | Coursier cache crawl | snippet guidance | docs only (`-r` / `COURSIER_REPOSITORIES`) | + +**Agent** mode crawls Coursier's per-repository roots and the Ivy cache next +to `~/.m2` for an sbt / Mill / scala-cli project (a Maven or Gradle project +never reads them, so it keeps crawling `~/.m2` alone; `--global` crawls +them all), unscoped within them (today's Maven semantics); a Coursier +directory holding only a `.pom` (a version Coursier considered and evicted) +is no copy. It patches every cached copy +of a GAV: one per root (`~/.m2`, each Coursier cache, each Ivy cache; inside +one Coursier cache the first per-repository root holding it), since the build +loads whichever its resolver picks. Coursier keeps checksum sidecars beside +each file; they are resynced after a patch and after a rollback. Patch keys +are whole files (`-.jar`). + +**Hosted** mode writes one generated root file, `socket-patch.sbt`, and edits +no user file. Inside `inThisBuild(…)` it pins each patched jar and pom by +sha256, downloads them at load into the gitignored `.socket/sbt-hosted/maven2`, +resolves from there and forces `-socket.` with +`dependencyOverrides`; a load-time verifier fails the build when what sbt +resolved is not the pinned artifact. On sbt 0.13 / 1.x the installer moves the +socket-patch resolver to the front of every project's `externalResolvers`, so +Ivy (sbt 1.0 – 1.2) never aborts on an unreachable repository listed before +it and the build resolves the pin offline. **Vendored** mode writes +`socket-patch-vendor.sbt` over the committed, suffixed +`.socket/vendor/maven2` tree. The two files never pin the same GA. + +The generated bytes (three syntax lines: 0.13, 1.x, 2.x) are frozen by the +template probe, which passed on all six sbt versions (0.13.18, 1.2.8, 1.3.13, +1.9.9, 1.13.0, 2.0.9); results in +[`sbt-template-probe.md`](sbt-template-probe.md), and the golden fixtures pin +the bytes. The suffixed version and the override are both required: a +same-version copy loses to Maven Central, and without the override the plain +release outranks the suffix. A file written by an earlier (unreleased) build +of the template fails the strict parse as modified; there is no migration. + +## Scoping: sbt's own evidence + +A build-wide override that forces a version some project does not resolve is +a silent downgrade, so hosted and vendored pins are gated on what sbt itself +resolved, read from `target/` (the update-cache JSON on sbt 1.0+, the Ivy XML +reports on 0.13–1.2), never by running sbt. A pin is written only when every +declared project left evidence, no build source is newer than any project's +evidence (each project dated by its own newest record: a partial +`sbt core/update` vouches for `core` only), no build source declares the GA +newer than the patch's base, and every project that resolves the GA resolves +the patch's base version. No evidence is one run-level warning and a no-op +(exit 0); run `sbt update` and re-run. A pin already in place is re-checked: +a shadowed override, an artifact resolved from elsewhere, or a build source +now declaring the GA newer than the pin's base (the override would force it +back down; the load-time verifier also fails `update` on such a declaration) +leaves the patch unconfirmed. A dependency edit since the pin (`deps=` +digest) is re-verified against evidence resolved since, and the digest then +refreshed; with older evidence the pin is unverifiable until `sbt update`. +Hosted, vendored and the gates share one digest: every `"g" % "a" % "v"` +literal of every build source the evidence walk reads. Vendoring over a +hosted pin (takeover, eject) runs the vendored gate before restoring it, so a +pin the gate would stop stays hosted. + +## Code map + +Pure models (`crates/socket-patch-core/src/formats/sbt/`): + +- `build.rs` — sbt version and syntax line, build-root tests, declared + projects, the dependency digest, build-source findings. +- `evidence.rs` — evidence paths and parsers into `JvmResolution`. +- `gate.rs` — `check_new` / `check_existing`. +- `owned_file.rs` — the generated files: model, render, strict parse, value + validation. + +IO and planners: + +| Module | Role | +|---|---| +| `crawlers/jvm_cache.rs` | markers, `classify` (Ivy / Coursier rules), `push_classified` | +| `crawlers/{coursier_cache,ivy_cache}.rs` | cache locations and layouts | +| `crawlers/sbt_evidence.rs`, `crawlers/scala_evidence.rs` | evidence IO | +| `patch/sidecars/coursier.rs` | Coursier sidecar resync | +| `hosted/sbt_reads.rs` | evidence for the hosted engine (synthetic key ``) | +| `patch/redirect/{sbt,scala_guidance}.rs`, `patch/redirect/upstream/sbt.rs` | hosted rewrite, snippets, restore | +| `vex/discover/sbt.rs` | VEX attestation of the generated files | +| `vendor/jvm/{sbt,sbt_gate,scala_cli,coursier_tree,coursier_gate}.rs` | vendored planners and gates | + +Fixtures: `crates/socket-patch-core/tests/fixtures/sbt/evidence//` +(real sbt output, 0.13.18 – 2.0.9). Test helpers: +`crates/socket-patch-cli/tests/sbt_common/`. Docker image: +`tests/docker/Dockerfile.sbt`. + +## Known limits + +- Agent mode patches a shared cache: every project on the machine sees the + patch. Restart a running sbt server or Metals after an agent apply. +- `-Dsbt.override.build.repos=true` drops the build's resolvers; the + generated file then fails the load (warned at wiring time). +- A `build.sbt.lock` (sbt-dependency-lock) is refused until it can be + rewritten; run `sbt dependencyLockWrite` after wiring. +- The in-memory hosted engine has no `target/` trees, so it never wires sbt. +- Agent mode matches whole-file patch keys only (member-keyed jar patches need + the shared JVM apply work). +- Vendored sbt VEX attests through the vendor ledger only: the suffixed tree + path carries no full uuid, so the generated file is not a VEX reference on + its own. +- scala-cli vendoring is refused on Windows (`file://${.}` is unverified there). + +## Testing + +The hermetic suites (`e2e_sbt`, `e2e_sbt_hosted`, `e2e_sbt_vendor`, +`e2e_scala_cli_vendor`, `e2e_vex_lockfile` `sbt::` / `sbt_vendored::`, +`redirect_sbt_golden`) run in the normal test job. The real-tool suites and +`scripts/sbt-compat-matrix.sh`, which runs them per tool version and JDK, are +described in [sbt compatibility](../testing/sbt-compatibility.md); CI runs them +in `.github/workflows/sbt-compatibility.yml` (the full matrix) and `ci.yml` +(agent cells on 1.2.8 and 1.13.0, hosted and vendored on 1.13.0). + +## scala-cli vendored + +A root holding `project.scala` (or socket-patch's own `socket-patch.scala`) +and no `pom.xml`, Gradle or Mill build file is a scala-cli directory build +(`vendor/jvm/scala_cli.rs`). Vendoring writes only files socket-patch owns +and never edits a user file: + +| File | Bytes | +|---|---| +| `socket-patch.scala` | `// managed by socket-patch` + `//> using file .socket/vendor/coursier/socket-patch.scala` | +| `.socket/vendor/coursier/socket-patch.scala` (the guard) | `// managed by socket-patch` + `//> using repository file://${.}` | +| `.socket/vendor/coursier////` | patched `-.jar`, upstream `-.pom`, both `.sha1`, `socket-patch.vendor.json` | +| `.socket/vendor/coursier-index.tsv` | `#socket-patch-coursier-index 1`, then `g:a:v⇥rel⇥sha256⇥uuid` per jar and pom, sorted | +| `.socket/vendor/coursier/.gitignore`, `.gitattributes` | `!*` (a user `*.jar` rule cannot drop the jar from a clone), `* -text` | + +The tree keeps the upstream GAV: scala-cli has no override directive, and +the directive repository is consulted before the defaults, so the copy wins +by being found first. The guard lives inside the tree, so deleting the tree +deletes the guard and the build fails (`File not found`) instead of +resolving upstream. The index is the liveness proof; the last revert +deletes the index, both `.scala` files and the tree's git files. A +modified owned file is refused (`vendor_scala_cli_owned_file_modified`), a +same-GAV marker the index does not list is `vendor_coursier_tree_conflict`. + +The gate (`vendor/jvm/coursier_gate.rs`) reads scala-cli's own resolution, +the Bloop project files under `.scala-build/.bloop/` +(`crawlers/scala_evidence.rs`), never by running scala-cli: the newest +project of this workspace and its `-test` twin, their `resolution.modules` +(artifact paths, classifiers) and `sources`. No evidence (`--server=false` +records none), a source newer than the evidence (anywhere in the +directory input, hidden directories aside; evidence that does not list +`project.scala` is a single-file run's and stale too), or a GA the build +does not resolve skip the patch with one warning and exit 0. The evidence's +time is the newest of the project file and its `.bloop//` entries: +scala-cli rewrites the project file only when its content changes, while +every compile refreshes `bloop-internal-classes`. Another resolved +version, a classified artifact, the Scala runtime, a repository declared by +any input (every listed source, inside the root or not, plus the directory's +own `.scala`/`.sc`/`.java` files, since a `.sc` script is listed only as its +generated wrapper), or a post-wiring build that resolved the GA outside the tree, a +project path with `%` or a non-ASCII character, and Windows are refused. + +### Step-0 probe (scala-cli 1.17.1, eclipse-temurin 17, 2026-10-02) + +Scripts and raw output: the campaign scratchpad `probe-scala-cli-L5/` +(`p1.sh`–`p3.sh`, `out-p*.txt`); the patched GAV was +`com.typesafe:config:1.4.3` with an added `SOCKET_PATCHED` resource. + +| # | Case | Result | +|---|---|---| +| G1 | guard inside the tree, `file://${.}` | patched; `${.}` is the guard's directory | +| G2 | `.socket/` or the tree deleted | `[error] File not found: …/socket-patch.scala`, exit 1 | +| G6 | jar deleted, pom kept | `Error fetching artifacts … not found`, exit 1 | +| G6b | whole `` directory deleted, guard kept | silent fallback to Central (residual; `vendor --check` reports it) | +| M3 | `.gitignore` `*.jar`, fresh clone | patched with the tree's `!*` `.gitignore`; without it the jar is missing and the build fails | +| K1/K2 | wrong `.sha1` / no `.sha1` | `wrong checksum`, exit 1 / patched: Coursier verifies sidecars on `file:` repositories | +| C1/C2 | `COURSIER_REPOSITORIES=central` / a Central mirror URL | patched: env repositories come after directive repositories | +| C4/O1–O6 | a user `//> using repository` in any input (before or after ours, `project.scala`, a subdirectory), or `-r` on the command line | **not patched**, exit 0: the user repository is consulted first. Refused at vendor time; `-r` is undetectable and caught only by the post-wiring evidence | +| F1/F2 | run from `/`; `package --assembly` | patched | +| F3 | single-file `scala-cli run main.scala` | not patched (sibling files ignored): guidance only | +| H1/U4/U5 | path with a space, `[]+`, `'&` | patched | +| U3 | path with a literal `%20` | **not patched**, exit 0 (the URL is percent-decoded): refused | +| U2 | non-ASCII path | `IllegalArgumentException: Bad escape`, the whole build fails: refused | +| E1–E5 | evidence | `.scala-build/.bloop/

_[-].json` (Bloop 1.4.0) only when Bloop compiles; old input sets' files stay; `-test` twin for test sources; after vendoring the GA's artifact path is inside the tree | +| E6 (review) | edit a source, `scala-cli compile .` | project file mtime unchanged; `.bloop//bloop-internal-classes` refreshed (also on a touch-only compile); `compile --test` refreshes the `-test` twin, a plain compile does not | +| E7 (review) | subdirectory, hidden directory, `.sc` sources | `src/deep/a.scala` listed; `.hid/h.scala` not; `s.sc` listed only as `.scala-build//src_generated/main/s.scala` | +| D1 | `project.scala` present | `[warn] Using directives detected in multiple files` (warning `vendor_scala_cli_directives_split`) | +| — | Windows `file://${.}` | not probed: refused (`vendor_scala_cli_windows_unsupported`) | + +Real-tool check: `crates/socket-patch-cli/tests/e2e_scala_cli_vendor.rs` +(`scala_cli_vendor_*`, `#[ignore]`). + +## Mill (vendored mode deferred) + +Mill builds get agent mode (the Coursier cache crawl) and hosted guidance +(`redirect_mill_manual_snippet`). `socket-patch vendor` does not wire a Mill +build: a root with `build.mill`, `build.mill.yaml` or `build.sc` is never a +scala-cli build, and with no `pom.xml` or Gradle file it is refused +`vendor_maven_pom_project_missing`. Automatic vendoring is deferred because the +only committable mechanism the probe found has costs socket-patch should not +impose silently: + +- it appends to the user-owned `.mill-jvm-opts` (or `.config/mill-jvm-opts`; + Mill 1.x reads only the first that exists); +- `-Dcoursier.repositories=…|ivy2Local|central` replaces the repository + list, dropping corporate mirrors and `COURSIER_REPOSITORIES`; +- Mill 0.12 keeps a stale `out/` after a revert (`./mill clean` needed) and + a fresh client start with `.socket/` missing hangs rather than failing; +- Mill 0.11 does not expand `${PWD}` in `.mill-jvm-opts`; +- a build overriding `repositories` without `super` ignores the property. + +To pin a patched artifact in a Mill build today, use hosted mode and apply +the printed snippet (Mill 1.x: `def repositories = Task { Seq("") +++ super.repositories() }` with `def depManagement = Task { +super.depManagement() ++ Seq(mvn"::") }`, both appending to what +the module already has; +0.11/0.12: `repositoriesTask` plus `.forceVersion()`), or agent mode. The +probe's fail-closed recipe for 0.12 and 1.x, for users who maintain a +same-GAV tree themselves, is two lines at the top of `.mill-jvm-opts`: + +```text +-Dcoursier.repositories=file://${PWD}/.socket/vendor/maven|ivy2Local|central +-XX:VMOptionsFile=${PWD}/.socket/vendor/mill.vmoptions +``` + +with `.socket/vendor/mill.vmoptions` holding one valid option (for example +`-Dsocket.patch.vendor.guard=true`; a comment-only file stops the JVM). A +daemon started before `.socket/` was removed keeps resolving silently: run +`./mill shutdown` after any change. + +**scala-cli single-file runs** ignore sibling files, so the directory +wiring does not reach them. After vendoring the directory, pass the tree +explicitly: `scala-cli run main.scala -r file://$PWD/.socket/vendor/coursier`, +or `COURSIER_REPOSITORIES="file://$PWD/.socket/vendor/coursier|central"` +(which replaces the default list). diff --git a/docs/design/sbt-template-probe.md b/docs/design/sbt-template-probe.md new file mode 100644 index 000000000..11d9c6102 --- /dev/null +++ b/docs/design/sbt-template-probe.md @@ -0,0 +1,178 @@ +# sbt owned-file template probe (spec §0.2.5 cases a–j, §1.1) + +Status: **gate passes** (plus one later V change, item 8 below, verified by the real-sbt suites). Every applicable case passes on every applicable version with the final templates in this directory. Two cases changed the design (V's check and its installer, see "Changes vs spec §1.1"), and case i was rejected on evidence. The bytes here are frozen for `formats/sbt/owned_file.rs`. + +Probe date 2026-10-02. Docker `eclipse-temurin:8-jdk` ran 0.13.18, 1.2.8 and 1.3.13; `eclipse-temurin:17-jdk` ran 1.9.9, 1.13.0 and 2.0.9. Every run used `--rm -m 2g`, one container at a time, through `/private/tmp/claude-501/sbt-job.sh`. The sbt runner is the 1.13.0 launcher script. A Java `HttpsServer` on `https://localhost:8443` mimics `patch.socket.dev` URL shapes (`/patch-registry/maven///maven2/`), with a self-signed cert imported into the JDK cacerts. The token selects the variant: `good`; `tamper` (evil commons-lang3 jar); `slow` (sleeps 200 s before answering). + +## Files + +| Path (under `tpl-probe/final/`) | What | +|---|---| +| `hosted-013.sbt.tpl`, `hosted-1.sbt.tpl`, `hosted-2.sbt.tpl` | `socket-patch.sbt`, by line. Only `@ROWS@` and `@OVERRIDES@` remain as placeholders | +| `vendored-013.sbt.tpl`, `vendored-1.sbt.tpl`, `vendored-2.sbt.tpl` | `socket-patch-vendor.sbt`, by line | +| `examples/{hosted,vendored}-{013,1,2}.*.sbt` | Concrete renders with 2 pins (commons-lang3 3.11 and commons-text 1.9). These exact bytes ran as cases b (hosted) and c (vendored) on all six versions | +| `harness/render.py` | Reference renderer: one shared body plus a per-line installer. The Rust renderer must be byte-identical to it | +| `harness/{mkfix.py,drive.sh,dock.sh,run-all.sh,summ.py,Server.java}` | Fixture builder, in-container driver, docker wrapper and server | +| `harness/summary-v2.txt` | Raw results for the final templates (full matrix, then PASS2 `h5 h6 e3`, then PASS3 CRLF) | +| `harness/summary-v1.txt` | Raw results for the spec-draft template (evidence for the changes) | + +Per-run logs are in `tpl-probe/out//.log` (final templates) and `tpl-probe/out-v1//.log` (spec draft). + +The probe scratch (`tpl-probe/`) is not in the repository. The six 2-pin examples, plus 1-pin renders from `harness/render.py`, are committed as golden fixtures in `crates/socket-patch-core/tests/fixtures/sbt/owned_file/` (`--pin.sbt`), and `formats/sbt/owned_file.rs` asserts its output against them byte for byte. + +## Generator shape + +There is one shared body. Per mode, the only differences are the constants in the table below, plus the hosted-only `.gitignore` line. Per line, only two things differ: +- the `@ID@Rows` setting line: `@ID@Rows in Global := @ID@Pins` on 0.13, `Global / @ID@Rows := @ID@Pins` on 1.x and 2.x; +- the 5-line `onLoad` installer at the end of the file. 0.13 uses `in` syntax and `x.append`; 1.x uses slash syntax and `appendWithoutSession`; 2.x is 1.x with `Def.uncached(...)` around the update wrapper. On 0.13 and 1.x the installer also moves socket-patch's resolvers (`socket-patch`, `socket-patch-vendor`) to the front of every project's `externalResolvers` (see "Offline resolution on sbt 1.0–1.2"); sbt 2 keeps the appended `resolvers +=` order. + +`harness/render.py` is the source of truth. `render.py templates DIR` writes the six `.tpl` files. + +| Constant | Hosted | Vendored | +|---|---|---| +| `@CMD@` | `get` | `vendor` | +| `@ID@` | `socketPatchHosted` | `socketPatchVendor` | +| `@DIR@` (inside the path literal `".socket/@DIR@/maven2"`) | `sbt-hosted` | `vendor` | +| resolver name | `socket-patch` | `socket-patch-vendor` | +| `.gitignore` line (after `val repo`) | present | absent: no line at all, not a blank line | +| file name | `socket-patch.sbt` | `socket-patch-vendor.sbt` | + +The `onLoad` installer hardcodes the two row-key labels `socketPatchHostedRows` and `socketPatchVendorRows` in both modes. The marker label `socketPatchApplied` is shared by both modes. + +**Line endings.** The renderer emits `\n`, then replaces every `\n` with `\r\n` when the existing file used CRLF. The `"*\n"` inside the `.gitignore` literal is a Scala escape in the source, so it is unaffected. A CRLF render of both files at once passed on all six versions (case r). The file ends with `}\n`. + +## Line grammars (for the strict `parse`) + +Values are validated before rendering (spec §1.1 `validate_values`), so the literals below never need escaping. + +**Row** (2 per pin, pom then jar; pins sorted by `(group, artifact, sv)`): +``` +^ \("(?[A-Za-z0-9_.-]+)", "(?[A-Za-z0-9_.-]+)", "(?[A-Za-z0-9_.+-]+)", "(?[A-Za-z0-9_.+/-]+)", "(?[0-9a-f]{64})", "(?(https?://[A-Za-z0-9._~:/%+-]+)?)"\)(?,?) // socket-patch (?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$ +``` +- `comma` is `,` on every row except the last row of the block. +- `rel` = ` />///-.pom`, or `.jar` for the second row. +- `sv` = `-socket.`. +- Hosted: `src` = `index_url + "/" + rel`. Vendored: `src` is `""`. + +**Override** (1 per pin, same order): +``` +^ dependencyOverrides \+= "(?...)" % "(?...)" % "(?...)"(?,?) // socket-patch (?...) deps=(?[0-9a-f]{8})$ +``` +- `comma` is `,` on every override line except the last. +- It is `%`, never `%%`, and never `++= Seq`. +- **Zero pins are never rendered**: the file is deleted instead. + +Every other line must equal the template line byte for byte (after CRLF→LF normalisation). The fixed header line is `// Generated by socket-patch. Do not edit; re-run \`socket-patch \`.` + +## Results (final templates) + +PASS means the expected outcome below. All six versions ran each case unless the row says otherwise. + +| # | Case | Expected | 0.13.18 | 1.2.8 | 1.3.13 | 1.9.9 | 1.13.0 | 2.0.9 | +|---|---|---|---|---|---|---|---|---| +| b | Hosted, 2 pins, row/override comments and trailing commas; first load downloads pom+jar ×2 (`reqs=4`), rerun makes 0 requests | both PATCHED, exit 0; `c` has no commons dependency | PASS | PASS | PASS | PASS | PASS | PASS | +| t | Hosted, server serves a tampered jar | load fails `socket-patch: served sha256 …, pinned …` | PASS | PASS | PASS | PASS | PASS | PASS | +| c | Vendored, 2 pins, resolver `socket-patch-vendor`, file `socket-patch-vendor.sbt`; then tree jar tampered | PATCHED; then load fails `has sha256 …, pinned …` | PASS | PASS | PASS | PASS | PASS | PASS | +| d | Hosted (lang3) + vendored (text) at once | both PATCHED, lang3 from `.socket/sbt-hosted`, text from `.socket/vendor` | PASS | PASS | PASS | PASS | PASS | PASS | +| d-tamperL3 / d-tamperTX | As d, post-load tamper of each mode's jar (the shared V must cover both files' pins) | `(a / update) socket-patch: g:a:sv resolved to … not pinned` | PASS | PASS | PASS | PASS | PASS | PASS | +| a | V content check: tamper the in-repo jar after the load-time check (TOCTOU via a `tamperL3`/`tamperTX` command), vendored and hosted | update fails in V | PASS | PASS | PASS | PASS | PASS | PASS | +| e1 | Hosted, server stalls (read timeout 120 s); 0.13.18 and 2.0.9 only (plain JDK code) | load fails after ~125 s with `cannot download (java.net.SocketTimeoutException: Read timed out)`; 0 `.part` left | PASS | – | – | – | – | PASS | +| e2 | Hosted, unroutable host (connect timeout 30 s); 0.13.18 and 2.0.9 only | fails after ~34 s with `connect timed out`; 0 `.part` left | PASS | – | – | – | – | PASS | +| e (temp) | `createTempFile` in the target directory + `finally tmp.delete()` | `parts=0` after every run (b, e1, e2) | PASS | PASS | PASS | PASS | PASS | PASS | +| f | Hosted writes `.socket/sbt-hosted/.gitignore` = `*\n` (`od`: `* \n`) | exact bytes | PASS | PASS | PASS | PASS | PASS | PASS | +| g3 | X3: `ThisBuild / resolvers += Resolver.mavenLocal` with an evil suffixed GAV in `~/.m2` | V fails `resolved to /root/.m2/… with sha256 … not pinned` | PASS | PASS | PASS | PASS | PASS | PASS | +| g4 | X4: evil suffixed GAV in `~/.ivy2/local` (default first resolver) | V fails `resolved to /root/.ivy2/local/…` | PASS | PASS | PASS | PASS | PASS | PASS | +| g4i | X4 with Ivy (`useCoursier := false` on 1.3+; n/a on 2.0.9) | same | PASS | PASS | PASS | PASS | PASS | n/a | +| g1 | X1 on Ivy, vendored: A resolves; B = a copy; B runs; A's jar tampered; B runs; A deleted; B runs | B-good PASS (uses A's pinned bytes); B-afterAtamper V fails; B-afterArm PASS from B's own tree | PASS | PASS | PASS | PASS | PASS | n/a (no Ivy) | +| g1k | X1 on the line's default resolver | Ivy lines as g1; Coursier lines read B's own tree, so A's tamper is irrelevant (PATCHED) | PASS | PASS | PASS | PASS | PASS | PASS | +| h1 | `ThisBuild / dependencyOverrides := Seq.empty` in `zz.sbt` | if `zz.sbt` loads after ours, V fails `a resolves …:1.9, expected 1.9-socket…`; if before, ours wins (PATCHED) | PASS (ours wins: `.sbt` order is `zz.sbt,build.sbt,socket-patch.sbt`) | PASS (same) | PASS (same) | PASS (V fails) | PASS (V fails) | PASS (V fails) | +| h2 | Project-scoped `a / dependencyOverrides := Seq.empty` (shadows ThisBuild whatever the file order) | V fails `a resolves org.apache.commons:commons-text:1.9, expected 1.9-socket.12345678` | PASS | PASS | PASS | PASS | PASS | PASS | +| h3 | Project-scoped `a / resolvers := Seq.empty` | fails closed: Ivy `unresolved dependency … 1.9-socket… not found`; Coursier `not found` | PASS | PASS | PASS | PASS | PASS | PASS | +| h4 | Competing `a / dependencyOverrides += …commons-lang3 % 3.12.0` | V fails `a resolves …:3.12.0, expected 3.11-socket.abcdef12` | PASS | PASS | PASS | PASS | PASS | PASS | +| h5 | Interactive `set ThisBuild / dependencyOverrides := Seq.empty` | sbt reapplies, but ours stays effective (PATCHED). Safe; V did not need to fire | PASS (safe) | PASS (safe) | PASS (safe) | PASS (safe) | PASS (safe) | PASS (safe) | +| h6 | `reload`, then `set version := "9"`, then post-load tamper | V still installed after reload and set: update fails | PASS | PASS | PASS | PASS | PASS | PASS | +| i | Per-checkout resolver name (`socket-patch-vendor-`) stops X1 | **rejected.** `ivydata-*.properties` records `resolver=sbt-chain`, not our resolver's name, so the name never reaches Ivy's cache key. With the name, B still used A's origin (g1p ≡ g1 on 0.13.18, 1.2.8, 1.3.13, 1.9.9, 1.13.0). V's content check closes X1 instead | FAIL→rejected | same | same | same | same | n/a | +| j | Ivy (0.13.18, 1.2.8 default; 1.3.13, 1.9.9, 1.13.0 with `useCoursier := false`): where resolved artifacts live | in place under `/.socket/…/maven2/…` (Ivy uses the `file:` origin, no cache copy), or another checkout's origin (see g1). V is therefore content-based on every line, not path-based | in place | in place | in place | in place | in place | n/a (no Ivy) | +| r | CRLF render of both files at once (57/57 lines CRLF) | both PATCHED | PASS | PASS | PASS | PASS | PASS | PASS | + +The concurrency sub-case of e (e3: two concurrent first loads of one checkout) **could not be exercised through sbt**, and this is not a template issue: +- sbt ≥1.4 refuses the second instance: `BootServerSocket … Address already in use`, exit 2 (1.13.0). +- 0.13.18 races on its own compiled `.sbt` definitions: `not found: object $7d60…`. + +The template-side guarantee is structural: `createTempFile` names are unique, the atomic same-directory move happens only after the sha256 matches, and `finally tmp.delete()` runs. `parts=0` held after every run, including failures. + +Log references, under `tpl-probe/out//`: +- b: `b.log`, `b-rerun.log` +- t: `t.log` +- c: `c.log`, `c-tamper.log` +- d: `d.log`, `d-tamperL3.log`, `d-tamperTX.log` +- a: `a.log`, `a-hosted.log` +- e: `e1.log`, `e2.log`, `e3-{1,2}.log` +- g: `g3.log`, `g4.log`, `g4i.log`, `g1{,p,k}-{A,B-good,B-afterAtamper,B-afterArm}.log` +- h: `h1.log` … `h6.log` +- j: `j.log` +- r: `r.log` + +The f and ivydata checks are inline in `summary.txt`. + +## Changes vs the spec §1.1 draft (and why) + +1. **V checks content, not location.** The draft V failed when any artifact path was outside `/.socket/@DIR@/maven2`. + - Run on Ivy (draft template, `out-v1`), that made every legitimate second checkout fail: case g1-B-good on 0.13.18, 1.2.8 and 1.3.13. Ivy serves the first checkout's `file:` origin from `~/.ivy2/cache`, and case i shows that no resolver name avoids this. + - The final V instead requires that every artifact file of a pinned, non-evicted module has a sha256 equal to one of that GA's pinned rows (pom or jar), and that `revision == sv`. + - This is location-independent. It still fails closed on X1 (another checkout tampered), X3 (mavenLocal), X4 (ivy-local) and TOCTOU, because the bytes differ from the pin. It also rejects any extra artifact an attacker publishes under the pinned GAV. + - Message: `:: resolved to with sha256 , which is not pinned (tampered, or from ivy-local, mavenLocal or another checkout); delete it and run sbt update`. + - The ` resolves ::, expected ; …` message is unchanged from the spec. +2. **One shared V for both files.** With the draft's per-file installers, hosted + vendored present together (case d) **looped forever** in `onLoad` on 0.13.18, 1.2.8 and 1.3.13 (`out-v1//d.log`: endless `Set current project to root`). Each `appendWithoutSession` rebuilds from `session.original` and drops the other file's appended wrapper and marker, so each hook re-fires the other. + - Fix: both files declare `SettingKey[Boolean]("socketPatchApplied")` (same label, so same key: VBP) and publish their rows as a static `Global / @ID@Rows := @ID@Pins`, which survives rebuilds. + - Whichever installer runs first appends one wrapper per project that verifies the union of `socketPatchHostedRows` and `socketPatchVendorRows`, looked up by label. + - The second installer then sees the marker and returns. d-tamperL3 and d-tamperTX prove that both files' pins are enforced on all six lines. +3. **Resolver name stays constant** (`socket-patch` / `socket-patch-vendor`). Case i rejected the per-checkout name (see the table). `@RESOLVER@` is not computed. +4. **Download hardening:** + - `URLConnection` with connect timeout 30 s and read timeout 120 s; + - `createTempFile("socket-patch", ".part", dir)`; + - the whole download sits in `try { … } finally tmp.delete()`; + - `IOException` is mapped to `socket-patch: cannot download ()` instead of a raw stack trace (e1, e2). +5. **`.gitignore` line is a plain statement,** `val gitignore = …; if (!gitignore.isFile) { repo.mkdirs(); Files.write(…, "*\n".getBytes) }`, not the draft's `{ … }` block. A `{` block on the line after `val repo = f(x)` is parsed by Scala as a block argument to `f(x)`. +6. **`repo` is computed inline** (`new java.io.File(baseDirectory.value, ".socket/@DIR@/maven2").getCanonicalFile`) rather than with `/` segments, so no `RichFile` implicit is needed on any line. `@DIRSEGS@` therefore becomes the single path literal. +7. **Helpers are top-level, `@ID@`-prefixed defs/vals** (`@ID@Pins`, `@ID@Rows`, `@ID@Applied`, `@ID@Fail`, `@ID@Sha256`, `@ID@Verify`). `.sbt` top-level definitions are shared across the root's `.sbt` files, so unprefixed names would collide when both files are present. + +8. **V checks what the build declares (added after the probe).** The build-wide `dependencyOverrides +=` forces `sv` whatever version a project declares, so V's revision check alone passed a build that had bumped the pinned GA (the override made the resolved revision `sv`): a silent downgrade. V now also takes each project's `allDependencies` and fails when a dependency names a pinned GA (`%` artifact equal, or a `%%` / `%%%` name the pinned artifact extends with `_`) at a version newer than the pin's base by its leading numbers (`@ID@Newer`, the same rule as `formats::sbt::build::numeric_newer`); dynamic versions (`+`, ranges, `latest.*`) are not compared, and an older declared version is fine (evicted by the base anyway). Message: ` declares :: but socket-patch forces (a downgrade); roll the patch back, or declare `. The installers pass `(p / allDependencies).value` (`(allDependencies in p).value` on 0.13). Verified with the real-sbt suites on all six lines (`sbt_hosted_declared_bump_fails_closed`, `sbt_vendor_declared_bump_fails_closed`, and every existing hosted / vendored capstone over the new bytes), not by re-running this probe harness; the golden fixtures were regenerated from the new template. + +## Offline resolution on sbt 1.0–1.2 + +Probe date 2026-10-02 (pass 4), same setup as above. Harness: `tpl-probe-v3/` (a copy of `harness/` whose `render.py` carries the new 0.13 / 1.x installer, `drive2.sh` case `o`); per-run logs in `tpl-probe-v3/out/`. + +**Problem.** Both generated files append their `file:` resolver (`resolvers +=`), so it comes after sbt's default repositories. Coursier (1.3+, 2.x) treats an unreachable repository as a miss and moves on; Ivy on 1.0–1.2 aborts the resolution of the suffixed version on the first repository that fails with a connection error. With the network down and the pinned module not yet in `~/.ivy2/cache` (a fresh machine or CI cache, a fresh clone), 1.2.8 failed `unresolved dependency: org.apache.commons#commons-text;1.9-socket.12345678 … repo1.maven.org … ConnectException`, vendored and hosted alike. 0.13.18 already resolved it. + +**Change.** The 0.13 and 1.x installers append, per project, beside the `update` wrapper: + +```scala +p / externalResolvers := { val (ours, rest) = (p / externalResolvers).value.partition(r => r.name == "socket-patch" || r.name == "socket-patch-vendor"); ours ++ rest } +``` + +(`externalResolvers in p` on 0.13). `externalResolvers` is project-scoped by default, so it cannot be set from `inThisBuild`; the installer already has every project ref. The `resolvers +=` block, and with it the load-time tree check and the hosted download, are unchanged. The reorder names both resolvers, so whichever file's installer runs (the shared `socketPatchApplied` marker) orders both. A build that drops ours (`a / resolvers := Seq.empty`, h3) still fails closed: there is nothing to move. + +**Case o** warms the build online, deletes `target/` and every `*socket*` entry of `~/.ivy2/cache`, then resolves with every outbound connection refused (`-Dhttp(s).proxyHost=127.0.0.1 -Dhttp(s).proxyPort=9`). + +| Case | Template | 0.13.18 | 1.2.8 | 1.3.13 | 1.9.9 | 1.13.0 | 2.0.9 | +|---|---|---|---|---|---|---|---| +| o-offline (vendored) | previous (control) | PATCHED | **fails** (`unresolved dependency … ConnectException`) | – | – | – | – | +| oh-offline (hosted, after the first load downloaded) | previous (control) | PATCHED | **fails** (same) | – | – | – | – | +| o-offline | prepend | PATCHED | PATCHED | PATCHED | PATCHED | PATCHED | PATCHED (2.x template unchanged) | +| oh-offline | prepend | PATCHED | PATCHED | PATCHED | PATCHED | PATCHED | PATCHED | + +**Full case set re-run** with the prepend installer on 0.13.18, 1.2.8, 1.3.13, 1.9.9 and 1.13.0 (b, t, c, d, d-tamperL3/TX, a, a-hosted, g3, g4, g4i, g1, g1k, h1–h6, j, r): every case keeps its outcome from the table above, except two that change for the better: + +- **g3 (mavenLocal) and g4 / g4i (ivy-local)** now resolve PATCHED instead of failing in V: our resolver is consulted first, so the poisoned copy is never chosen. Both outcomes are safe; V still guards every other origin. +- g1 (Ivy second checkout) is unchanged: Ivy still serves checkout B from A's cached origin while A exists (`resolver=sbt-chain` in `ivydata`), V still fails B after A's jar is tampered, and B resolves its own tree once A is gone. + +The new bytes are the golden fixtures in `crates/socket-patch-core/tests/fixtures/sbt/owned_file/` (the probe's 2-pin renders are byte-identical to them). A file rendered by an earlier build fails the strict parse as modified; sbt support has not shipped, so no migration is kept. + +## Notes for the implementers (L3/L4/VEX) + +- `.sbt` load order is not reliably alphabetical across lines: `zz.sbt,build.sbt,socket-patch.sbt` on 0.13.18 and 1.2.8 (logged), `build.sbt,socket-patch.sbt,zz.sbt` on 1.9.9 (logged); 1.3.13 behaved like 0.13 (ours won) but does not log the order. The fail-closed guarantee therefore rests on V, not on file order. Build-source refusals (`redirect_sbt_overrides_assignment` and friends) remain useful as early, explained errors. +- The interactive `set ThisBuild / dependencyOverrides := …` (h5) does not displace ours: sbt reapplies settings and ours stays effective. Nothing to handle. +- V runs only in `update`, so `updateClassifiers` and `updateSbtClassifiers` are not wrapped. Sources and javadoc jars of a pinned GAV don't exist in our repo anyway. +- The hosted `src` URL, which contains the token, appears in error messages. It is already in the committed file, so this exposes nothing new. +- The server-side `.sha1` is never consulted. Hosted needs only `` for pom and jar to be fetchable from `index_url`. diff --git a/docs/ecosystems.md b/docs/ecosystems.md index 65d4e99af..63edadc02 100644 --- a/docs/ecosystems.md +++ b/docs/ecosystems.md @@ -20,6 +20,7 @@ The backticked slug in each row is the value `-e`/`--ecosystems` accepts (e.g. | RubyGems (`gem`) | ✅ in place | ✅ Gemfile + Gemfile.lock path pair (`Gemfile` spelling only — a `gems.rb` twin, which bundler ≥ 2 loads instead, or a `BUNDLE_GEMFILE`-configured manifest makes vendoring refuse with `gemfile_not_loaded` before any write) | ✅ per-dep `source` block — edits `gems.rb` + `gems.locked` when present (bundler prefers them over `Gemfile`; spellings that diverge beyond Socket's own edits fail closed with `redirect_gem_gemfile_spellings_diverge`; `BUNDLE_GEMFILE` from `.bundle/config` (which outranks the environment, as in bundler) or the environment is followed when it names the project's `Gemfile` / `gems.rb`, and any other configured manifest is refused with `redirect_gem_bundle_gemfile_unsupported`); the `CHECKSUMS` pin needs bundler ≥ 2.6 (older locks get a `redirect_gem_no_checksums_section` warning); a stale pre-redirect materialization that `bundle install` would reuse instead of refetching is flagged `redirect_gem_stale_install` with a prescriptive remedy (see CLI_CONTRACT.md's "Gem stale-install guard") | | Go (`golang`) | ✅ `go.mod` `replace` → `.socket/go-patches/` — see [Go: directory replaces and go.sum](#go-directory-replaces-and-gosum) | ✅ `replace` → the committed vendor tree | ✅ (free tier) fork-style `replace` → `patch.socket.dev/gopatch/` + committed `go.sum` pin; see [Go notes](#go-directory-replaces-and-gosum). Paid hosted patches are unsupported; `redirect_golang_unsupported` names the vendored remedy | | Maven (`maven`) — Maven and Gradle | ✅ in place in every copy the build consumes: each `~/.m2` copy it reads and each Gradle `files-2.1` copy; `~/.m2` `.sha1`/`.md5` sidecars are rewritten, Gradle copies get advisories; jar-member records swap in the patch service's whole jar — prefer vendored / hosted, see [Maven & NuGet caveats](#maven--nuget-caveats) and [Gradle](#gradle) | ✅ single-POM repository, suffixed Maven reactor repository, or Gradle 6.8+ same-GAV repository with settings wiring and SHA-256 checks (a root with both `pom.xml` and a Gradle build wires both); see [JVM vendoring](design/maven-vendoring.md) and [Gradle](#gradle) | ✅ fail-closed by a Socket-only `-socket.` suffix: pom projects get a pinned `` (`${property}` versions are refused); Gradle 6.8+ builds get an owned settings script, lock-entry rewrites and a resolution tripwire — see [Maven & NuGet caveats](#maven--nuget-caveats) and [Gradle](#gradle) | +| sbt / Mill / scala-cli (`maven`) | ✅ Coursier caches (sbt 1.3+, sbt 2, Mill, scala-cli) and Ivy caches (sbt 0.13–1.2, `useCoursier := false`) patched in place, Coursier checksum sidecars resynced — see [Scala build tools](#scala-build-tools-sbt-mill-scala-cli) | ✅ sbt 0.13.18+: generated `socket-patch-vendor.sbt` over the committed suffixed `.socket/vendor/maven2` tree; scala-cli directory builds: owned `socket-patch.scala` + same-GAV `.socket/vendor/coursier` tree (Linux / macOS); Mill: not wired (agent or hosted guidance) | ✅ sbt 0.13.18+: one generated `socket-patch.sbt`, gated on sbt's own `sbt update` records; Mill / scala-cli: paste-able snippets only (`redirect_mill_manual_snippet`, `redirect_scala_cli_manual_snippet`) | | NuGet (`nuget`) | ✅ in-place patching deletes `.nupkg.metadata` and advises on the `.nupkg.sha512` tamper-evidence sidecar — prefer vendored / hosted, see [Maven & NuGet caveats](#maven--nuget-caveats) | ✅ committed folder feed + `packageSourceMapping` + `packages.lock.json` contentHash pin | ✅ `nuget.config` source + source-mapping, `packages.lock.json` contentHash rewrite. See the locked-mode note in [Maven & NuGet caveats](#maven--nuget-caveats) | | Composer (`composer`) | ✅ in place (`vendor/`) | ✅ `composer.lock` `dist: path` rewrite | ✅ `composer.lock` dist url + shasum rewrite; the entry's `source` and `dist.mirrors` are removed. See [composer-compatibility.md](testing/composer-compatibility.md) | | Deno (`deno`) | ✅ in place (the only mode for Deno) | ❌ refused (`vendor_unsupported_ecosystem`) | ❌ not supported | @@ -583,6 +584,155 @@ withholds the statement (`vex_gradle_unpatched_copy`). A derived-cache walk cut on a very large cache warns `vex_gradle_derived_cache_unchecked` and does not withhold. +## Scala build tools: sbt, Mill, scala-cli + +sbt, Mill and scala-cli resolve `pkg:maven` artifacts, so they are build shapes +inside the `maven` ecosystem, not an ecosystem of their own: `--ecosystems maven` +covers them, and their PURLs, rollout budgets and ledgers are Maven's. A root +holding `build.sbt`, `build.mill`, `build.mill.yaml`, `build.sc` or +`project.scala` counts as a Maven project for discovery. Design, probes and the +exact generated bytes: [sbt, Mill and scala-cli support](design/sbt-support.md); +the tested versions: [sbt compatibility](testing/sbt-compatibility.md). + +| Tool | Agent | Hosted | Vendored | +|---|---|---|---| +| sbt 0.13.18 – 1.2 (Ivy) | Ivy cache | `socket-patch.sbt` | `socket-patch-vendor.sbt` + suffixed tree | +| sbt 1.3 – 1.13, 2.0 (Coursier) | Coursier cache | `socket-patch.sbt` | `socket-patch-vendor.sbt` + suffixed tree | +| sbt older than 0.13.18 | Ivy cache (untested) | refused (`redirect_sbt_unsupported_version`) | refused (`vendor_sbt_unsupported_version`) | +| Mill 0.11 – 1.x | Coursier cache | snippet | not wired | +| scala-cli, directory build | Coursier cache | snippet | owned files + same-GAV tree | +| scala-cli, single file | Coursier cache | snippet | pass the tree with `-r` (below) | + +Tested: sbt 0.13.18, 1.2.8, 1.3.13, 1.9.9, 1.13.0 and 2.0.9 in every sbt mode +(JDK 8 up to 1.3.x, 17 after), Mill 1.1.10 and scala-cli 1.17.1. sbt 2.1 and +later is wired with a `*_version_untested` warning. + +### Agent mode: Coursier and Ivy caches + +Agent mode patches the shared caches the tools resolve into, next to `~/.m2` +(only for an sbt, Mill or scala-cli project: a Maven or Gradle project keeps +crawling `~/.m2` alone; `--global` crawls every cache): + +- **Coursier** (sbt 1.3+, sbt 2, Mill, scala-cli): `$COURSIER_CACHE`, a + `-Dcoursier.cache=` in `JAVA_OPTS` / `SBT_OPTS` / `.jvmopts` / `.sbtopts`, + `-Dsbt.coursier.home`, then the OS default (`~/.cache/coursier/v1`, + `~/Library/Caches/Coursier/v1`, `%LOCALAPPDATA%\Coursier\cache\v1`). + Coursier keeps hidden checksum files beside each cached file and silently + re-downloads a file that disagrees with them, so `apply` and `rollback` + rewrite them to the new bytes (the envelope's `sidecars[]` lists them). +- **Ivy** (sbt 0.13 – 1.2, or `useCoursier := false`): `-Dsbt.ivy.home` / + `-Divy.home`, then `~/.ivy2/cache`. + +The crawl is not scoped to the build: as with `~/.m2`, every cached GAV is +queried (a Coursier directory holding only the `.pom` of a version it +considered but did not pick is no copy), and a GAV cached in several roots is +patched (and restored) in every one, since the build loads whichever copy its +resolver picks: the same every-copy fan-out as [Gradle](#gradle), and `vex` +re-hashes each copy. An Ivy module's sources jar under `srcs/` is found for a +`?classifier=sources` patch. Every project on +the machine sees the patch. A running sbt server, Bloop or Metals holds the old +classpath: restart it after `apply`. Agent patches are matched as whole jar +files. + +### Hosted mode: `socket-patch.sbt` + +`scan` (hosted is the default) and `get --mode hosted` wire an sbt build root +(`project/build.properties` naming `sbt.version` 0.13.18 or later) through one +generated root file, `socket-patch.sbt`. No user file is edited. For each +patched GA it: + +- forces the Socket-only `-socket.` version build-wide with + `dependencyOverrides`; +- adds a `file:` resolver over the gitignored `.socket/sbt-hosted/maven2/`, + moved ahead of the default repositories on sbt 0.13 / 1.x, and downloads the + sha256-pinned jar and pom there on the first sbt load; +- installs a load-time verifier that fails `sbt update` when a project + resolves another version or a pinned artifact whose bytes are not pinned, + or declares the GA at a version newer than the patched base (the override + would otherwise force it back down). + +Commit `socket-patch.sbt`. The first load after a fresh checkout needs to reach +the patch server; later loads work offline from the downloaded copies. + +A new pin is gated on what sbt itself resolved, read from `target/` (never by +running sbt): **run `sbt update` (for the whole build) before +`socket-patch scan`.** With no evidence, or any project's evidence older than +the build files, nothing is written and the run warns once +(`redirect_sbt_no_resolution_evidence`, `redirect_sbt_resolution_stale`) and +exits 0. A patch whose GA some project +resolves at another version, the Scala runtime, or a build that reassigns +`dependencyOverrides` / `resolvers` (`:=`, `~=`) is refused. Re-runs re-check +existing pins against fresh evidence: after a dependency edit, `sbt update` +then a re-run re-verifies the pin and records the build's new dependency +digest; a build that now declares the GA newer than the patched base is +refused (`redirect_sbt_pin_declared_newer`: roll the patch back, or declare +the base again). `rollback` / `remove` restore the file +offline. The full code list is in +[`CLI_CONTRACT.md`](../crates/socket-patch-cli/CLI_CONTRACT.md) (**Hosted +sbt**). + +### Vendored mode: `socket-patch-vendor.sbt` + +`vendor` / `scan --mode vendored` write the patched jar and its pom into the +committed tree `.socket/vendor/maven2///-socket./` and one +generated root file, `socket-patch-vendor.sbt`, which pins every tree file's +sha256, resolves from the tree (ahead of the default repositories on 0.13 / +1.x, so the build resolves the patch with the network down) and forces the +suffixed version. Its load-time check fails the sbt build closed on a tampered +tree or a replaced pin. Commit both (`socket-patch-vendor.sbt` and +`.socket/vendor/`: without the root file the build resolves the unpatched +upstream), then run `sbt update`; the tree carries its own `.gitignore` +(`!*`, so a `*.jar` rule cannot drop the jar) and `.gitattributes`. The same +`sbt update` evidence gate as hosted applies (`vendor_sbt_*` codes; a skip is +reported `skipped`, exit 0). Vendoring over a hosted pin runs the gate before +the hosted pin is restored, so a pin the gate would stop stays hosted. The hosted +and vendored files never pin the same GA. Revert, `rollback`, `vendor --check` +and `repair` cover the generated file and tree. + +### scala-cli directory builds (vendored) + +A root holding `project.scala` and no `pom.xml`, Gradle or Mill build is a +scala-cli directory build. `vendor` writes only files socket-patch owns: a root +`socket-patch.scala` that includes a guard inside the committed same-GAV tree +`.socket/vendor/coursier/`, plus `.socket/vendor/coursier-index.tsv`. Deleting +the tree fails the build (`File not found`) instead of resolving upstream. The +gate reads scala-cli's Bloop project files under `.scala-build/.bloop/`: run +`scala-cli compile --test .` (with the default Bloop server) first. A build +that declares its own repository (`//> using repository`, `-r`) is refused, +because scala-cli would consult it before the tree; move it to +`COURSIER_REPOSITORIES`, which is consulted after. Windows and project paths +holding `%` or a non-ASCII character are refused. + +**Single-file runs** (`scala-cli run main.scala`) ignore the directory wiring. +After vendoring the directory, pass the tree explicitly: +`scala-cli run main.scala -r file://$PWD/.socket/vendor/coursier`. + +### Mill + +Mill builds get agent mode and, in hosted mode, a paste-able snippet per patch +(`redirect_mill_manual_snippet`): a repository plus the forced suffixed version +(Mill 1.x: `repositories` + `depManagement`, each appended to the module's own +inside `Task { … }`; 0.11 / 0.12: `repositoriesTask` + `.forceVersion()`). Nothing is written. `vendor` does not wire a Mill build: the +only committable mechanism found edits the user's `.mill-jvm-opts` and replaces +the repository list, so it is left as a +[documented manual recipe](design/sbt-support.md#mill-vendored-mode-deferred). + +### Limitations + +- Pins need fresh `sbt update` evidence for every declared project; a build + whose project definitions cannot be read statically is skipped + (`*_resolution_incomplete`). +- `-Dsbt.override.build.repos=true` drops the build's resolvers, so the + generated file fails the load (warned at wiring time). +- A `build.sbt.lock` (sbt-dependency-lock) is refused; run + `sbt dependencyLockWrite` after wiring by hand. +- Classified artifacts other than `sources` / `javadoc`, and the Scala runtime + (`org.scala-lang`), are refused. +- The in-memory hosted engine (GitHub App) has no `target/` evidence, so it + never wires sbt. +- Vendored sbt VEX attests through the vendor ledger; the generated file alone + is not a VEX reference. + ## Cargo: shared registry cache Agent mode patches the crate in place wherever the crawler finds it. For a non-vendored diff --git a/docs/testing/README.md b/docs/testing/README.md index d36a8648d..f13384fd5 100644 --- a/docs/testing/README.md +++ b/docs/testing/README.md @@ -28,7 +28,7 @@ setting when that toolchain is required for the check. | npm family | [npm](npm-compatibility.md), [pnpm](pnpm-compatibility.md), [Yarn Berry](yarn-berry-compatibility.md), [Bun](bun-compatibility.md), [vlt](vlt-compatibility.md) | | Python | [uv](uv-compatibility.md), [Poetry](poetry-compatibility.md), [PDM](pdm-compatibility.md), [Pipenv](pipenv-compatibility.md), [Hatch](hatch.md) | | PHP | [Composer](composer-compatibility.md) | -| JVM | [Maven reactor and Gradle vendoring](../design/maven-vendoring.md#validation-and-remaining-scope), [Gradle in every mode](#gradle) | +| JVM | [Maven reactor and Gradle vendoring](../design/maven-vendoring.md#validation-and-remaining-scope), [Gradle in every mode](#gradle), [sbt, Mill and scala-cli](sbt-compatibility.md) | Other ecosystems have Rust and container suites listed in [ecosystem support](../ecosystems.md) and the Docker guide. diff --git a/docs/testing/sbt-compatibility.md b/docs/testing/sbt-compatibility.md new file mode 100644 index 000000000..e22b065e6 --- /dev/null +++ b/docs/testing/sbt-compatibility.md @@ -0,0 +1,176 @@ +# sbt, Mill and scala-cli compatibility + +This guide covers the real-tool suites for sbt (agent, hosted and vendored +modes), Mill (agent mode) and scala-cli (agent and vendored modes), and the one +script that runs them, [`scripts/sbt-compat-matrix.sh`](../../scripts/sbt-compat-matrix.sh). +The design and its probes are in [sbt support](../design/sbt-support.md), +[the template probe](../design/sbt-template-probe.md) and +[the evidence probe](../design/sbt-evidence-probe.md); the user-facing contract +is the sbt sections of [`CLI_CONTRACT.md`](../../crates/socket-patch-cli/CLI_CONTRACT.md). + +The hermetic suites (`e2e_sbt`, `e2e_sbt_hosted`, `e2e_sbt_vendor`, +`e2e_scala_cli_vendor`, `e2e_vex_lockfile` `sbt::` / `sbt_vendored::`, +`redirect_sbt_golden`) need no JVM and run in the normal `cargo test` job. +Everything below needs Docker. + +## The matrix script + +```sh +scripts/sbt-compat-matrix.sh --group \ + [--version ] [--jdk <8|17|21>] [--filter ] \ + [--rebuild-image] [--skip-build] [--list] +``` + +It does three things, the same locally and in CI: + +1. **Builds the Linux binaries once.** A pinned `rust` 1.93.1 container builds + `socket-patch` and the four real-tool test binaries (`e2e_sbt_build`, + `e2e_sbt_vendor_build`, `e2e_scala_cli_vendor`, and `docker_e2e_sbt` with + `--features docker-e2e`) into `target/linux` + (`SBT_MATRIX_TARGET`), with the cargo registry in the Docker volume + `socket-patch-sbt-matrix-cargo`. Cargo's own freshness checks make later + runs cheap. The repository is mounted at its own absolute path, so the + paths compiled into the test binaries are valid inside the run containers. + `--skip-build` reuses what is there. +2. **Uses the `tests/docker/Dockerfile.sbt` image** (`socket-patch-test-sbt:latest`, + or `SBT_MATRIX_IMAGE`), building it (and `socket-patch-test-base`) when it is + missing or `--rebuild-image` is given. The image holds JDK 8, 17 and 21 + (`/opt/jdk`), the sbt 1.13.0 launcher (it runs any `sbt.version`), Mill + 0.11.13 / 0.12.17 / 1.1.10 and scala-cli 1.17.1, and bakes warm caches for + sbt 0.13.18, 1.2.8, 1.13.0 and 2.0.9 under `/root`. An unwarmed Ivy line + resolves its build definition from the network, serially, into each test's + private Ivy home: sbt 0.13.18 took ~1380 s for the hosted group and ~930 s + for the vendored one that way, ~420 s / ~100 s warm. The Coursier lines + boot quickly cold (~140 s / ~90 s). +3. **Runs one group** for one tool version and JDK and prints one line per + test, then a summary line: + + ``` + PASS e2e_sbt_vendor_build[1.13.0,jdk17] sbt_vendor_offline_fresh_checkout + FAIL docker_e2e_sbt[1.2.8,jdk8] agent_sbt_versions_patch_in_place + SKIP … (an #[ignore]d test the group did not select) + NOTE … (a SKIP line the suite printed itself) + RESULT PASS vendored 1.13.0 jdk17 + ``` + + The exit status is non-zero when any test failed or none ran. Raw logs are + in `target/linux/sbt-matrix-logs/---jdk.log`. + +| Group | Suite | Where it runs | `--version` | +|---|---|---|---| +| `agent` | `docker_e2e_sbt` `agent_sbt_*` (`--features docker-e2e`): the tool resolves into its cache, then `scan --sync` patches the cache copy and `rollback` restores it, Coursier sidecars included; the `useCoursier := false` cell runs on sbt 1.3 – 1.x only (older lines resolve through Ivy already; sbt 2 has no Ivy) | on the host: the prebuilt test binary on Linux, else `cargo test`; each cell is a container with the Linux binary mounted (`SOCKET_PATCH_DOCKER_BIN`) | any sbt (default 1.13.0) | +| `hosted` | `e2e_sbt_build`: `get --mode hosted` writes `socket-patch.sbt`, real sbt resolves it | the whole test binary inside the image, sbt native there | any sbt (default 1.13.0) | +| `vendored` | `e2e_sbt_vendor_build`: `vendor` writes `socket-patch-vendor.sbt` over the committed tree, real sbt resolves it | the whole test binary inside the image | any sbt (default 1.13.0) | +| `scala-cli` | the scala-cli agent cell, then `e2e_scala_cli_vendor`'s real-tool test | host cell, then inside the image | 1.17.1 only (the image's) | +| `mill` | the Mill agent cell (`build.sc` + `ivyDeps` on 0.11 / 0.12, `build.mill` + `mvnDeps` on 1.x) | host cell | 0.11.13, 0.12.17 or 1.1.10 (default 1.1.10) | + +The default JDK is 8 for sbt 1.3.x and older, 17 otherwise; `--jdk` overrides +it for every cell of the run (`SOCKET_PATCH_SBT_DOCKER_JDK` in the agent +suite). `--filter` narrows to tests whose name contains the string. + +Other settings: `SBT_MATRIX_JOBS` (cargo jobs, default 4), `SBT_MATRIX_MEMORY` +(`docker -m` of every run container, default `2g`), `SBT_MATRIX_BUILD_MEMORY` +(the build container, default `4g`), `SBT_MATRIX_RUST_IMAGE`, +`SBT_MATRIX_LOG_DIR`, and `SBT_MATRIX_SEED` (the warm cache handed to the +in-image suites, default `/root`; `none` runs cold). + +### In CI + +```yaml +- run: scripts/sbt-compat-matrix.sh --group vendored --version ${{ matrix.sbt }} --jdk ${{ matrix.jdk }} --skip-build +``` + +On Linux every group needs only Docker (the host side of `docker_e2e_sbt` +runs the prebuilt test binary); elsewhere the agent, `scala-cli` and `mill` +groups build it with the host Rust toolchain. On a Linux host the script hands `target/linux` back to the +calling user after the root build container. `--build-only` stops after the +build and prints the absolute paths of what it built, so one job can build +and every leg reuse the files with `--skip-build`. + +[`sbt-compatibility.yml`](../../.github/workflows/sbt-compatibility.yml) runs +the full matrix on PRs touching the sbt modules, their tests, this script or +`Dockerfile.sbt`, and on every push to main: + +| Job | Legs | +|---|---| +| `image`, `linux-bins` | build `socket-patch-test-sbt` and the Linux binaries once (`--build-only`), as artifacts | +| `docker` | {agent, hosted, vendored} x sbt 0.13.18, 1.2.8, 1.3.13 (JDK 8), 1.9.9, 1.13.0, 2.0.9 (JDK 17), plus JDK 21 legs for 1.13.0 and 2.0.9: 24 legs | +| `scala-tools` | `--group mill` on Mill 0.11.13, 0.12.17 and 1.1.10, `--group scala-cli` | +| `native` | `e2e_sbt_build` and `e2e_sbt_vendor_build` on sbt 1.13.0, JDK 17, on macOS and Windows: `actions/setup-java` plus `sbt/setup-sbt`, sbt on the host | + +`ci.yml` runs a small blocking slice on every PR: `coverage-docker` (and the +nightly `e2e-docker`) runs `docker_e2e_sbt`'s `agent_sbt_` cells on 1.2.8 +and 1.13.0 (the nightly adds the Mill and scala-cli cells), and the `e2e` job +runs `e2e_sbt_build` and `e2e_sbt_vendor_build` on sbt 1.13.0 on ubuntu. + +The host legs (`native`, `e2e`) warm a seed first with +[`scripts/sbt-warm-seed.sh`](../../scripts/sbt-warm-seed.sh)` `: +it boots that sbt once through the `sbt` launcher on `PATH` (`sbt.bat` on +Windows) into the flat seed layout and prints `SOCKET_PATCH_SBT_E2E_SEED` and +`SOCKET_PATCH_SBT_E2E_SBT` for `$GITHUB_ENV`. Without it every test boots sbt +from the network. + +## The suites' own settings + +The script sets these; a suite can also be run by hand with them. + +| Variable | Read by | Meaning | +|---|---|---| +| `SOCKET_PATCH_SBT_E2E_SBT` | hosted, vendored | the sbt launcher (`…/bin/sbt`); unset = `sbt` on `PATH` | +| `SOCKET_PATCH_SBT_E2E_VERSION` | hosted, vendored | the `sbt.version` every fixture pins (default 1.13.0) | +| `SOCKET_PATCH_SBT_E2E_REQUIRED` | hosted, vendored | non-empty: a missing toolchain is a failure, not a printed SKIP | +| `SOCKET_PATCH_SBT_E2E_SEED` | hosted, vendored | a warm cache: a home (`.cache/coursier/v1`, `.ivy2`, `.sbt/boot`) or a flat directory (`coursier/v1`, `ivy2`, `boot`) | +| `SOCKET_PATCH_SBT_E2E_DOCKER` | hosted | run sbt in this image instead, the host CLI reading what it wrote (needs `SOCKET_PATCH_SBT_E2E_SBT` = a launcher directory on the host) | +| `SOCKET_PATCH_SBT_DOCKER_VERSIONS` / `_IMAGE` / `_JDK` | agent | the sbt versions, image and JDK of the cells | +| `SOCKET_PATCH_MILL_DOCKER_VERSIONS` | mill | the Mill versions of the cells (default 1.1.10) | +| `SOCKET_PATCH_DOCKER_BIN` | agent | a Linux `socket-patch` mounted over the image's | +| `SOCKET_PATCH_DOCKER_E2E_REQUIRED` | agent | `1`: a missing image is a failure | +| `SOCKET_PATCH_SCALA_CLI_E2E_{BIN,REQUIRED,CACHE}` | scala-cli vendored | the scala-cli binary, strictness, and the Coursier cache it resolves into (vendoring reads the installed copy there) | + +Both real-sbt drivers (`tests/sbt_build_common` for hosted, +`tests/sbt_vendor_build_common` for vendored) share this contract through +`tests/sbt_e2e_shared`: one seed reader, one hermetic native sbt command and +group-killing timeout, the path spelling Java accepts (no Windows `\\?\` +prefix; `file:///C:/…` repository URLs), one `export` classpath parser. The +vendored driver runs sbt natively only. Both link the seed's Coursier and Ivy +caches into each test and share its boot directory. + +Every sbt run is hermetic: its own home (`HOME`, `-Duser.home`, so +`mavenLocal` is the test's own `~/.m2`), global base, boot directory, Ivy +home and `COURSIER_CACHE`; `SBT_OPTS`, `JAVA_OPTS`, `JAVA_TOOL_OPTIONS`, +`COURSIER_*`, `SOCKET_*` and CI markers scrubbed; a 300 s timeout that kills +the whole process group. Installed packages are found the way a user's are: the agent +crawler reads the test home's Coursier or Ivy cache. + +## Results on this branch + +Run with this script on 2026-10-02 (Docker Desktop, arm64), after the review fixes: + +| Group | Versions (JDK) | Result per version | +|---|---|---| +| hosted | 0.13.18, 1.2.8, 1.3.13 (8); 1.9.9, 1.13.0, 2.0.9 (17) | 14/14 PASS (with `sbt_hosted_declared_bump_fails_closed`; 0.13.18 in ~120 s on the warmed image, ~1380 s before) | +| vendored | 0.13.18, 1.2.8, 1.3.13 (8); 1.9.9, 1.13.0, 2.0.9 (17) | 8/8 PASS (with `sbt_vendor_declared_bump_fails_closed`), the offline test blocking the network on every line | +| agent | 0.13.18, 1.3.13 (8); 1.13.0, 2.0.9 (17) | the version cell PASS on each; the `useCoursier := false` cell PASS on 1.3.13 and 1.13.0, skipped (no such setting) on 0.13.18 and 2.0.9 | +| mill | 0.11.13, 0.12.17, 1.1.10 (17) | 1/1 PASS each | +| scala-cli | 1.17.1 (17) | 2/2 PASS (agent cell, vendored real-tool test) | + +The hosted and vendored rows ran the template with V's declared-version +check (`docs/design/sbt-template-probe.md`, item 8) on all six lines. + +See the design docs for the probed version boundaries; a past run is not a +claim that the current branch passes today. + +## Known limits + +- **sbt 1.0–1.2 offline (Ivy)** used to fail: Ivy aborts on the first + unreachable repository listed before socket-patch's. The 0.13 / 1.x + installers now move socket-patch's resolvers first + ([template probe, case o](../design/sbt-template-probe.md#offline-resolution-on-sbt-1012)), + and `sbt_vendor_offline_fresh_checkout` blocks the network on every line. +- **Mill** has agent mode only (vendored Mill is deferred, + [design](../design/sbt-support.md)); the matrix covers the image's Mill + 0.11.13, 0.12.17 and 1.1.10. +- **scala-cli** is pinned to the image's 1.17.1. +- **The `native` macOS / Windows legs** and the JDK 21 legs had not run when + the workflow was added; Windows drives `sbt.bat` from the Rust test + drivers, whose timeout kill is process-group based on Unix only. diff --git a/docs/usage.md b/docs/usage.md index 142c793da..338b63f17 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -128,6 +128,25 @@ that tail. The choice persists in the ledger. See [JVM vendoring](design/maven-v for supported shapes, committed files, Maven mirror and `-f` limitations, and offline operation. +### sbt and scala-cli + +sbt and scala-cli builds are Maven projects to the CLI. Both modes read what the +tool itself resolved, so resolve first: + +```sh +sbt update # sbt: record the resolution under target/ +socket-patch scan # hosted: writes socket-patch.sbt +socket-patch scan --mode vendored # or vendored: socket-patch-vendor.sbt + .socket/vendor/maven2 + +scala-cli compile --test . # scala-cli directory build (Bloop records the resolution) +socket-patch scan --mode vendored # socket-patch.scala + .socket/vendor/coursier +``` + +Commit the generated root file with `.socket/`. No user build file is edited. +With no or stale resolution records the run warns once, writes nothing and +exits 0; resolve again and re-run. Mill builds get agent mode or a hosted +snippet to paste. See [Scala build tools](ecosystems.md#scala-build-tools-sbt-mill-scala-cli). + ## OpenVEX Generate an attestation after installing the patched dependencies: @@ -185,8 +204,10 @@ Once the required patch data is committed, `socket-patch apply --offline` works without downloading it again. `get --save-only` records a patch without applying it. `apply` skips packages owned by the vendor ledger. -Deno uses agent mode. Cargo agent patches can affect a shared registry cache; Go -uses project-local copies and `replace` directives. Read the +Deno uses agent mode. Cargo agent patches can affect a shared registry cache; so +do Maven ones in `~/.m2` and the Coursier and Ivy caches sbt, Mill and +scala-cli resolve into (restart a running sbt server, Bloop or Metals after +`apply`). Go uses project-local copies and `replace` directives. Read the [ecosystem caveats](ecosystems.md) before using agent mode in shared environments. The removed `setup` command is covered in the [migration guide](migrating-to-v5.md). diff --git a/scripts/sbt-compat-matrix.sh b/scripts/sbt-compat-matrix.sh new file mode 100755 index 000000000..ca4f89b8f --- /dev/null +++ b/scripts/sbt-compat-matrix.sh @@ -0,0 +1,276 @@ +#!/usr/bin/env bash +# sbt / Mill / scala-cli compatibility matrix: one entry point for local runs +# and CI legs (docs/testing/sbt-compatibility.md). +# +# scripts/sbt-compat-matrix.sh --group +# [--version ] [--jdk <8|17|21>] [--filter ] +# [--rebuild-image] [--skip-build] [--list] +# scripts/sbt-compat-matrix.sh --build-only +# +# 1. Builds the Linux socket-patch binary and the real-tool test binaries +# (docker_e2e_sbt's host side included) ONCE, in a pinned rust +# container, into $SBT_MATRIX_TARGET +# (default /target/linux; cargo's own incremental checks make +# later runs cheap). The repository is mounted at its own absolute path, +# so the test binaries' compiled-in paths (CARGO_MANIFEST_DIR, +# CARGO_BIN_EXE_socket-patch) are valid in the run containers too. +# 2. Uses (or builds) the tests/docker/Dockerfile.sbt image. +# 3. Runs one group for one tool version and JDK, printing PASS / FAIL / +# SKIP per test, and exits non-zero when any test failed. +# +# --build-only stops after step 1 and prints the absolute paths of what it +# built (the binary, the test binaries and their index), one per line, so a +# CI job can build once and hand the files to every leg (`--skip-build`). +# +# Groups: +# agent docker_e2e_sbt agent_sbt_* cells (on the host: the prebuilt +# test binary on Linux, else cargo test with feature +# docker-e2e; each cell runs `scan` / `rollback` inside the +# image with the Linux binary from step 1 mounted). +# hosted e2e_sbt_build (real sbt, hosted socket-patch.sbt), whole test +# binary inside the image, sbt native there. +# vendored e2e_sbt_vendor_build (real sbt, socket-patch-vendor.sbt), +# likewise inside the image. +# scala-cli the scala-cli agent cell (host) + e2e_scala_cli_vendor's +# real-tool test (inside the image). The image pins one +# scala-cli (1.17.1); --version must match it. +# mill the Mill agent cell (host): --version 0.11.13, 0.12.17 or +# 1.1.10 (the image's Mill launchers; default 1.1.10). +# +# Defaults: --version 1.13.0 for sbt groups; --jdk 8 for sbt <= 1.3.x, else +# 17 (Mill and scala-cli: 17). +# +# Environment: +# SBT_MATRIX_IMAGE image tag (default socket-patch-test-sbt:latest) +# SBT_MATRIX_TARGET Linux cargo target dir (default /target/linux) +# SBT_MATRIX_RUST_IMAGE build image (default: the pinned rust 1.93.1) +# SBT_MATRIX_JOBS CARGO_BUILD_JOBS for the Linux build (default 4) +# SBT_MATRIX_MEMORY docker -m for every container (default 2g; the +# Linux build gets SBT_MATRIX_BUILD_MEMORY, default 4g) +# SBT_MATRIX_LOG_DIR where raw logs go (default $SBT_MATRIX_TARGET/sbt-matrix-logs) +# SBT_MATRIX_SEED a warm cache for the in-image groups (default +# /root, the image's baked caches; "none" = cold) +set -uo pipefail + +usage() { sed -n '2,/^# Defaults:/p' "$0" | sed '$d' | sed 's/^# \{0,1\}//'; exit "${1:-2}"; } + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +GROUP="" +VERSION="" +JDK="" +FILTER="" +REBUILD_IMAGE="" +SKIP_BUILD="" +LIST="" +BUILD_ONLY="" +while [ $# -gt 0 ]; do + case "$1" in + --group) GROUP="${2:-}"; shift 2 ;; + --version) VERSION="${2:-}"; shift 2 ;; + --jdk) JDK="${2:-}"; shift 2 ;; + --filter) FILTER="${2:-}"; shift 2 ;; + --rebuild-image) REBUILD_IMAGE=1; shift ;; + --skip-build) SKIP_BUILD=1; shift ;; + --list) LIST=1; shift ;; + --build-only) BUILD_ONLY=1; shift ;; + -h|--help) usage 0 ;; + *) echo "unknown argument: $1" >&2; usage ;; + esac +done + +IMAGE="${SBT_MATRIX_IMAGE:-socket-patch-test-sbt:latest}" +TARGET="${SBT_MATRIX_TARGET:-$ROOT/target/linux}" +RUST_IMAGE="${SBT_MATRIX_RUST_IMAGE:-rust@sha256:5b9332190bb3b9ece73b810cd1f1e9f06343b294ce184bcb067f0747d7d333ea}" +JOBS="${SBT_MATRIX_JOBS:-4}" +MEMORY="${SBT_MATRIX_MEMORY:-2g}" +BUILD_MEMORY="${SBT_MATRIX_BUILD_MEMORY:-4g}" +LOG_DIR="${SBT_MATRIX_LOG_DIR:-$TARGET/sbt-matrix-logs}" +SEED="${SBT_MATRIX_SEED:-/root}" +SCALA_CLI_IMAGE_VERSION=1.17.1 +MILL_IMAGE_VERSION=1.1.10 +MILL_IMAGE_VERSIONS="0.11.13 0.12.17 1.1.10" + +if [ -n "$LIST" ]; then + cat < in the image) +EOF + exit 0 +fi + +case "$GROUP" in + agent|hosted|vendored) VERSION="${VERSION:-1.13.0}" ;; + scala-cli) VERSION="${VERSION:-$SCALA_CLI_IMAGE_VERSION}" + [ "$VERSION" = "$SCALA_CLI_IMAGE_VERSION" ] || { echo "scala-cli $VERSION: the image pins $SCALA_CLI_IMAGE_VERSION" >&2; exit 2; } ;; + mill) VERSION="${VERSION:-$MILL_IMAGE_VERSION}" + case " $MILL_IMAGE_VERSIONS " in *" $VERSION "*) ;; *) echo "mill $VERSION: the image has $MILL_IMAGE_VERSIONS" >&2; exit 2 ;; esac ;; + "") [ -n "$BUILD_ONLY" ] || { echo "--group is required" >&2; usage; } ;; + *) echo "unknown group: $GROUP" >&2; usage ;; +esac +if [ -z "$JDK" ]; then + case "$GROUP:$VERSION" in + agent:0.*|agent:1.[0-3].*|hosted:0.*|hosted:1.[0-3].*|vendored:0.*|vendored:1.[0-3].*) JDK=8 ;; + *) JDK=17 ;; + esac +fi +case "$JDK" in 8|17|21) ;; *) echo "--jdk must be 8, 17 or 21" >&2; exit 2 ;; esac + +mkdir -p "$TARGET" "$LOG_DIR" +command -v docker >/dev/null || { echo "docker is required" >&2; exit 2; } + +# ── 1. the Linux binaries ──────────────────────────────────────────────── +TESTS_JSON="$TARGET/sbt-matrix-tests.json" +if [ -z "$SKIP_BUILD" ]; then + echo "== building the Linux socket-patch and test binaries into $TARGET" >&2 + docker run --rm -m "$BUILD_MEMORY" \ + -v "$ROOT:$ROOT" -w "$ROOT" \ + -v socket-patch-sbt-matrix-cargo:/usr/local/cargo/registry \ + -e CARGO_TARGET_DIR="$TARGET" -e CARGO_BUILD_JOBS="$JOBS" -e CARGO_INCREMENTAL=0 \ + -e CARGO_PROFILE_DEV_DEBUG=0 \ + "$RUST_IMAGE" bash -c ' + set -euo pipefail + cargo build --locked -p socket-patch-cli --bin socket-patch + cargo test --locked -p socket-patch-cli --no-run --message-format=json \ + --test e2e_sbt_build --test e2e_sbt_vendor_build --test e2e_scala_cli_vendor \ + > "$CARGO_TARGET_DIR/sbt-matrix-tests.json" + cargo test --locked -p socket-patch-cli --no-run --message-format=json \ + --features docker-e2e --test docker_e2e_sbt \ + >> "$CARGO_TARGET_DIR/sbt-matrix-tests.json"' \ + || { echo "FAIL linux-build" >&2; exit 1; } + if [ "$(uname -s)" = Linux ]; then + # The build container runs as root; hand the cache back. + docker run --rm -v "$TARGET:$TARGET" "$RUST_IMAGE" chown -R "$(id -u):$(id -g)" "$TARGET" || true + fi +fi +BIN="$TARGET/debug/socket-patch" +[ -x "$BIN" ] || { echo "no Linux binary at $BIN (drop --skip-build)" >&2; exit 2; } + +test_exe() { + # The executable cargo built for integration test $1. + grep '"executable":"' "$TESTS_JSON" 2>/dev/null \ + | sed -nE 's/^.*"target":\{[^}]*"name":"([^"]+)".*"executable":"([^"]+)".*$/\1 \2/p' \ + | awk -v t="$1" '$1 == t { print $2 }' | tail -1 +} + +if [ -n "$BUILD_ONLY" ]; then + echo "$BIN" + echo "$TESTS_JSON" + for t in e2e_sbt_build e2e_sbt_vendor_build e2e_scala_cli_vendor docker_e2e_sbt; do + exe=$(test_exe "$t") + [ -n "$exe" ] && [ -x "$exe" ] || { echo "FAIL linux-build: no $t test binary" >&2; exit 1; } + echo "$exe" + done + exit 0 +fi + +# ── 2. the image ───────────────────────────────────────────────────────── +if [ -n "$REBUILD_IMAGE" ] || ! docker image inspect "$IMAGE" >/dev/null 2>&1; then + echo "== building $IMAGE" >&2 + docker image inspect socket-patch-test-base:latest >/dev/null 2>&1 \ + || docker build -t socket-patch-test-base:latest -f "$ROOT/tests/docker/Dockerfile.base" "$ROOT" \ + || { echo "FAIL image-base" >&2; exit 1; } + docker build -t "$IMAGE" -f "$ROOT/tests/docker/Dockerfile.sbt" "$ROOT/tests/docker" \ + || { echo "FAIL image" >&2; exit 1; } +fi + +# ── 3. the group ───────────────────────────────────────────────────────── +STATUS=0 +report() { + # PASS / FAIL / SKIP per `test ... ` line of log $1. + local log="$1" label="$2" + local lines + lines=$(grep -E '^test [^ ]+ \.\.\. ' "$log" || true) + if [ -z "$lines" ]; then + echo "FAIL $label (no test ran; see $log)" + STATUS=1 + return + fi + while IFS= read -r line; do + name=$(echo "$line" | awk '{print $2}') + case "$line" in + *"... ok") echo "PASS $label $name" ;; + *"... ignored"*) echo "SKIP $label $name" ;; + *) echo "FAIL $label $name"; STATUS=1 ;; + esac + done <<< "$lines" + if grep -q '^SKIP ' "$log"; then + grep '^SKIP ' "$log" | sed "s/^/NOTE $label /" + fi + if ! grep -qE '^test result: ok\.' "$log"; then + STATUS=1 + fi +} + +# In-image: the whole test binary $1 inside the image, sbt native there. +in_image() { + local test="$1"; shift + local exe + exe=$(test_exe "$test") + [ -n "$exe" ] && [ -x "$exe" ] || { echo "FAIL $test (no test binary; drop --skip-build)"; STATUS=1; return; } + local log="$LOG_DIR/$GROUP-$test-$VERSION-jdk$JDK.log" + local seed_env=() + [ "$SEED" = none ] || seed_env=(-e "SOCKET_PATCH_SBT_E2E_SEED=$SEED") + echo "== $test: $GROUP $VERSION, JDK $JDK (log: $log)" >&2 + docker run --rm -m "$MEMORY" \ + -v "$ROOT:$ROOT" -w "$ROOT/crates/socket-patch-cli" \ + -e JAVA_HOME="/opt/jdk$JDK" \ + -e PATH="/opt/jdk$JDK/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \ + -e SOCKET_PATCH_SBT_E2E_SBT=/opt/sbt/bin/sbt \ + -e SOCKET_PATCH_SBT_E2E_VERSION="$VERSION" \ + -e SOCKET_PATCH_SBT_E2E_REQUIRED=1 \ + -e SOCKET_PATCH_SCALA_CLI_E2E_BIN=/usr/local/bin/scala-cli \ + -e SOCKET_PATCH_SCALA_CLI_E2E_REQUIRED=1 \ + -e SOCKET_PATCH_SCALA_CLI_E2E_CACHE=/root/.cache/coursier/v1 \ + -e TMPDIR=/tmp -e RUST_BACKTRACE=1 \ + ${seed_env[@]+"${seed_env[@]}"} \ + "$IMAGE" "$exe" --ignored --test-threads=1 ${1+"$@"} > "$log" 2>&1 + report "$log" "${test}[$VERSION,jdk$JDK]" +} + +# On the host: docker_e2e_sbt cells matching $1 (each cell is a container). +# On Linux the test binary step 1 built runs directly (no host toolchain, +# no recompile per CI leg); elsewhere cargo builds it for the host. +host_cells() { + local filter="$1" + local log="$LOG_DIR/$GROUP-docker_e2e_sbt-$VERSION-jdk$JDK.log" + local exe="" + [ "$(uname -s)" = Linux ] && exe=$(test_exe docker_e2e_sbt) + local mill_versions="" + [ "$GROUP" = mill ] && mill_versions="$VERSION" + echo "== docker_e2e_sbt $filter: $VERSION, JDK $JDK (log: $log)" >&2 + export SOCKET_PATCH_DOCKER_E2E_REQUIRED=1 \ + SOCKET_PATCH_DOCKER_BIN="$BIN" \ + SOCKET_PATCH_SBT_DOCKER_IMAGE="$IMAGE" \ + SOCKET_PATCH_SBT_DOCKER_VERSIONS="$VERSION" \ + SOCKET_PATCH_MILL_DOCKER_VERSIONS="$mill_versions" \ + SOCKET_PATCH_SBT_DOCKER_JDK="$JDK" + if [ -n "$exe" ] && [ -x "$exe" ]; then + "$exe" --test-threads=1 "$filter" > "$log" 2>&1 + else + cargo test --manifest-path "$ROOT/Cargo.toml" -p socket-patch-cli --features docker-e2e \ + --test docker_e2e_sbt -- --test-threads=1 "$filter" > "$log" 2>&1 + fi + report "$log" "docker_e2e_sbt[$VERSION,jdk$JDK]" +} + +filter_args=() +[ -n "$FILTER" ] && filter_args=("$FILTER") +case "$GROUP" in + agent) host_cells "${FILTER:-agent_sbt_}" ;; + hosted) in_image e2e_sbt_build ${filter_args[@]+"${filter_args[@]}"} ;; + vendored) in_image e2e_sbt_vendor_build ${filter_args[@]+"${filter_args[@]}"} ;; + scala-cli) + host_cells "${FILTER:-scala_tools_agent_scala_cli}" + in_image e2e_scala_cli_vendor "${FILTER:-real_tool}" ;; + mill) host_cells "${FILTER:-scala_tools_agent_mill}" ;; +esac + +if [ "$STATUS" = 0 ]; then + echo "RESULT PASS $GROUP $VERSION jdk$JDK" +else + echo "RESULT FAIL $GROUP $VERSION jdk$JDK" +fi +exit "$STATUS" diff --git a/scripts/sbt-warm-seed.sh b/scripts/sbt-warm-seed.sh new file mode 100755 index 000000000..88e59eed8 --- /dev/null +++ b/scripts/sbt-warm-seed.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +# Warm an sbt cache for the real-sbt suites (SOCKET_PATCH_SBT_E2E_SEED) on a +# host runner, then print the variables a CI step appends to $GITHUB_ENV. +# +# scripts/sbt-warm-seed.sh +# +# Boots once through the `sbt` launcher on PATH (`sbt.bat` on +# Windows) and resolves the same tiny Java-only build tests/docker/Dockerfile.sbt +# warms its image with, into the flat seed layout `sbt_e2e_shared::Seed` reads: +# /coursier/v1, /ivy2 and /boot. Without a seed every test +# boots sbt from the network on its own (~1 min each). The suites hard-link +# the seed into each test's private caches, so it is never written by a test. +# +# Prints (stdout): +# SOCKET_PATCH_SBT_E2E_SEED= +# SOCKET_PATCH_SBT_E2E_SBT= +set -euo pipefail + +if [ $# -ne 2 ]; then + sed -n '2,16p' "$0" | sed 's/^# \{0,1\}//' >&2 + exit 2 +fi +VERSION="$1" +SEED="$2" + +windows="" +case "$(uname -s)" in MINGW*|MSYS*|CYGWIN*) windows=1 ;; esac + +native() { + # A path the JVM and the Rust test binaries accept. + if [ -n "$windows" ]; then cygpath -m "$1"; else printf '%s\n' "$1"; fi +} + +if [ -n "$windows" ]; then + launcher="$(command -v sbt.bat || true)" +else + launcher="$(command -v sbt || true)" +fi +[ -n "$launcher" ] || { echo "sbt-warm-seed: no sbt launcher on PATH" >&2; exit 1; } + +mkdir -p "$SEED/coursier/v1" "$SEED/ivy2" "$SEED/boot" "$SEED/global" +seed="$(cd "$SEED" && pwd)" +work="$(mktemp -d)" +trap 'rm -rf "$work"' EXIT +mkdir -p "$work/project" +echo "sbt.version=$VERSION" > "$work/project/build.properties" +printf '%s\n' 'autoScalaLibrary := false' 'crossPaths := false' \ + 'libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.11"' > "$work/build.sbt" + +extra=() +case "$VERSION" in 2.*) extra=(--server) ;; esac + +# The same scrub the suites apply: nothing ambient steers this boot. +unset SBT_OPTS JAVA_OPTS JVM_OPTS JAVA_TOOL_OPTIONS _JAVA_OPTIONS JDK_JAVA_OPTIONS SBT_NATIVE_CLIENT +while IFS= read -r var; do unset "$var"; done < <(env | sed -n 's/^\(COURSIER_[A-Za-z0-9_]*\)=.*/\1/p') + +( + cd "$work" + COURSIER_CACHE="$(native "$seed/coursier/v1")" "$launcher" -batch -no-colors \ + -Dsbt.server.autostart=false \ + "-Dsbt.global.base=$(native "$seed/global")" \ + "-Dsbt.boot.directory=$(native "$seed/boot")" \ + "-Dsbt.ivy.home=$(native "$seed/ivy2")" \ + ${extra[@]+"${extra[@]}"} update >&2 +) +# global/ holds sbt's per-machine state (server sockets, compiled plugins); +# the suites never read it from a seed. +rm -rf "$seed/global" + +echo "SOCKET_PATCH_SBT_E2E_SEED=$(native "$seed")" +echo "SOCKET_PATCH_SBT_E2E_SBT=$(native "$launcher")" diff --git a/scripts/tests/test_ci_e2e_tiers.py b/scripts/tests/test_ci_e2e_tiers.py index bd0ff703a..e058af77f 100644 --- a/scripts/tests/test_ci_e2e_tiers.py +++ b/scripts/tests/test_ci_e2e_tiers.py @@ -178,6 +178,8 @@ def test_jvm_tool_marks_every_jvm_row(self): self.assertEqual(row.get("jvm_tool"), "gradle") elif "maven" in row: self.assertEqual(row.get("jvm_tool"), "maven") + elif "sbt" in row: + self.assertEqual(row.get("jvm_tool"), "sbt") else: self.assertNotIn("jvm_tool", row) self.assertIn(row.get("jvm_tool", "gradle"), ("gradle", "maven", "sbt")) diff --git a/tests/docker/Dockerfile.sbt b/tests/docker/Dockerfile.sbt new file mode 100644 index 000000000..40010f4bf --- /dev/null +++ b/tests/docker/Dockerfile.sbt @@ -0,0 +1,120 @@ +# sbt / Mill / scala-cli test image: base + three JDKs + the sbt launcher, +# Mill and scala-cli, every download sha256-pinned +# (docs/design/sbt-support.md; `docker_e2e_sbt.rs`, feature `docker-e2e`). +# +# The JDKs are copied out of digest-pinned eclipse-temurin images: 8 for +# sbt <= 1.3.13, 17 for later sbt and every Mill / scala-cli cell, 21 for +# the JDK-21 legs. The sbt launcher fetches whatever +# `project/build.properties` pins, so one launcher serves every sbt version +# in SOCKET_PATCH_SBT_DOCKER_VERSIONS. +# +# Run with `docker run --rm -m 2g` and `--test-threads=1`. +# +# Warm caches are baked at build time (last layer): each sbt version in +# SBT_WARM_VERSIONS boots once and resolves the agent fixture's +# dependencies except the patched GAV (commons-text 1.9, which every agent +# cell downloads itself), into the image's ~/.sbt, ~/.ivy2 and +# ~/.cache/coursier; Mill 1.x and scala-cli boot once too. +FROM eclipse-temurin@sha256:9ade16dc859a6db5b79f17912643529d366e8baa01eaab8881d7444fcafec05c AS jdk8 +FROM eclipse-temurin@sha256:5d6042fb8cdc14d614e4e421f52e3211fc5aeadddce44cbf9de8ed37c791f824 AS jdk17 +FROM eclipse-temurin@sha256:3e3c176ffed168beb42c607be9bc1639b466cf00261a0fb04425562c9d0c5c2b AS jdk21 + +FROM socket-patch-test-base:latest + +# eclipse-temurin:8-jdk, :17-jdk and :21-jdk (multi-arch index digests, +# 2026-10-02). +COPY --from=jdk8 /opt/java/openjdk /opt/jdk8 +COPY --from=jdk17 /opt/java/openjdk /opt/jdk17 +COPY --from=jdk21 /opt/java/openjdk /opt/jdk21 +ENV JAVA_HOME=/opt/jdk17 +ENV PATH=/opt/jdk17/bin:$PATH + +ARG SBT_LAUNCHER_VERSION=1.13.0 +ARG SBT_LAUNCHER_SHA256=06806805ffd26232727326216766ed4793b549f8c1e6ffeef2e610db7245b698 +ARG MILL_011_VERSION=0.11.13 +ARG MILL_011_SHA256=7d21c1e14cad4109a9edd980a2fbd1e386032a1b3b78db1627d68752dafa3c70 +ARG MILL_012_VERSION=0.12.17 +ARG MILL_012_SHA256=7126698a51526c29aa53c53fb5e0d5b64c979108127e84b33cc9e9dde9e43be0 +ARG MILL_1_VERSION=1.1.10 +ARG MILL_1_SHA256=63538d1cb27c29dd36821d832a964580e3bf046d956f6e6b3cd55d1f0124a561 +ARG SCALA_CLI_VERSION=1.17.1 +ARG SCALA_CLI_SHA256_AMD64=4186bfac6552097fbfd3939bdf2ecdec1cb55baafcbf6259bef5c04e08858eb3 +ARG SCALA_CLI_SHA256_ARM64=a12ed53f4723f3e9312a2383e47664b4beaccf2be366cff40adf6b054426156f + +RUN set -eu \ + && cd /tmp \ + && curl -fsSL --retry 3 -o sbt.tgz \ + "https://github.com/sbt/sbt/releases/download/v${SBT_LAUNCHER_VERSION}/sbt-${SBT_LAUNCHER_VERSION}.tgz" \ + && echo "${SBT_LAUNCHER_SHA256} sbt.tgz" | sha256sum -c - \ + && tar -C /opt -xzf sbt.tgz \ + && ln -s /opt/sbt/bin/sbt /usr/local/bin/sbt \ + && rm -f sbt.tgz + +# One launcher script per Mill line, installed as mill-. +RUN set -eu \ + && cd /tmp \ + && curl -fsSL --retry 3 -o mill-011 \ + "https://github.com/com-lihaoyi/mill/releases/download/${MILL_011_VERSION}/${MILL_011_VERSION}" \ + && echo "${MILL_011_SHA256} mill-011" | sha256sum -c - \ + && install -m 0755 mill-011 "/usr/local/bin/mill-${MILL_011_VERSION}" \ + && curl -fsSL --retry 3 -o mill-012 \ + "https://repo1.maven.org/maven2/com/lihaoyi/mill-dist/${MILL_012_VERSION}/mill-dist-${MILL_012_VERSION}-mill.sh" \ + && echo "${MILL_012_SHA256} mill-012" | sha256sum -c - \ + && install -m 0755 mill-012 "/usr/local/bin/mill-${MILL_012_VERSION}" \ + && curl -fsSL --retry 3 -o mill-1 \ + "https://repo1.maven.org/maven2/com/lihaoyi/mill-dist/${MILL_1_VERSION}/mill-dist-${MILL_1_VERSION}-mill.sh" \ + && echo "${MILL_1_SHA256} mill-1" | sha256sum -c - \ + && install -m 0755 mill-1 "/usr/local/bin/mill-${MILL_1_VERSION}" \ + && rm -f mill-011 mill-012 mill-1 + +RUN set -eu \ + && cd /tmp \ + && case "$(dpkg --print-architecture)" in \ + amd64) arch=x86_64; sum="${SCALA_CLI_SHA256_AMD64}";; \ + arm64) arch=aarch64; sum="${SCALA_CLI_SHA256_ARM64}";; \ + *) echo "unsupported architecture" >&2; exit 1;; \ + esac \ + && curl -fsSL --retry 3 -o scala-cli.gz \ + "https://github.com/VirtusLab/scala-cli/releases/download/v${SCALA_CLI_VERSION}/scala-cli-${arch}-pc-linux.gz" \ + && echo "${sum} scala-cli.gz" | sha256sum -c - \ + && gunzip scala-cli.gz \ + && install -m 0755 scala-cli /usr/local/bin/scala-cli \ + && rm -f scala-cli \ + && /opt/jdk8/bin/java -version \ + && /opt/jdk21/bin/java -version \ + && java -version \ + && scala-cli version --cli-version | grep -Fx "${SCALA_CLI_VERSION}" + +# Warm caches (see the header). sbt <= 1.3.13 runs on JDK 8; sbt 2 in +# server mode. The fixture build is the agent cells' one minus the patched +# GAV: commons-lang3 3.11 is commons-text 1.9's only dependency. +# 0.13.18 too: an unwarmed Ivy line resolves its whole build definition +# from the network, serially, into each test's private Ivy home (its hosted +# group took ~1380 s that way, ~420 s warm). The Coursier lines (1.3.13, +# 1.9.9) boot quickly cold and stay out: the scala-cli real-tool test serves +# the image's Central cache from memory, which more lines would bloat past +# its 2g container. +ARG SBT_WARM_VERSIONS="0.13.18 1.2.8 1.13.0 2.0.9" +RUN set -eu \ + && for v in ${SBT_WARM_VERSIONS}; do \ + d="/tmp/warm-$v"; mkdir -p "$d/project"; \ + echo "sbt.version=$v" > "$d/project/build.properties"; \ + printf '%s\n' 'autoScalaLibrary := false' 'crossPaths := false' \ + 'libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.11"' > "$d/build.sbt"; \ + case "$v" in 0.*|1.[0-3].*) jdk=/opt/jdk8;; *) jdk=/opt/jdk17;; esac; \ + case "$v" in 2.*) extra=--server;; *) extra=;; esac; \ + (cd "$d" && JAVA_HOME="$jdk" PATH="$jdk/bin:$PATH" \ + sbt -batch -no-colors -Dsbt.server.autostart=false $extra update); \ + rm -rf "$d"; \ + done \ + && d=/tmp/warm-mill && mkdir -p "$d/foo/src" && cd "$d" \ + && printf '%s\n' '//| mill-version: '"${MILL_1_VERSION}" 'package build' 'import mill.*, scalalib.*' \ + 'object foo extends ScalaModule {' ' def scalaVersion = "2.13.16"' \ + ' def mvnDeps = Seq(mvn"org.apache.commons:commons-lang3:3.11")' '}' > build.mill \ + && "mill-${MILL_1_VERSION}" --no-daemon --ticker false show foo.compileClasspath > /dev/null \ + && cd / && rm -rf "$d" \ + && d=/tmp/warm-scala-cli && mkdir -p "$d" && cd "$d" \ + && printf '%s\n' '//> using scala 3.3.6' '//> using dep org.apache.commons:commons-lang3:3.11' > project.scala \ + && echo '@main def m() = println("warm")' > Main.scala \ + && scala-cli compile . --server=false > /dev/null \ + && cd / && rm -rf "$d"