GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Merge main into agent/fix-go-unpruned-stale-zip · SocketDev/socket-patch@6ce888d

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • .github/workflows
    • ci.yml
    • release.yml
    • vlt-compatibility.yml
    • vlt-serve-watchdog.yml
  • CHANGELOG.md
  • Cargo.lock
  • Cargo.toml
  • crates
    • socket-patch-cli
      • CLI_CONTRACT.md
      • src
        • args.rs
        • commands
          • agent_download.rs
          • apply.rs
          • bun_preflight.rs
          • get.rs
          • mod.rs
          • rollback.rs
          • scan
            • hosted.rs
            • mod.rs
            • render.rs
            • vendor_flow.rs
          • vendor.rs
          • vex.rs
          • vex_sources.rs
          • vlt_heal.rs
          • vlt_preflight.rs
      • tests
        • cli_global_args.rs
        • common_selftests.rs
        • common
          • bundler_e2e.rs
          • cache_env.rs
          • clap_parse.rs
          • jvm_env.rs
          • mod.rs
          • oracle.rs
        • docker_e2e_vendor_composer.rs
        • e2e_gem_native_ext_build.rs
        • e2e_hosted_production.rs
        • e2e_redirect_vlt_build.rs
        • e2e_vex_build
          • pdm.rs
        • e2e_vex_lockfile
          • vlt.rs
        • get
          • get_render.rs
        • hosted_memory_engine.rs
        • hosted_memory_parity.rs
        • in_process_redirect
          • vlt.rs
        • in_process_vendor_bun_takeover
          • vlt.rs
        • in_process_vendor_npm_v1_takeover.rs
        • manifest_path_ledger_root.rs
        • mode_migration_pypi.rs
        • scan
          • hosted_symlinked_files.rs
          • scan_render.rs
        • vendor
          • in_process_vendor_bun.rs
        • vlt-leg-manifest.json
        • vlt_e2e_common
          • fixture.rs
          • mod.rs
        • vlt_hosted_common
          • mod.rs
    • socket-patch-core
      • src
        • api
          • client.rs
        • crawlers
          • deno_crawler.rs
          • go_crawler.rs
          • maven_crawler.rs
          • npm_crawler.rs
          • python_crawler.rs
        • formats/maven
          • mod.rs
          • trusted_checksums.rs
        • hosted
          • engine.rs
          • governing_root.rs
          • memory
            • stages.rs
          • mod.rs
          • vlt.rs
        • lib.rs
        • patch
          • copy_tree.rs
          • gem_ext.rs
          • jvm_jar.rs
          • mod.rs
          • redirect
            • group_equivalence_tests.rs
            • mod.rs
            • upstream
              • maven.rs
            • vlt.rs
            • vlt_heal.rs
            • vlt_preflight.rs
        • test_env.rs
        • test_env_tests.rs
        • utils
          • fs.rs
          • pnpm_workspace.rs
          • process.rs
          • socket_cli_config.rs
          • workspace_globs.rs
        • vendor
          • gem.rs
          • go_workspace.rs
          • lock_inventory
            • mod.rs
            • npm_family.rs
            • pnpm.rs
            • tests.rs
          • maven_repo.rs
          • mod.rs
          • npm_flavor.rs
          • refusals.rs
        • vex
          • discover
            • gem.rs
            • golang.rs
            • maven.rs
            • mod.rs
            • npm.rs
          • verify.rs
      • tests
        • crawler_deno_e2e.rs
        • crawler_npm_e2e.rs
        • fixtures/vex-discover-golden
          • redirect-maven.json
        • upstream_restore_golden.rs
  • docs
    • ecosystems.md
    • testing
      • hosted-production-e2e.md
      • vlt-compatibility.md
      • vlt-coverage.json
  • npm
    • socket-patch-android-arm64
      • package.json
    • socket-patch-darwin-arm64
      • package.json
    • socket-patch-darwin-x64
      • package.json
    • socket-patch-linux-arm-gnu
      • package.json
    • socket-patch-linux-arm-musl
      • package.json
    • socket-patch-linux-arm64-gnu
      • package.json
    • socket-patch-linux-arm64-musl
      • package.json
    • socket-patch-linux-ia32-gnu
      • package.json
    • socket-patch-linux-ia32-musl
      • package.json
    • socket-patch-linux-x64-gnu
      • package.json
    • socket-patch-linux-x64-musl
      • package.json
    • socket-patch-win32-arm64
      • package.json
    • socket-patch-win32-ia32
      • package.json
    • socket-patch-win32-x64
      • package.json
    • socket-patch
      • package-lock.json
      • package.json
  • scripts
    • backtest-pdm.py
    • backtest-vlt.py
    • tests
      • test_backtest_harnesses.py
      • test_ci_vlt_rows.py
      • test_vlt_coverage.py

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎.github/workflows/ci.yml‎

