You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: sweep accumulated reviewer nits from the 2026-06 campaign (#2992)
* fix: sweep accumulated reviewer nits from the 2026-06 campaign
Behavior fixes: LCase word-form operators in $evaluateLogicalExpression
(uppercase EQ threw on Adobe CF); /wheels/cli gate reads the reload
password from the form scope only (query-string password satisfied the
gate while landing in access logs); dbRollback counts applied
migrations by tracked status, not the version<=current heuristic
(shared-dev-DB skew); NPE guard for null getErrorStream() in the three
CLI HTTP bridge helpers; migrator column cache keys verbatim (no case
folding); $getForeignKeys throws on missing adapter instead of
emitting unquoted SQL; real \d escapes in $convertToString's dead ISO
branch. Plus stale-docblock updates (#2903 references, renderWith/
onlyProvides enforcement notes, debug-panel guide note, .ai finally-
loop note, migrator CLAUDE.md cache docs) and spec backfills
(waitForText timeout, $get without request.wheels, typed-column
outlier defaults, conditional loadRoutesSpec restore, uppercase-EQ
conditions, dbDrop/dbRestore stub note).
Fixes#2977
Signed-off-by: Peter Amiri <peter@alurium.com>
* chore(docs): move changelog entry to changelog.d fragment
Eliminates the [Unreleased]-anchor merge conflicts across campaign PRs;
fragments are assembled into CHANGELOG.md at release promotion.
Signed-off-by: Peter Amiri <peter@alurium.com>
---------
Signed-off-by: Peter Amiri <peter@alurium.com>
### `for` Loops Inside `finally` Blocks Miscompile on Lucee 7
174
174
175
-
Lucee 7.0.1+100 throws `variable [local] doesn't exist` at runtime when a `for` loop declares or iterates `local`-/`var`-scoped variables inside a `finally` block. Isolated with minimal probes: bare assignments and function calls inside `finally` compile and run fine; loops do not. One probe shape even produced a JVM `Expecting a stackmap frame` bytecode-verifier error, pointing at a codegen bug in Lucee's `finally`-block compilation.
175
+
Lucee 7.0.1+100 throws `variable [local] doesn't exist` at runtime when a `for` loop declares or iterates `local`-/`var`-scoped variables inside a `finally` block. Both loop forms are affected — `for (init; cond; step)` and `for (item in collection)`. Isolated with minimal probes: bare assignments and function calls inside `finally` compile and run fine; loops do not. One probe shape even produced a JVM `Expecting a stackmap frame` bytecode-verifier error, pointing at a codegen bug in Lucee's `finally`-block compilation.
- Reviewer-nit sweep from the 2026-06 remediation campaign (#2977). Behavior fixes: conditional validations with uppercase word-form operators (`condition="1 EQ 0"`) no longer throw on Adobe CF (`$evaluateLogicalExpression` now lowercases the operator); the `/wheels/cli` mutation gate reads the reload password from the form scope ONLY, so a `?password=...` query string can no longer satisfy the gate while logging the password in access logs; `dbRollback` over the `/wheels/cli` bridge counts applied migrations by tracked `status` instead of the `version <= current` heuristic, so peer-applied versions on a shared dev database no longer skew `steps=N`; the CLI's three HTTP bridge helpers guard against `getErrorStream()` returning Java null on bodiless 4xx/5xx responses (was an NPE surfacing as a useless "null" error); the migrator's per-request column cache keys on the verbatim table name (case-folding let `Authors`/`authors` share a slot on case-sensitive databases); `$getForeignKeys()` throws `Wheels.Migrator.MissingAdapter` instead of silently interpolating an unquoted table name when the adapter is missing; and the dead ISO-date fallback branch in `$convertToString` uses real `\d` regex escapes. Plus assorted stale-docblock/comment updates (#2903 references, `renderWith`/`onlyProvides` enforcement notes, debug-panel guide note) and spec backfills (`waitForText` timeout surface, `$get()` without `request.wheels`, typed-column outlier defaults, conditional spec-state restore) (#2977)
Copy file name to clipboardExpand all lines: vendor/wheels/controller/provides.cfc
+3Lines changed: 3 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -30,6 +30,9 @@ component {
30
30
/**
31
31
* Use this in an individual controller action to define which formats the action will respond with.
32
32
* This can be used to define provides behavior in individual actions or to override a global setting set with `provides` in the controller's `config()`.
33
+
* Restrictions are enforced (since 4.0.4): `renderWith()` falls back to the `html` view for a
34
+
* format outside the list, and the automatic render in `$callAction()` skips view rendering for
Copy file name to clipboardExpand all lines: vendor/wheels/controller/rendering.cfc
+3Lines changed: 3 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -176,6 +176,9 @@ component {
176
176
* Instructs the controller to render the data passed in to the format that is requested.
177
177
* If the format requested is `json` or `xml`, Wheels will transform the data into that format automatically.
178
178
* For other formats (or to override the automatic formatting), you can also create a view template in this format: `nameofaction.xml.cfm`, `nameofaction.json.cfm`, `nameofaction.pdf.cfm`, etc.
179
+
* Per-action format restrictions set with `onlyProvides()` are enforced here (since 4.0.4):
180
+
* when the requested format is not acceptable for the action, `renderWith()` falls back to
181
+
* rendering the `html` view — even when `html` itself is not in the `onlyProvides()` list.
Copy file name to clipboardExpand all lines: vendor/wheels/migrator/CLAUDE.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -58,6 +58,13 @@ The flag is read via `$get("useUnderscoreReferenceColumns")` inside `references(
58
58
2.**Hard-coding `& "id"` or `& "type"` concatenations.** All four sites in this directory resolve the reference-column suffix through `$get("useUnderscoreReferenceColumns")` — `TableDefinition.cfc::references()` (id + polymorphic type), `Migration.cfc::removeColumn` (referenceName branch), and `Migration.cfc::addReference`. If you add new code that builds a reference column name, route it through `$get` too rather than hard-coding `& "id"`.
59
59
3.**`required` on column-name parameters.** Use `$combineArguments(... required=true)` instead. Declaring CFML-level `required` blocks the alias path because validation runs before the function body.
60
60
61
+
## Internal caches
62
+
63
+
Two caches introduced in #2937 — know their scopes before adding probes:
64
+
65
+
-`application[appKey].$migratorAdapterNames` — application-scoped, keyed by datasource name. Memoized migrator adapter name, written by `Base.cfc::$getDBType()`. Survives requests; rebuilt on reload (a datasource's driver can't change without one).
66
+
-`request.$wheelsMigratorColumns` — request-scoped, keyed by `dsName|tableName` (table name VERBATIM — no case folding, since the `$dbinfo` probe uses original case and case-sensitive databases can host `Authors` and `authors` separately). Column list per table, written by `Base.cfc::$getColumns()`, dropped wholesale by `$execute()` so DDL in the same request is reflected on the next read.
67
+
61
68
## Tests
62
69
63
70
Specs live in `vendor/wheels/tests/specs/migrator/`. `referencesSpec.cfc` exercises `TableDefinition::references()` (the `columnNames` alias plus the suffix flag) at the unit layer — inspecting `t.columns` / `t.foreignKeys` directly without `t.create()` so the assertions are adapter-independent. `primaryKeySpec.cfc` mirrors that shape for `TableDefinition::primaryKey()` — the `columnName` / `columnNames` aliases plus precedence semantics (#2803). `migrationSpec.cfc` covers Migration.cfc command-version helpers via real DDL roundtrips — its "Tests addReference" describe block guards the `useUnderscoreReferenceColumns` path on `Migration.cfc::addReference()`. Most FK-related tests in `migrationSpec.cfc` skip on SQLite (which doesn't support altering CONSTRAINTS) but run on every other engine in CI.
0 commit comments