From a4614c1d0587a976fa1e28768174334167089b6f Mon Sep 17 00:00:00 2001 From: "Flavio S. Glock" Date: Thu, 30 Jul 2026 13:38:38 +0200 Subject: [PATCH] fix: make CPAN patch paths release-independent Use stable distribution-level patch paths and broad distropref matches so compatibility patches are attempted for newly released CPAN versions. Generated with [Codex](https://openai.com/index/introducing-codex/) Co-Authored-By: Codex <158243242+openai-codex[bot]@users.noreply.github.com> --- dev/design/patch-and-cpan-prefs-layout.md | 12 ++- docs/guides/cpan-distroprefs.md | 9 +- src/main/perl/lib/CPAN/Config.pm | 87 ++++++++++--------- .../CpanDistroprefs/CGI-Widget-Tabs.yml | 2 +- .../CpanDistroprefs/CPAN-FindDependencies.yml | 2 +- .../CpanDistroprefs/Capture-Tiny.yml | 2 +- .../PerlOnJava/CpanDistroprefs/Class-DBI.yml | 2 +- .../CpanDistroprefs/Class-Trait.yml | 4 +- .../CpanDistroprefs/Crypt-URandom.yml | 4 +- .../PerlOnJava/CpanDistroprefs/Data-Dmp.yml | 2 +- .../CpanDistroprefs/Device-SerialPort.yml | 2 +- .../PerlOnJava/CpanDistroprefs/Error-Pure.yml | 2 +- .../lib/PerlOnJava/CpanDistroprefs/Error.yml | 2 +- .../CpanDistroprefs/Exception-Class.yml | 2 +- .../lib/PerlOnJava/CpanDistroprefs/Graph.yml | 6 +- .../HTTP-Response-Encoding.yml | 2 +- .../lib/PerlOnJava/CpanDistroprefs/IO-All.yml | 4 +- .../PerlOnJava/CpanDistroprefs/IO-Async.yml | 6 +- .../CpanDistroprefs/IO-Socket-INET6.yml | 4 +- .../PerlOnJava/CpanDistroprefs/Image-BMP.yml | 2 +- .../CpanDistroprefs/Javascript-Menu-Full.yml | 2 +- .../PerlOnJava/CpanDistroprefs/LRU-Cache.yml | 2 +- .../CpanDistroprefs/LWP-Protocol-https.yml | 2 +- .../CpanDistroprefs/Module-Install.yml | 4 +- .../Module-Pluggable-Ordered.yml | 4 +- .../PerlOnJava/CpanDistroprefs/Net-Server.yml | 2 +- .../CpanDistroprefs/OpenAI-API.live.yml | 4 +- .../CpanDistroprefs/OpenAI-API.offline.yml | 4 +- .../CpanDistroprefs/Parse-RecDescent.yml | 4 +- .../CpanDistroprefs/PerlIO-via-Timeout.yml | 4 +- .../PerlOnJava/CpanDistroprefs/Pod-Parser.yml | 2 +- .../CpanDistroprefs/String-ShellQuote.yml | 2 +- .../CpanDistroprefs/Term-ANSIColor-Markup.yml | 2 +- .../PerlOnJava/CpanDistroprefs/Type-Tiny.yml | 2 +- .../CpanDistroprefs/XML-FromPerl.yml | 4 +- .../PerlOnJava/CpanDistroprefs/XML-TreePP.yml | 2 +- .../perl/lib/PerlOnJava/CpanPatches/README.md | 11 +++ .../resources/unit/cpan_generic_patch_paths.t | 42 +++++++++ 38 files changed, 163 insertions(+), 94 deletions(-) create mode 100644 src/main/perl/lib/PerlOnJava/CpanPatches/README.md create mode 100644 src/test/resources/unit/cpan_generic_patch_paths.t diff --git a/dev/design/patch-and-cpan-prefs-layout.md b/dev/design/patch-and-cpan-prefs-layout.md index 1979b901f..616ccc7b3 100644 --- a/dev/design/patch-and-cpan-prefs-layout.md +++ b/dev/design/patch-and-cpan-prefs-layout.md @@ -33,7 +33,7 @@ flowchart LR end ``` -**Why not one physical `patches/` tree?** Import patches apply to paths already in the repo and use `-p0` layout from `sync.pl`. CPAN patches apply to unpacked tarballs under the CPAN build directory and paths are recorded as `Distribution-Version/file.patch` under `patches_dir`. Merging the directories would confuse tooling and docs without real benefit. +**Why not one physical `patches/` tree?** Import patches apply to paths already in the repo and use `-p0` layout from `sync.pl`. CPAN patches apply to unpacked tarballs under the CPAN build directory. Their source files are kept under `Distribution-Version/` for provenance, but bootstrap exposes them as `Distribution/file.patch` under `patches_dir` so release upgrades reuse a stable reference. Merging the directories would confuse tooling and docs without real benefit. ## Where to add what (contributor checklist) @@ -44,7 +44,8 @@ flowchart LR - See [`dev/import-perl5/README.md`](../import-perl5/README.md). 2. **CPAN distribution needs a patch during `jcpan -i` / CPAN test** - - Add `Something-1.23/Foo.pm.patch` under [`PerlOnJava/CpanPatches/`](../../src/main/perl/lib/PerlOnJava/CpanPatches/) (mirror the relative path CPAN.pm will apply). + - Add `Something-1.23/Foo.pm.patch` under [`PerlOnJava/CpanPatches/`](../../src/main/perl/lib/PerlOnJava/CpanPatches/) (the version records the source release used to author the diff). + - Reference it from distroprefs as `Something/Foo.pm.patch`; `CPAN::Config` installs that stable distribution-level path so a later release can try the same patch. - Reference it from a distropref YAML under [`PerlOnJava/CpanDistroprefs/`](../../src/main/perl/lib/PerlOnJava/CpanDistroprefs/) (`patches:` list). - Register the patch file in [`CPAN::Config::_bootstrap_patches`](../../src/main/perl/lib/CPAN/Config.pm) so it is copied to `~/.perlonjava/cpan/patches/` on startup (same pattern as existing DBI / IO::Async entries). @@ -67,6 +68,12 @@ On load, PerlOnJava: **Note on `.dd` distroprefs:** CPAN.pm only registers the `.dd` reader when YAML is unavailable ([`CPAN::Distribution::_find_prefs`](../../src/main/perl/lib/CPAN/Distribution.pm)). PerlOnJava always ships YAML; duplicate `Foo.dd` files next to `Foo.yml` are unnecessary and were removed from bootstrap. +Patch cache paths are intentionally version-independent (`/`). +The source files retain versioned directories for provenance, while the bootstrap +map copies them to stable paths. A patch is still applied with CPAN's normal +context/fuzz checks; a changed upstream layout fails visibly instead of being +silently treated as compatible. + ## Stale `src/main/perl/lib/CPAN/Prefs/` That directory is **not** used by bootstrap. Canonical prefs live under `PerlOnJava/CpanDistroprefs/`. [`CPAN/Prefs/README.md`](../../src/main/perl/lib/CPAN/Prefs/README.md) points contributors to the real location. @@ -101,3 +108,4 @@ when working on LibXML parity. | Date | Change | |------|--------| | 2026-05-12 | Added `make test-cpan-distroprefs` + `dev/tools/test-cpan-distroprefs.sh` for bundled pref smoke. | +| 2026-07-30 | Made installed CPAN patch paths distribution-level and version-independent; added a unit guard against version-pinned distropref references. | diff --git a/docs/guides/cpan-distroprefs.md b/docs/guides/cpan-distroprefs.md index 870b53b8a..208d905e2 100644 --- a/docs/guides/cpan-distroprefs.md +++ b/docs/guides/cpan-distroprefs.md @@ -201,10 +201,15 @@ comment: | match: distribution: "^.*/Image-BMP-" patches: - - "Image-BMP-1.26/BMP.pm.patch" + - "Image-BMP/BMP.pm.patch" ``` -Patch paths are relative to `src/main/perl/lib/PerlOnJava/CpanPatches/`. Keep +Patch paths are relative to the installed patch cache, and should use the +version-independent form `/.patch`. The bundled +source may remain under `/` to record which upstream +release was used when the patch was written; `CPAN::Config` maps that source to +the stable installed path. This lets a broad distropref try the same patch +against a later CPAN release without changing its YAML or cache path. Keep patches narrow and readable. The distropref comment should explain why the patch belongs in PerlOnJava instead of upstream, or note if it is a candidate for upstreaming. diff --git a/src/main/perl/lib/CPAN/Config.pm b/src/main/perl/lib/CPAN/Config.pm index 5235194d4..c761618a1 100644 --- a/src/main/perl/lib/CPAN/Config.pm +++ b/src/main/perl/lib/CPAN/Config.pm @@ -201,8 +201,11 @@ _bootstrap_prefs(); # ~/.perlonjava/cpan/patches/ on first run so the external `patch` # binary (which operates on the filesystem) can reach them. # -# Patches are keyed by "-/.patch" -# relative to $CPAN::Config->{patches_dir}. +# Patches are exposed under "/.patch" relative to +# $CPAN::Config->{patches_dir}. The source paths retain the upstream version +# they were authored against for provenance, but the installed path is stable +# across CPAN releases. CPAN will still reject a patch whose context no +# longer applies, which is safer than silently applying an unrelated patch. # Source files live under lib/PerlOnJava/CpanPatches/ (see # dev/design/patch-and-cpan-prefs-layout.md). sub _bootstrap_patches { @@ -211,85 +214,85 @@ sub _bootstrap_patches { # Map: target path relative to $patches_dir => source path inside the JAR # (or on-disk dev tree during `make`). The source is located via @INC. my @bundled = ( - [ 'DBI-1.647/DBI.pm.patch', + [ 'DBI/DBI.pm.patch', 'PerlOnJava/CpanPatches/DBI-1.647/DBI.pm.patch' ], - [ 'DBI-1.647/PurePerl.pm.patch', + [ 'DBI/PurePerl.pm.patch', 'PerlOnJava/CpanPatches/DBI-1.647/PurePerl.pm.patch' ], - [ 'Exception-Class-1.45/GeneratedSubclassVersion.patch', + [ 'Exception-Class/GeneratedSubclassVersion.patch', 'PerlOnJava/CpanPatches/Exception-Class-1.45/GeneratedSubclassVersion.patch' ], - [ 'Net-Server-2.018/Proto.pm.patch', + [ 'Net-Server/Proto.pm.patch', 'PerlOnJava/CpanPatches/Net-Server-2.018/Proto.pm.patch' ], - [ 'Device-SerialPort-1.04/NoXsBitsFallback.patch', + [ 'Device-SerialPort/NoXsBitsFallback.patch', 'PerlOnJava/CpanPatches/Device-SerialPort-1.04/NoXsBitsFallback.patch' ], - [ 'CPAN-FindDependencies-3.13/MakeMaker.pm.patch', + [ 'CPAN-FindDependencies/MakeMaker.pm.patch', 'PerlOnJava/CpanPatches/CPAN-FindDependencies-3.13/MakeMaker.pm.patch' ], - [ 'Pod-Parser-1.67/Pod-Find-core-probe.patch', + [ 'Pod-Parser/Pod-Find-core-probe.patch', 'PerlOnJava/CpanPatches/Pod-Parser-1.67/Pod-Find-core-probe.patch' ], - [ 'IO-Async-0.805/NoFork.patch', + [ 'IO-Async/NoFork.patch', 'PerlOnJava/CpanPatches/IO-Async-0.805/NoFork.patch' ], - [ 'IO-Async-0.805/PerlOnJava.patch', + [ 'IO-Async/PerlOnJava.patch', 'PerlOnJava/CpanPatches/IO-Async-0.805/PerlOnJava.patch' ], - [ 'IO-Async-0.805/SkipUnsupportedSocketTests.patch', + [ 'IO-Async/SkipUnsupportedSocketTests.patch', 'PerlOnJava/CpanPatches/IO-Async-0.805/SkipUnsupportedSocketTests.patch' ], - [ 'IO-Socket-INET6-2.73/SkipForkSocketTests.patch', + [ 'IO-Socket-INET6/SkipForkSocketTests.patch', 'PerlOnJava/CpanPatches/IO-Socket-INET6-2.73/SkipForkSocketTests.patch' ], - [ 'OpenAI-API-0.37/EventLoop.patch', + [ 'OpenAI-API/EventLoop.patch', 'PerlOnJava/CpanPatches/OpenAI-API-0.37/EventLoop.patch' ], - [ 'OpenAI-API-0.37/NoNetworkTests.patch', + [ 'OpenAI-API/NoNetworkTests.patch', 'PerlOnJava/CpanPatches/OpenAI-API-0.37/NoNetworkTests.patch' ], - [ 'Image-BMP-1.26/BMP.pm.patch', + [ 'Image-BMP/BMP.pm.patch', 'PerlOnJava/CpanPatches/Image-BMP-1.26/BMP.pm.patch' ], - [ 'HTTP-Response-Encoding-0.06/Makefile.PL.patch', + [ 'HTTP-Response-Encoding/Makefile.PL.patch', 'PerlOnJava/CpanPatches/HTTP-Response-Encoding-0.06/Makefile.PL.patch' ], - [ 'Javascript-Menu-Full-2.02/NoCGIDependency.patch', + [ 'Javascript-Menu-Full/NoCGIDependency.patch', 'PerlOnJava/CpanPatches/Javascript-Menu-Full-2.02/NoCGIDependency.patch' ], - [ 'CGI-Widget-Tabs-1.14/OptionalAuthorAndCGITests.patch', + [ 'CGI-Widget-Tabs/OptionalAuthorAndCGITests.patch', 'PerlOnJava/CpanPatches/CGI-Widget-Tabs-1.14/OptionalAuthorAndCGITests.patch' ], - [ 'Data-Dmp-0.242/PerlOnJava.patch', + [ 'Data-Dmp/PerlOnJava.patch', 'PerlOnJava/CpanPatches/Data-Dmp-0.242/PerlOnJava.patch' ], - [ 'Capture-Tiny-0.50/NoForkTeeCatchErrors.patch', + [ 'Capture-Tiny/NoForkTeeCatchErrors.patch', 'PerlOnJava/CpanPatches/Capture-Tiny-0.50/NoForkTeeCatchErrors.patch' ], - [ 'Error-0.17030/SkipForkWarndie.patch', + [ 'Error/SkipForkWarndie.patch', 'PerlOnJava/CpanPatches/Error-0.17030/SkipForkWarndie.patch' ], - [ 'Error-Pure-0.34/PlainLexicalConstants.patch', + [ 'Error-Pure/PlainLexicalConstants.patch', 'PerlOnJava/CpanPatches/Error-Pure-0.34/PlainLexicalConstants.patch' ], - [ 'String-ShellQuote-1.04/SkipForkScriptTests.patch', + [ 'String-ShellQuote/SkipForkScriptTests.patch', 'PerlOnJava/CpanPatches/String-ShellQuote-1.04/SkipForkScriptTests.patch' ], - [ 'IO-All-0.87/SkipForkTests.patch', + [ 'IO-All/SkipForkTests.patch', 'PerlOnJava/CpanPatches/IO-All-0.87/SkipForkTests.patch' ], - [ 'Module-Install-1.21/ExplicitAuthorsMethod.patch', + [ 'Module-Install/ExplicitAuthorsMethod.patch', 'PerlOnJava/CpanPatches/Module-Install-1.21/ExplicitAuthorsMethod.patch' ], - [ 'Module-Pluggable-Ordered-1.5/LimitFixturePlugins.patch', + [ 'Module-Pluggable-Ordered/LimitFixturePlugins.patch', 'PerlOnJava/CpanPatches/Module-Pluggable-Ordered-1.5/LimitFixturePlugins.patch' ], - [ 'LWP-Protocol-https-6.15/SkipForkProxyTest.patch', + [ 'LWP-Protocol-https/SkipForkProxyTest.patch', 'PerlOnJava/CpanPatches/LWP-Protocol-https-6.15/SkipForkProxyTest.patch' ], - [ 'Type-Tiny-2.010001/SkipRegexCallbackTests.patch', + [ 'Type-Tiny/SkipRegexCallbackTests.patch', 'PerlOnJava/CpanPatches/Type-Tiny-2.010001/SkipRegexCallbackTests.patch' ], - [ 'PerlIO-via-Timeout-0.32/SkipViaRuntimeTest.patch', + [ 'PerlIO-via-Timeout/SkipViaRuntimeTest.patch', 'PerlOnJava/CpanPatches/PerlIO-via-Timeout-0.32/SkipViaRuntimeTest.patch' ], - [ 'Crypt-URandom-0.55/PerlOnJavaTests.patch', + [ 'Crypt-URandom/PerlOnJavaTests.patch', 'PerlOnJava/CpanPatches/Crypt-URandom-0.55/PerlOnJavaTests.patch' ], - [ 'Parse-RecDescent-1.967015/SkipStandalonePrecompile.patch', + [ 'Parse-RecDescent/SkipStandalonePrecompile.patch', 'PerlOnJava/CpanPatches/Parse-RecDescent-1.967015/SkipStandalonePrecompile.patch' ], - [ 'Parse-RecDescent-1.967015/SkipReproducibleStandalone.patch', + [ 'Parse-RecDescent/SkipReproducibleStandalone.patch', 'PerlOnJava/CpanPatches/Parse-RecDescent-1.967015/SkipReproducibleStandalone.patch' ], - [ 'XML-FromPerl-0.01/Makefile.PL.patch', + [ 'XML-FromPerl/Makefile.PL.patch', 'PerlOnJava/CpanPatches/XML-FromPerl-0.01/Makefile.PL.patch' ], - [ 'Class-DBI-v3.0.17/Class-DBI.pm.patch', + [ 'Class-DBI/Class-DBI.pm.patch', 'PerlOnJava/CpanPatches/Class-DBI-v3.0.17/Class-DBI.pm.patch' ], - [ 'Class-Trait-0.33/SkipObsoleteModPerlWarningTest.patch', + [ 'Class-Trait/SkipObsoleteModPerlWarningTest.patch', 'PerlOnJava/CpanPatches/Class-Trait-0.33/SkipObsoleteModPerlWarningTest.patch' ], - [ 'XML-TreePP-0.43/TreePP.pm.patch', + [ 'XML-TreePP/TreePP.pm.patch', 'PerlOnJava/CpanPatches/XML-TreePP-0.43/TreePP.pm.patch' ], - [ 'Graph-0.9735/Graph.pm.patch', + [ 'Graph/Graph.pm.patch', 'PerlOnJava/CpanPatches/Graph-0.9735/Graph.pm.patch' ], - [ 'Graph-0.9735/AdjacencyMap.pm.patch', + [ 'Graph/AdjacencyMap.pm.patch', 'PerlOnJava/CpanPatches/Graph-0.9735/AdjacencyMap.pm.patch' ], - [ 'Graph-0.9735/AdjacencyMap-Light.pm.patch', + [ 'Graph/AdjacencyMap-Light.pm.patch', 'PerlOnJava/CpanPatches/Graph-0.9735/AdjacencyMap-Light.pm.patch' ], - [ 'Term-ANSIColor-Markup-0.06/PortableAccessors.patch', + [ 'Term-ANSIColor-Markup/PortableAccessors.patch', 'PerlOnJava/CpanPatches/Term-ANSIColor-Markup-0.06/PortableAccessors.patch' ], - [ 'LRU-Cache-1.00/PurePerl.patch', + [ 'LRU-Cache/PurePerl.patch', 'PerlOnJava/CpanPatches/LRU-Cache-1.00/PurePerl.patch' ], ); diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CGI-Widget-Tabs.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CGI-Widget-Tabs.yml index 3abea85c3..08f9d9756 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CGI-Widget-Tabs.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CGI-Widget-Tabs.yml @@ -13,4 +13,4 @@ comment: | match: distribution: "^SRSHAH/CGI-Widget-Tabs-" patches: - - "CGI-Widget-Tabs-1.14/OptionalAuthorAndCGITests.patch" + - "CGI-Widget-Tabs/OptionalAuthorAndCGITests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CPAN-FindDependencies.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CPAN-FindDependencies.yml index 043459d81..1e57da9fa 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CPAN-FindDependencies.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/CPAN-FindDependencies.yml @@ -10,4 +10,4 @@ comment: | match: distribution: "^DCANTRELL/CPAN-FindDependencies-" patches: - - "CPAN-FindDependencies-3.13/MakeMaker.pm.patch" + - "CPAN-FindDependencies/MakeMaker.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Capture-Tiny.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Capture-Tiny.yml index 534c5aab0..e1ac99062 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Capture-Tiny.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Capture-Tiny.yml @@ -8,4 +8,4 @@ comment: | match: distribution: "^DAGOLDEN/Capture-Tiny-" patches: - - "Capture-Tiny-0.50/NoForkTeeCatchErrors.patch" + - "Capture-Tiny/NoForkTeeCatchErrors.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-DBI.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-DBI.yml index 10f481448..8b6b81da4 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-DBI.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-DBI.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^.*/Class-DBI-" patches: - - "Class-DBI-v3.0.17/Class-DBI.pm.patch" + - "Class-DBI/Class-DBI.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-Trait.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-Trait.yml index e3aacb1ac..c03f99422 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-Trait.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Class-Trait.yml @@ -8,6 +8,6 @@ comment: | obsolete mod_perl startup assertion while retaining the other 404 functional trait tests needed by Graph::PetriNet. match: - distribution: "^OVID/Class-Trait-0\\.33" + distribution: "^OVID/Class-Trait-" patches: - - "Class-Trait-0.33/SkipObsoleteModPerlWarningTest.patch" + - "Class-Trait/SkipObsoleteModPerlWarningTest.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Crypt-URandom.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Crypt-URandom.yml index 4929dd156..e4101ae10 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Crypt-URandom.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Crypt-URandom.yml @@ -8,6 +8,6 @@ comment: | sysopen}; those overrides are not meaningful when getrandom is available. Patch only those test files and keep the rest of the suite active. match: - distribution: "^DDICK/Crypt-URandom-0\\.55" + distribution: "^DDICK/Crypt-URandom-" patches: - - "Crypt-URandom-0.55/PerlOnJavaTests.patch" + - "Crypt-URandom/PerlOnJavaTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Data-Dmp.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Data-Dmp.yml index 67b18038d..9abc4970a 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Data-Dmp.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Data-Dmp.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^.*/Data-Dmp-" patches: - - "Data-Dmp-0.242/PerlOnJava.patch" + - "Data-Dmp/PerlOnJava.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Device-SerialPort.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Device-SerialPort.yml index 2b944fb0d..b864c88e0 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Device-SerialPort.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Device-SerialPort.yml @@ -10,4 +10,4 @@ comment: | match: distribution: "^COOK/Device-SerialPort-" patches: - - "Device-SerialPort-1.04/NoXsBitsFallback.patch" + - "Device-SerialPort/NoXsBitsFallback.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error-Pure.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error-Pure.yml index a7e010537..ab792e0d4 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error-Pure.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error-Pure.yml @@ -11,6 +11,6 @@ comment: | match: distribution: "^SKIM/Error-Pure-[0-9]" patches: - - "Error-Pure-0.34/PlainLexicalConstants.patch" + - "Error-Pure/PlainLexicalConstants.patch" test: commandline: "PERLONJAVA_TEST_IGNORE_FAILURES" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error.yml index b01732dce..174b93d64 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Error.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^SHLOMIF/Error-" patches: - - "Error-0.17030/SkipForkWarndie.patch" + - "Error/SkipForkWarndie.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Exception-Class.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Exception-Class.yml index 621118d25..83f68c9f3 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Exception-Class.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Exception-Class.yml @@ -14,6 +14,6 @@ comment: | match: distribution: "^DROLSKY/Exception-Class-" patches: - - "Exception-Class-1.45/GeneratedSubclassVersion.patch" + - "Exception-Class/GeneratedSubclassVersion.patch" test: commandline: "PERLONJAVA_TEST_IGNORE_FAILURES" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Graph.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Graph.yml index 69e2a7d54..2f15cab46 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Graph.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Graph.yml @@ -11,6 +11,6 @@ comment: | match: distribution: "^.*/Graph-[0-9]" patches: - - "Graph-0.9735/Graph.pm.patch" - - "Graph-0.9735/AdjacencyMap.pm.patch" - - "Graph-0.9735/AdjacencyMap-Light.pm.patch" + - "Graph/Graph.pm.patch" + - "Graph/AdjacencyMap.pm.patch" + - "Graph/AdjacencyMap-Light.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/HTTP-Response-Encoding.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/HTTP-Response-Encoding.yml index bde11567d..c5fcb0859 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/HTTP-Response-Encoding.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/HTTP-Response-Encoding.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^DANKOGAI/HTTP-Response-Encoding-" patches: - - "HTTP-Response-Encoding-0.06/Makefile.PL.patch" + - "HTTP-Response-Encoding/Makefile.PL.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-All.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-All.yml index 6fdfb32fe..befa58f1f 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-All.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-All.yml @@ -7,6 +7,6 @@ comment: | so skip only those tests on no-fork platforms while keeping the rest of the upstream suite intact. match: - distribution: "^FREW/IO-All-0\\.87" + distribution: "^FREW/IO-All-" patches: - - "IO-All-0.87/SkipForkTests.patch" + - "IO-All/SkipForkTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Async.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Async.yml index 486542b30..1ec87f949 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Async.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Async.yml @@ -10,9 +10,9 @@ comment: | match: distribution: "^PEVANS/IO-Async-" patches: - - "IO-Async-0.805/NoFork.patch" - - "IO-Async-0.805/PerlOnJava.patch" - - "IO-Async-0.805/SkipUnsupportedSocketTests.patch" + - "IO-Async/NoFork.patch" + - "IO-Async/PerlOnJava.patch" + - "IO-Async/SkipUnsupportedSocketTests.patch" test: env: IO_ASYNC_NO_FORK: 1 diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Socket-INET6.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Socket-INET6.yml index dae044b46..d28f0e593 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Socket-INET6.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/IO-Socket-INET6.yml @@ -8,6 +8,6 @@ comment: | CPAN builds as well as Perl core-tree builds. All non-fork IPv6 socket tests, including the UDP and listener tests, continue to run. match: - distribution: "IO-Socket-INET6-2\\.73" + distribution: "^.*/IO-Socket-INET6-" patches: - - "IO-Socket-INET6-2.73/SkipForkSocketTests.patch" + - "IO-Socket-INET6/SkipForkSocketTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Image-BMP.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Image-BMP.yml index 1190d6261..855d67ef9 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Image-BMP.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Image-BMP.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^.*/Image-BMP-" patches: - - "Image-BMP-1.26/BMP.pm.patch" + - "Image-BMP/BMP.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Javascript-Menu-Full.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Javascript-Menu-Full.yml index 2cc2381e8..6bd171dcb 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Javascript-Menu-Full.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Javascript-Menu-Full.yml @@ -12,4 +12,4 @@ comment: | match: distribution: "^YOSEFM/Javascript-Menu-Full-" patches: - - "Javascript-Menu-Full-2.02/NoCGIDependency.patch" + - "Javascript-Menu-Full/NoCGIDependency.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LRU-Cache.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LRU-Cache.yml index d6dcd6dfc..00ef17afc 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LRU-Cache.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LRU-Cache.yml @@ -8,4 +8,4 @@ comment: | match: distribution: "^LNATION/LRU-Cache-" patches: - - "LRU-Cache-1.00/PurePerl.patch" + - "LRU-Cache/PurePerl.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LWP-Protocol-https.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LWP-Protocol-https.yml index d0f25b34c..3ff9d46f4 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LWP-Protocol-https.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/LWP-Protocol-https.yml @@ -8,4 +8,4 @@ comment: | match: distribution: "^OALDERS/LWP-Protocol-https-" patches: - - "LWP-Protocol-https-6.15/SkipForkProxyTest.patch" + - "LWP-Protocol-https/SkipForkProxyTest.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Install.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Install.yml index ea22c818e..05fe00f69 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Install.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Install.yml @@ -7,6 +7,6 @@ comment: | generated, so defined(&authors) is false even though ->can("authors") works. Add an explicit authors method so the admin copy path can find it. match: - distribution: "^ETHER/Module-Install-1\\.21" + distribution: "^ETHER/Module-Install-" patches: - - "Module-Install-1.21/ExplicitAuthorsMethod.patch" + - "Module-Install/ExplicitAuthorsMethod.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Pluggable-Ordered.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Pluggable-Ordered.yml index c6cb99237..fd17f533e 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Pluggable-Ordered.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Module-Pluggable-Ordered.yml @@ -8,6 +8,6 @@ comment: | modules from other distributions, so patch the tests to constrain the fixture plugins with the module's own only option. match: - distribution: "^APEIRON/Module-Pluggable-Ordered-1\\.5" + distribution: "^APEIRON/Module-Pluggable-Ordered-" patches: - - "Module-Pluggable-Ordered-1.5/LimitFixturePlugins.patch" + - "Module-Pluggable-Ordered/LimitFixturePlugins.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Net-Server.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Net-Server.yml index fb40f5fbe..c26e39b25 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Net-Server.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Net-Server.yml @@ -15,4 +15,4 @@ comment: | match: distribution: "^BBB/Net-Server-" patches: - - "Net-Server-2.018/Proto.pm.patch" + - "Net-Server/Proto.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.live.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.live.yml index 33689bcef..c371f8ee2 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.live.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.live.yml @@ -8,5 +8,5 @@ comment: | match: distribution: "^NFERRAZ/OpenAI-API-" patches: - - "OpenAI-API-0.37/EventLoop.patch" - - "OpenAI-API-0.37/NoNetworkTests.patch" + - "OpenAI-API/EventLoop.patch" + - "OpenAI-API/NoNetworkTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.offline.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.offline.yml index c926cdb44..dce3e6070 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.offline.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/OpenAI-API.offline.yml @@ -12,8 +12,8 @@ comment: | match: distribution: "^NFERRAZ/OpenAI-API-" patches: - - "OpenAI-API-0.37/EventLoop.patch" - - "OpenAI-API-0.37/NoNetworkTests.patch" + - "OpenAI-API/EventLoop.patch" + - "OpenAI-API/NoNetworkTests.patch" test: env: NO_NETWORK_TESTING: 1 diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Parse-RecDescent.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Parse-RecDescent.yml index e45c152a3..9da0b5bf5 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Parse-RecDescent.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Parse-RecDescent.yml @@ -9,5 +9,5 @@ comment: | match: distribution: "^JTBRAUN/Parse-RecDescent-" patches: - - "Parse-RecDescent-1.967015/SkipStandalonePrecompile.patch" - - "Parse-RecDescent-1.967015/SkipReproducibleStandalone.patch" + - "Parse-RecDescent/SkipStandalonePrecompile.patch" + - "Parse-RecDescent/SkipReproducibleStandalone.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/PerlIO-via-Timeout.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/PerlIO-via-Timeout.yml index 9051dfe5b..9ff45e5db 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/PerlIO-via-Timeout.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/PerlIO-via-Timeout.yml @@ -12,6 +12,6 @@ comment: | no longer used by the PerlOnJava test phase and otherwise pulls in Test::SharedFork/fork-only test suites. match: - distribution: "^DAMS/PerlIO-via-Timeout-0\\.32" + distribution: "^DAMS/PerlIO-via-Timeout-" patches: - - "PerlIO-via-Timeout-0.32/SkipViaRuntimeTest.patch" + - "PerlIO-via-Timeout/SkipViaRuntimeTest.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Pod-Parser.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Pod-Parser.yml index 979d5c77e..f7a51f9d2 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Pod-Parser.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Pod-Parser.yml @@ -10,4 +10,4 @@ comment: | match: distribution: "^MAREKR/Pod-Parser-" patches: - - "Pod-Parser-1.67/Pod-Find-core-probe.patch" + - "Pod-Parser/Pod-Find-core-probe.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/String-ShellQuote.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/String-ShellQuote.yml index b5d44917c..a9d36fe39 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/String-ShellQuote.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/String-ShellQuote.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^ROSCH/String-ShellQuote-" patches: - - "String-ShellQuote-1.04/SkipForkScriptTests.patch" + - "String-ShellQuote/SkipForkScriptTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Term-ANSIColor-Markup.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Term-ANSIColor-Markup.yml index ec24b30d9..9437588f8 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Term-ANSIColor-Markup.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Term-ANSIColor-Markup.yml @@ -10,4 +10,4 @@ comment: | match: distribution: "^KENTARO/Term-ANSIColor-Markup-" patches: - - "Term-ANSIColor-Markup-0.06/PortableAccessors.patch" + - "Term-ANSIColor-Markup/PortableAccessors.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Type-Tiny.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Type-Tiny.yml index 1ff96c653..6a7d31d66 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Type-Tiny.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/Type-Tiny.yml @@ -9,4 +9,4 @@ comment: | match: distribution: "^TOBYINK/Type-Tiny-" patches: - - "Type-Tiny-2.010001/SkipRegexCallbackTests.patch" + - "Type-Tiny/SkipRegexCallbackTests.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-FromPerl.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-FromPerl.yml index 80b47d272..014b98e2e 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-FromPerl.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-FromPerl.yml @@ -6,6 +6,6 @@ comment: | Makefile.PL only declares XML::LibXML. Patch the metadata so CPAN installs XML::SAX before running the target test. match: - distribution: "^SALVA/XML-FromPerl-0\\.01" + distribution: "^SALVA/XML-FromPerl-" patches: - - "XML-FromPerl-0.01/Makefile.PL.patch" + - "XML-FromPerl/Makefile.PL.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-TreePP.yml b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-TreePP.yml index a7bda6ffc..d39030365 100644 --- a/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-TreePP.yml +++ b/src/main/perl/lib/PerlOnJava/CpanDistroprefs/XML-TreePP.yml @@ -16,4 +16,4 @@ comment: | match: distribution: "^.*/XML-TreePP-" patches: - - "XML-TreePP-0.43/TreePP.pm.patch" + - "XML-TreePP/TreePP.pm.patch" diff --git a/src/main/perl/lib/PerlOnJava/CpanPatches/README.md b/src/main/perl/lib/PerlOnJava/CpanPatches/README.md new file mode 100644 index 000000000..6c6157fd2 --- /dev/null +++ b/src/main/perl/lib/PerlOnJava/CpanPatches/README.md @@ -0,0 +1,11 @@ +# PerlOnJava CPAN patches + +Keep patch sources under `Distribution-Version/` so the release used to +author a patch remains visible. Distroprefs must reference the stable, +version-independent path `Distribution/PatchName.patch`; `CPAN::Config` maps +that installed path to the versioned source during bootstrap. + +This allows a broad distribution match to try the patch after a new CPAN +release. CPAN's normal patch context and fuzz checks still decide whether the +upstream source is compatible; refresh the versioned source patch when those +checks fail. diff --git a/src/test/resources/unit/cpan_generic_patch_paths.t b/src/test/resources/unit/cpan_generic_patch_paths.t new file mode 100644 index 000000000..28c7e35d9 --- /dev/null +++ b/src/test/resources/unit/cpan_generic_patch_paths.t @@ -0,0 +1,42 @@ +use strict; +use warnings; +use File::Find; +use File::Spec; +use Test::More; + +my $root = File::Spec->catdir(File::Spec->curdir()); +my $prefs_dir = File::Spec->catdir($root, 'src', 'main', 'perl', 'lib', + 'PerlOnJava', 'CpanDistroprefs'); +my $config = File::Spec->catfile($root, 'src', 'main', 'perl', 'lib', 'CPAN', + 'Config.pm'); + +my @patch_refs; +find({ + wanted => sub { + return unless -f $_ && /\.yml\z/; + open my $fh, '<', $_ or die "$File::Find::name: $!"; + while (<$fh>) { + push @patch_refs, $1 if /^\s*-\s*["']([^"']+\.patch)["']/; + } + close $fh; + }, + no_chdir => 1, +}, $prefs_dir); + +ok(@patch_refs, 'found bundled distropref patch references'); +for my $path (@patch_refs) { + unlike($path, qr{/[^/]*-\d[0-9A-Za-z.]*?/}, + "patch reference is not tied to a release directory: $path"); + like($path, qr{^[^/]+/[^/]+\.patch\z}, + "patch reference has stable distribution layout: $path"); +} + +open my $cfh, '<', $config or die "$config: $!"; +my $config_text = do { local $/; <$cfh> }; +close $cfh; +for my $path (@patch_refs) { + like($config_text, qr/\[\s*'\Q$path\E',\s*\n\s*'PerlOnJava\/CpanPatches\//, + "bootstrap installs distropref path: $path"); +} + +done_testing;