Copy file name to clipboardExpand all lines: .github/workflows/ci.yml
+6-5Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,8 +1271,10 @@ jobs:
12711271
# Ruby <= 3.3 and 1.17-2.1 need Ruby <= 3.1 (`untaint`). 2.7.2
12721272
# (no boundary of its own) is in e2e-full.
12731273
# Hosted and vendored share each era's leg (one Ruby + bundler
1274-
# setup; the run step loops over `suite`).
1275-
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build, ruby: '3.4', bundler: '4.0.21'}
1274+
# setup; the run step loops over `suite`), as does the agent-mode
1275+
# C-extension rebuild capstone (#1996), which needs the same Ruby
1276+
# plus the runner's C compiler.
1277+
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build e2e_gem_native_ext_build, ruby: '3.4', bundler: '4.0.21'}
12761278
# The live-API smoke suites (e2e_npm, e2e_pypi, e2e_gem,
12771279
# e2e_scan) are intentionally NOT in the PR matrix — their
12781280
# `#[ignore]`-gated tests hit the real public proxy at
@@ -2008,7 +2010,7 @@ jobs:
20082010
# composer 1.10 keeps the PHP 8.2 it has always run on here
20092011
# (composer-compatibility.yml runs 1.10.28 on 8.1).
20102012
- {os: ubuntu-latest, suite: e2e_vendor_composer_build e2e_redirect_composer_build, composer: '1', php: '8.2'}
2011-
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build, ruby: '3.1', bundler: '1.17.3'}
2013+
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build e2e_gem_native_ext_build, ruby: '3.1', bundler: '1.17.3'}
20122014
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build, ruby: '3.1', bundler: '2.1.4'}
20132015
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build, ruby: '3.1', bundler: '2.2.33'}
20142016
- {os: ubuntu-latest, suite: e2e_redirect_gem_build e2e_vendor_gem_build, ruby: '3.3', bundler: '2.5.23'}
@@ -2917,8 +2919,7 @@ jobs:
29172919
--ignored --nocapture --test-threads=4 2>&1 | tee hosted-e2e.log || status=$?
29182920
echo "::endgroup::"
29192921
if [ "$status" -eq 0 ]; then
2920-
# The vlt leg (probe-driven: the clean refusal while the artifact
2921-
# is content-encoded, the full install proof once it is not).
2922+
# The vlt leg: the hosted pin and the fresh-checkout install proof.
29222923
python3 scripts/check-vlt-legs.py \
29232924
--manifest crates/socket-patch-cli/tests/vlt-leg-manifest.json hosted-e2e.log
29242925
exit $?
Collapse file

‎.github/workflows/release.yml‎

Copy file name to clipboardExpand all lines: .github/workflows/release.yml
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,14 @@ jobs:
196196
197197
- name: Upload artifact (tar.gz)
198198
if: matrix.archive == 'tar.gz'
199-
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
199+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
200200
with:
201201
name: socket-patch-${{ matrix.target }}
202202
path: socket-patch-${{ matrix.target }}.tar.gz
203203

