fix: restore Nextcloud 28 support — the 32 floor breaks eight consumer repos - #2380
Merged
Conversation
…r repos #2378 raised min-version 28 -> 32. Its premise was correct WHEN WRITTEN and is no longer: "the registration listener cannot prevent it, because the failure happens when PHP reads the class header, not when the provider is registered" That was true, and #2372 is what changed it. #2372 removed every EAGER reference to ContentProvider — the command's constructor typehint and the listener's — so the class is now only loaded from inside interface_exists('OCP\ContextChat\IContentManager') guards. On a server without OCP\ContextChat the class header is never read: the feature is inert, and nothing logs. WHAT THE FLOOR ACTUALLY COSTS. min-version is enforced at INSTALL time, so 32 makes `occ app:enable openregister` refuse on 31. Eight fleet repos install openregister as an additional-app while testing stable31 — procest, shillinq, portaliq, openbuild, decidesk, doriath, hermiq, larpingapp. Each now fails its seed with {"success":false,"message":"OpenRegister is not installed or enabled"} and then a 404 from /api/configurations/import, because the fallback importer belongs to the app that did not install. Observed on procest#758, where it looked for a while like a manifest bug in that PR. EVIDENCE THAT 31 WORKS. procest's e2e installs openregister at `development` and runs stable31. Its run at 2026-08-06T14:04Z — six minutes AFTER #2372 merged at 13:58Z — passed. The app demonstrably boots, enables and serves on NC 31 with that fix in place. The second reason the CI compose gave for a 32 floor does not hold either: OCP\DB\Types::DATETIME_IMMUTABLE is present in stable31 as well as stable32. Checked directly against both branches. ALSO CORRECTS MY OWN ERROR. #2372 and its test say "NC 33" throughout. That came from a local lookup against refs this checkout does not have, which answers ABSENT for everything — the failure mode a positive control exists to catch, and I did not run one at the time. Verified properly against raw.githubusercontent, with IUserManager.php as the control: stable31 IContentProvider 404 control 200 stable32 IContentProvider 200 control 200 So the interfaces arrive in 32, not 33. Every "NC 33" claim in the listener, the command and the guard test is corrected to 32. 28-31 remain untested by this repo's own CI, exactly as #2378 observed. That is a real coverage gap and worth closing, but it is a different thing from declaring those versions unsupported — the eight repos above ARE the coverage, and they were green on 31 until the floor moved. 26 ContextChat tests pass; phpcs clean.
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 546/546 | |||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-07 10:00 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#2378 raised
min-version28 → 32. Its premise was correct when written and is no longer:That was true — and #2372 is what changed it. #2372 removed every eager reference to
ContentProvider(the command's constructor typehint and the listener's), so the class is now only loaded from insideinterface_exists(...)guards. On a server withoutOCP\ContextChatthe class header is never read: the feature is inert, and nothing logs.What the floor actually costs
min-versionis enforced at install time, so 32 makesocc app:enable openregisterrefuse on 31. Eight fleet repos install openregister as an additional-app while testingstable31— procest, shillinq, portaliq, openbuild, decidesk, doriath, hermiq, larpingapp. Each now fails its seed with:and then a 404 from
/api/configurations/import, because the fallback importer belongs to the app that did not install. Observed on procest#758, where it looked for a while like a manifest bug in that PR.Evidence that 31 works
procest's e2e installs openregister at
developmentand runsstable31. Its run at 2026-08-06T14:04Z — six minutes after #2372 merged at 13:58Z — passed. The app demonstrably boots, enables and serves on NC 31 with that fix in place.The CI compose's second reason for a 32 floor does not hold either:
OCP\DB\Types::DATETIME_IMMUTABLEis present in stable31 as well as 32. Checked directly against both branches.This also corrects my own error
#2372 and its test say "NC 33" throughout. That came from a local lookup against refs this checkout does not have — which answers ABSENT for everything. It is exactly the failure a positive control exists to catch, and I did not run one at the time. Verified properly, with
IUserManager.phpas the control:IContentProviderSo the interfaces arrive in 32, not 33. Every "NC 33" claim in the listener, the command and the guard test is corrected.
What stays true from #2378
28-31 remain untested by this repo's own CI. That is a real coverage gap and worth closing — but it is a different thing from declaring those versions unsupported. The eight repos above are the coverage, and they were green on 31 until the floor moved.
26 ContextChat tests pass; phpcs clean.