Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
aca8b1c
Add a shared JVM cache-root and project-dependency seam
mikolalysenko Oct 2, 2026
601c6b4
Extract the real-Gradle test harness into gradle_build_common
mikolalysenko Oct 2, 2026
49a2be3
Extract the hosted Maven API fake into hosted_maven_common
mikolalysenko Oct 2, 2026
78f10d4
Isolate CLI test children from ambient Gradle and JVM caches
mikolalysenko Oct 2, 2026
1c5ff86
Read Gradle 9's launcher JVM banner and take extra Gradle args
mikolalysenko Oct 2, 2026
336eb45
Add a deterministic fake Maven Central for the JVM capstones
mikolalysenko Oct 2, 2026
90cec6c
Scaffold the Gradle CI tiers around a jvm_tool matrix key
mikolalysenko Oct 2, 2026
90f5936
Clear the clippy lints the new JVM test helpers introduced
mikolalysenko Oct 2, 2026
4cba7fe
Isolate the autocrlf clone from global git config and test it
mikolalysenko Oct 2, 2026
440b09d
Add a pure Gradle model: tokenizer, line endings, version selectors
mikolalysenko Oct 2, 2026
337ada3
Add Gradle user-home resolution and dependency-lock parsing
mikolalysenko Oct 2, 2026
6a9d710
Add the Gradle script graph and its queries
mikolalysenko Oct 2, 2026
8b235de
Make the Gradle classpath print tasks configuration-cache safe
mikolalysenko Oct 2, 2026
55c4b15
Key the Gradle prefix guard and zero-test checks per suite
mikolalysenko Oct 2, 2026
1a6a43e
Close fail-unsafe gaps in the Gradle script graph
mikolalysenko Oct 2, 2026
7578720
Resolve the Gradle home like the JVM and read wrapper init.d
mikolalysenko Oct 2, 2026
d0d82e5
Match Gradle's range patterns and single-value exact selectors
mikolalysenko Oct 2, 2026
7f48f0f
Merge WP0: Foundation: pure Gradle L1 module (dsl, script graph, lock…
mikolalysenko Oct 2, 2026
29d5073
Merge WP5a: Shared harness (real-Gradle e2e helpers, fake Central/hos…
mikolalysenko Oct 2, 2026
9602324
Crawl Gradle's files-2.1 cache again
mikolalysenko Oct 2, 2026
8976973
Expand Gradle version dirs into their hash-dir copies
mikolalysenko Oct 2, 2026
aad66aa
Discover Gradle caches and gate ~/.m2 on mavenLocal()
mikolalysenko Oct 2, 2026
2825a44
Report Gradle discovery in scan and add the discovery suite
mikolalysenko Oct 2, 2026
77bad59
Resolve Maven PURLs from ~/.m2 first
mikolalysenko Oct 2, 2026
68bb804
Harden Gradle discovery's safety probes and PURL lookup
mikolalysenko Oct 2, 2026
36bd67f
Check every Gradle copy in scan and tighten its Gradle notes
mikolalysenko Oct 2, 2026
8066ae4
Merge WP1: Discovery: Gradle cache roots, files-2.1 crawl, installed_…
mikolalysenko Oct 2, 2026
2b1d559
Add the JVM jar swap and Gradle-aware verification to core
mikolalysenko Oct 2, 2026
dd6dbef
Fix vendored Gradle wiring gaps and share its wiring API
mikolalysenko Oct 2, 2026
d60d6af
Patch every Maven copy a build consumes in agent mode
mikolalysenko Oct 2, 2026
0f35359
Re-hash every consumed JVM copy when generating VEX
mikolalysenko Oct 2, 2026
cffbc7b
Test agent mode over hermetic Gradle caches and m2 sidecars
mikolalysenko Oct 2, 2026
b99fee9
Treat a Gradle copy without the record's files as not installed
mikolalysenko Oct 2, 2026
98dc3b7
Add the real-Gradle agent suite and cache canaries
mikolalysenko Oct 2, 2026
6b515cc
Keep committed classifier jars and quiet in-sync Gradle re-runs
mikolalysenko Oct 2, 2026
5caf36d
Test vendored Gradle fixes through the CLI and real Gradle
mikolalysenko Oct 2, 2026
336fde3
Document the vendored Gradle contract
mikolalysenko Oct 2, 2026
55f30df
Fix WP2 review findings in the JVM jar swap and Gradle guards
mikolalysenko Oct 2, 2026
7844d54
Close vendored Gradle review gaps in VEX, repair and legacy roots
mikolalysenko Oct 2, 2026
d850139
Merge WP2: Agent mode: all-copies Maven/Gradle fan-out via installed_…
mikolalysenko Oct 2, 2026
5d7e8a3
Merge WP3: Vendored Gradle fixes (#395 #428 #429 #461 #487 #511 #533)…
mikolalysenko Oct 2, 2026
310527f
Clear clippy warnings in the vendored Gradle capstones
mikolalysenko Oct 2, 2026
35c88b6
Plan hosted Gradle wiring with an owned settings script
mikolalysenko Oct 2, 2026
d676331
Discover hosted Gradle pins from the owned index
mikolalysenko Oct 2, 2026
6626198
Restore hosted Gradle pins to upstream without the network
mikolalysenko Oct 2, 2026
3892065
Take over vendored Gradle entries and snapshot Gradle files on eject
mikolalysenko Oct 2, 2026
1523a54
Leave Gradle resolution failures to Gradle and fix eject rollback
mikolalysenko Oct 2, 2026
8f67eb7
Test hosted Gradle against real Gradle 6.9 through 9.8
mikolalysenko Oct 2, 2026
9880c80
Gate Gradle takeovers and keep user-owned settings files on restore
mikolalysenko Oct 3, 2026
067dd34
Make the hosted Gradle e2e tests prove what they claim
mikolalysenko Oct 3, 2026
7493a34
Merge WP4: Hosted Gradle: owned settings script with substitution + r…
mikolalysenko Oct 3, 2026
24ff4c8
Run the Gradle multi-project capstone without Maven
mikolalysenko Oct 3, 2026
39e0e09
Document every Gradle code in the CLI contract and test it
mikolalysenko Oct 3, 2026
cd57aba
Document Gradle support in the ecosystem guide, testing and changelog
mikolalysenko Oct 3, 2026
89d6b8d
Scan all non-test source in the Gradle contract test
mikolalysenko Oct 3, 2026
c2033b4
Claim only the Gradle platforms actually tested
mikolalysenko Oct 3, 2026
136d042
Merge WP5b: Finish: drop Maven seed, docs, CLI contract, changelog, n…
mikolalysenko Oct 3, 2026
520f374
Merge origin/main into feat/gradle-support
mikolalysenko Oct 3, 2026
4b7948e
Fix Gradle CI: 6.9 JDK ceiling 15, LF hosted script, CC-safe printSou…
mikolalysenko Oct 3, 2026
664a616
Run the selector golden check in every hosted cell; widen the grid's …
mikolalysenko Oct 3, 2026
d69a672
Gradle agent: restore unread m2 copies, judge partly-held copies, pro…
mikolalysenko Oct 3, 2026
ed5f3c7
Gradle hosted/vendored: review round 1 fixes
mikolalysenko Oct 3, 2026
f1b0079
Gradle grid: JDK 15 ceiling from Zulu (Temurin never shipped 15)
mikolalysenko Oct 3, 2026
7f8f12d
Gradle: review round 2 fixes (m2 rollback, above-base locks, latest.*…
mikolalysenko Oct 3, 2026
73bec9b
Gradle e2e: retry a build whose single-use daemon died unanswered
mikolalysenko Oct 3, 2026
33f59a9
Gradle: review round 3 (unreadable m2 copy, unreadable hosted build f…
mikolalysenko Oct 3, 2026
bb67bca
Add sbt, Mill and scala-cli support to core
mikolalysenko Oct 3, 2026
fdbfc2c
Wire sbt, Mill and scala-cli through the CLI and its tests
mikolalysenko Oct 3, 2026
c62a772
sbt CI, Docker image and the compatibility matrix
mikolalysenko Oct 3, 2026
74873ef
Document sbt, Mill and scala-cli
mikolalysenko Oct 3, 2026
fbb39e2
Join Coursier and Ivy copies to the every-copy Maven fan-out
mikolalysenko Oct 3, 2026
bfd74bc
Align sbt docs, tests and attributes with the Gradle branch
mikolalysenko Oct 3, 2026
c8084bb
Fix mixed sbt + Gradle roots and Ivy copies after the rebase
mikolalysenko Oct 3, 2026
6ccf547
Fix sbt/scala-cli tests and file: URI parsing on Windows
mikolalysenko Oct 3, 2026
dc62ac3
Read Gradle cache and build files through the FIFO-safe reader
claude Oct 3, 2026
e568897
Close Bugbot findings: Ivy pom fallback, eject snapshot reads, sbt pi…
claude Oct 3, 2026
5b56c25
Merge remote-tracking branch 'origin/feat/gradle-support' into feat/s…
claude Oct 3, 2026
4864cc9
Open the FIFO watchdog's writer non-blocking in the Gradle FIFO test
claude Oct 3, 2026
beaa2bf
Keep the uuid out of the sbt hosted not-JSON panic
claude Oct 3, 2026
a205939
Merge remote-tracking branch 'origin/feat/gradle-support' into feat/s…
claude Oct 3, 2026
6a358e6
Make the sbt hosted not-JSON panic message static
claude Oct 3, 2026
ebef522
Refuse a non-pristine Gradle before-blob before writing; drop header-…
claude Oct 5, 2026
9a32b34
Close sbt review gaps: VEX evidence gates, overwrite guard, quadratic…
claude Oct 5, 2026
f9cfcab
Merge remote-tracking branch 'origin/feat/gradle-support' into feat/s…
claude Oct 5, 2026
9587240
Expect the whole-run refusal's exit code in the sbt unreadable-file test
claude Oct 5, 2026
3bd1e36
Predict the Gradle before-blob refusal on dry runs; guard the blob read
claude Oct 5, 2026
e5cdf2f
Merge remote-tracking branch 'origin/feat/gradle-support' into feat/s…
claude Oct 5, 2026
650f561
Gate sbt VEX attestation on resolvers reassignment and build.sbt.lock
claude Oct 5, 2026
349e9f8
Drop CHANGELOG entry from this PR
mikolalysenko Oct 5, 2026
3deae85
Drop CHANGELOG entry from this PR
mikolalysenko Oct 5, 2026
8acab8c
Merge origin/main into feat/gradle-support
claude Oct 5, 2026
46c9d4b
Merge feat/gradle-support into feat/sbt-support
claude Oct 5, 2026
4a92588
Fix tests broken by the feat/gradle-support merge
claude Oct 5, 2026
c3f12c6
Merge remote-tracking branch 'origin/main' into feat/sbt-support
claude Oct 5, 2026
27c74e6
Route Gradle digests through utils::digest (port of #878)
claude Oct 5, 2026
d836a59
Compare sbt and scala-cli owned files line-ending-blind
claude Oct 5, 2026
bcdaa4c
Spawn sbt and scala-cli test CLIs through the hermetic builder
claude Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,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
62 changes: 54 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -587,13 +587,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
Expand Down Expand Up @@ -673,18 +674,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: |
Expand Down Expand Up @@ -1209,6 +1221,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.
Expand Down Expand Up @@ -1425,6 +1443,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
Expand Down Expand Up @@ -1570,6 +1607,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 }}
Expand Down Expand Up @@ -1716,13 +1755,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
Expand Down Expand Up @@ -1771,13 +1810,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
Expand Down
Loading
Loading