204204
- name: Upload artifact (zip)
205205
if: matrix.archive == 'zip'
206-
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
206+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
207207
with:
208208
name: socket-patch-${{ matrix.target }}
209209
path: socket-patch-${{ matrix.target }}.zip
@@ -251,7 +251,7 @@ jobs:
251251
sums-digest: ${{ steps.sums.outputs.digest }}
252252
steps:
253253
- name: Download all artifacts
254-
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
254+
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
255255
with:
256256
path: artifacts
257257
merge-multiple: true
Collapse file

‎.github/workflows/vlt-compatibility.yml‎

Copy file name to clipboardExpand all lines: .github/workflows/vlt-compatibility.yml
+4-5Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ on:
7070
- 'crates/socket-patch-cli/src/commands/vendor.rs'
7171
- 'crates/socket-patch-cli/src/commands/vendored_backend/**'
7272
- 'crates/socket-patch-cli/src/commands/get.rs'
73-
- 'crates/socket-patch-cli/src/commands/vlt_preflight.rs'
7473
- 'crates/socket-patch-cli/src/commands/scan/**'
7574
- 'crates/socket-patch-cli/src/commands/vex*'
7675
- 'crates/socket-patch-cli/tests/common/**'
@@ -466,10 +465,10 @@ jobs:
466465
# minutes (EAI_NONAME) while the service is up; see the action.
467466
uses: ./.github/actions/pin-socket-hosts
468467
- name: Backtest against production
469-
# Every hosted cell probes the artifact first; it records
470-
# blocked-by-server-encoding only when that probe saw a non-identity
471-
# Content-Encoding and the CLI refused cleanly. Any other failure is an
472-
# error.
468+
# Every hosted cell probes the artifact first; a must-patch cell
469+
# records blocked-by-server-encoding (without running the CLI) only
470+
# when that probe saw a non-identity Content-Encoding. Any other
471+
# failure is an error.
473472
shell: bash
474473
env:
475474
VLT_TEST_VERSION: ${{ matrix.vlt }}
Collapse file

‎.github/workflows/vlt-serve-watchdog.yml‎

Copy file name to clipboardExpand all lines: .github/workflows/vlt-serve-watchdog.yml
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name: vlt serve watchdog
33
# vlt hashes the wire body of a registry tarball and asks for
44
# `accept-encoding: gzip;q=1.0, identity;q=0.5`, so a patch artifact that
55
# patch.socket.dev (or its CDN) serves content-encoded fails `EINTEGRITY` on
6-
# every vlt release, and hosted mode refuses to pin it
7-
# (`redirect_vlt_artifact_unverifiable`). This job fetches the public free
6+
# every vlt release (hosted mode pins it without downloading it, relying on
7+
# the server's `Cache-Control: no-transform`). This job fetches the public free
88
# minimist artifact exactly that way and fails when the response is
99
# content-encoded or its sha512 differs from the API's integrity, which pages
1010
# through the repository's workflow-failure notification.
Collapse file

‎CHANGELOG.md‎

Copy file name to clipboardExpand all lines: CHANGELOG.md
+125Lines changed: 125 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,131 @@ a version without a non-empty section in this file.
2323

2424
## [Unreleased]
2525

26+
## [5.1.0] — 2026-11-06
27+
28+
### Added
29+
30+
- **RubyGems.**
31+
- **Agent mode patches gems with native (C) extensions for real.** When
32+
`apply` (or `scan` / `get --mode agent`) patches a gem whose patch changes
33+
native-extension sources (such as `ext/**/*.c` or an `extconf.rb`), it
34+
now rebuilds the gem's extensions with RubyGems' own builder, the step
35+
`gem pristine --extensions` runs, using the Ruby that owns the gem home.
36+
Both the copy under `extensions/<platform>/<abi>/` and the copy under the
37+
gem's `lib/` are rebuilt, so Ruby stops loading the stale install-time
38+
`.so` / `.bundle`. A build that fails puts the original sources and build
39+
back (`native_extension_build_failed`), and a copy that can't be rebuilt
40+
in place (a precompiled platform gem, a Bundler git checkout, no matching
41+
Ruby) is refused with `native_extensions_unsupported` before anything is
42+
written. Sources an earlier release patched without a rebuild are rebuilt
43+
on the next `apply` (`native_extension_rebuilt` warning). `vex` and
44+
`apply --check` attest such a patch only once its rebuild is recorded,
45+
and otherwise report `native_extension_not_rebuilt`. `rollback` and
46+
`remove` restore the original build. Callers that compile the extension
47+
themselves can opt out with `--no-gem-native-rebuild` (env
48+
`SOCKET_NO_GEM_NATIVE_REBUILD`): the sources are written without a
49+
rebuild, with a `native_extension_not_rebuilt` warning, and `vex` does
50+
not attest them. Hosted copies are unaffected, since RubyGems compiles
51+
the patched gem itself (#1996, #1998).
52+
53+
### Fixed
54+
55+
- **RubyGems.**
56+
- With Bundler 4.1 `override "other", with: "gem", in: "parent"`, hosted
57+
`rollback` and `remove` treat the override target as transitive and give
58+
back the original lock and Gemfile byte for byte, instead of writing a
59+
new exact `gem "gem", "x.y.z"` pin that blocked later upgrades (#1989,
60+
#1991).
61+
- Gemspec directives and development dependencies are read as Ruby code:
62+
`=begin`/`=end` blocks, heredoc bodies and `__END__` data are skipped, so
63+
a commented-out dev dependency no longer adds a bogus requirement and a
64+
heredoc no longer refuses the Gemfile (#1932, #1936).
65+
- **npm family.**
66+
- pnpm workspace globs with brace sets and character classes
67+
(`packages/{a,b}`, `packages/[ab]*`) are read the way pnpm reads them in
68+
every mode instead of being refused or read as every directory; shapes
69+
pnpm reads its own way (extglobs, `[!a]`, a `+` after a class, stepped or
70+
punctuation-spanning brace ranges) are still refused, and commented
71+
importer lines in `pnpm-lock.yaml` are ignored (#1846, #1863).
72+
- Quoted values, YAML escapes and duplicate keys in `pnpm-workspace.yaml`,
73+
`.yarnrc.yml` and `.modules.yaml` decode one way, as pnpm reads them, so
74+
settings such as `modulesDir` or `lockfileDir` no longer resolve to
75+
different paths depending on the command (#1918, #1973).
76+
- yarn classic's `.yarnrc` is read as yarn 1.22 reads the whole file:
77+
`--modules-folder 'deps'` no longer sends the crawler to a folder yarn
78+
never installs into, and a file yarn can't parse sets nothing (#1901,
79+
#1915).
80+
- A malformed `package.json` `workspaces` field (a non-string item, `null`,
81+
the wrong type) is judged the same way everywhere; the Bun member walk
82+
falls back to `bun.lock` instead of reading no members (#1900, #1971).
83+
- `apply` and `rollback` no longer touch package copies inside a store
84+
nested in another store's entry, which `scan` never reports, and keep
85+
the peer-variant copies of a project that lives under `~/.bun`,
86+
`~/.deno` or `~/.vlt` (#1899, #1986).
87+
- Hosted npm warns `redirect_npm_omit_lockfile_registry_resolved` when any
88+
npm config layer sets `omit-lockfile-registry-resolved`, which makes the
89+
next `npm install` drop the hosted URL and fail with `EINTEGRITY`, and
90+
names where it is set and the remedies (#1871, #1872).
91+
- **PyPI.**
92+
- A requirements line pinned through an environment variable
93+
(`six==${SIXV}`) is refused by `vendor` with
94+
`pypi_requirement_env_templated`, and `vendor --check` and `vex` read it
95+
as possibly installing any release, so the patch is no longer attested
96+
while `pip install -r` can install the unpatched one (#1873, #1874).
97+
- A hosted scan of a Python project with no lockfile the rewriters read now
98+
warns `redirect_pypi_no_lockfile`, naming the files looked for and the
99+
project's own lock command, instead of passing silently (#638, #1885).
100+
- After a hosted rollback, a vendored rollback or `vendor --revert` of a
101+
requirements-file pin, the reinstall advisory covers pip and names the
102+
requirements files to reinstall from (#1953, #1954).
103+
- The hosted Pipenv stale-install warning ends with the same runnable
104+
remedy as vendored mode and never prints an option-like package name
105+
into a shell command (#1878, #1883).
106+
- A `poetry.lock` in an old format (0, 1.0, 1.1) keeps its "written by
107+
Poetry < 1.4" warnings and refusals even when a hand-merged header claims
108+
a newer Poetry (#1847, #1865).
109+
- **Go.** In a go 1.16 (unpruned) module where a dependency imports a fork
110+
that the root `go.mod` replaces with the patched module, `apply`,
111+
`apply --check`, hosted mode and `vex` read the module graph to tell
112+
whether the patch is really built, instead of reporting it applied while
113+
`go build` linked the unpatched code (#1840, #1843).
114+
- **Maven.** A Maven 4 root that builds its subdirectories implicitly
115+
(model 4.1.0, `pom` packaging, no `<subprojects>`) is treated as a reactor
116+
by hosted mode, `vex` and the Maven cache scope, not only by vendored mode,
117+
so a root-only pin is no longer attested while a module keeps its own
118+
version (#1809, #1886).
119+
- **Vendoring.**
120+
- Vendored dry runs leave already-vendored patches out of the "Would
121+
download and vendor" headline and list them as skipped, matching the wet
122+
run and the JSON (#1850, #1856).
123+
- Run from a workspace member with no lockfile of its own, a vendored
124+
`scan`, `get` or `vendor` names the lock that installs the member and
125+
where to run from (#1904, #1913).
126+
- npm package-lock packages installed from a URL or git spec, and workspace
127+
members, are refused before their patch is downloaded; dry runs preview
128+
them as refused and they no longer hold a `--max-new-patches` rollout
129+
slot (#1976, #1977).
130+
- In a vlt project, `vendor` no longer requests service downloads for
131+
packages it then refuses (#1909, #1947).
132+
- **General.**
133+
- The nested-project remedy quotes its path for the shell it prints for,
134+
including Windows and `%` (#1859, #1884).
135+
- Patch and vendor download errors read the same on every path (size
136+
limit, HTTP status with a bounded body excerpt), and artifact downloads
137+
log under `--debug` (#1869, #1870).
138+
139+
### Maintenance
140+
141+
- Code consolidation with no output change: one lock-rewrite driver for
142+
Poetry and PDM (#1898) and module sweeps across the CLI and core
143+
(#1855, #1864, #1875, #1884, #1892, #1897, #1903, #1907, #1914, #1920,
144+
#1923, #1929, #1939, #1948, #1967, #1975, #1985, #1990).
145+
- Test and CI infrastructure: shared test env guard, docker harness, PTY
146+
runner, `copy_tree` and apply fixtures; hermetic children scrub color
147+
variables; failing tests are annotated in CI; offline bun.lockb rollback
148+
mock and a Windows venv layout in the PyPI fixture (#1891, #1890, #1905,
149+
#1944, #1955, #1964, #1972, #1978, #1988, #1994).
150+
26151
## [5.0.1] — 2026-10-13
27152

28153
### Fixed
Collapse file

‎Cargo.lock‎

Copy file name to clipboardExpand all lines: Cargo.lock
+4-4Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Collapse file

‎Cargo.toml‎

Copy file name to clipboardExpand all lines: Cargo.toml
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ default-members = [
1414
resolver = "2"
1515

1616
[workspace.package]
17-
version = "5.0.1"
17+
version = "5.1.0"
1818
edition = "2021"
1919
license = "MIT"
2020
repository = "https://github.com/SocketDev/socket-patch"
2121

2222
[workspace.dependencies]
23-
socket-patch-core = { path = "crates/socket-patch-core", version = "=5.0.1" }
23+
socket-patch-core = { path = "crates/socket-patch-core", version = "=5.1.0" }
2424
clap = { version = "=4.5.60", features = ["derive", "env"] }
2525
serde = { version = "=1.0.228", features = ["derive"] }
2626
serde_json = { version = "=1.0.149", features = ["preserve_order", "raw_value"] }

0 commit comments

Comments
0 (0)
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.