diff --git a/CHANGELOG.md b/CHANGELOG.md index 24722d6..e0b4a3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # RustBox changelog +### 0.2.16 + +- Added opt-in adaptive HTML-mail colors that adjust neutral backgrounds and low-contrast text to the active light/dark theme while preserving layout, images and brand colors. +- Added mailbox pagination, enabled by default at 300 messages per page, with optional smooth progressive loading or full-folder loading. +- Added runtime schema migration V051 for SQLite, MySQL and PostgreSQL. Existing V050 databases gain `display_preferences.adaptive_email_colors` and `mail_preferences.message_loading_mode` before the new preferences are queried. +- Kept V050 as the consolidated compatibility baseline and removed the standalone V050 migration files because those changes are already present in the complete `schema.sql` definitions. +- Bumped the application/source release to 0.2.16. + ### 0.2.15 - Fixed HTML signature editor container semantics so clicks on whitespace/outside the editable area no longer implicitly activate the Bold toolbar button. @@ -7,10 +15,7 @@ - Fixed visible signatures in new messages by creating an editable body entry before the signature instead of placing the signature at the top of an otherwise empty editor. - Refined the visible-signature separator with more breathing room and a subtler solid rule so it reads as a boundary without dominating the composer. - Strips the editor-only body-entry marker from outgoing HTML while retaining the visible-signature marker used for de-duplication. -- Added an opt-in Appearance setting that adapts neutral HTML-mail backgrounds and low-contrast text to the active light/dark theme while preserving layout, images and brand colors. -- Consolidated migrations V047-V049 into the V049 compatibility baseline and removed their standalone migration files. V050 remains the single runtime migration for the unreleased 0.2.15 schema changes. Databases older than V049 must be upgraded to that baseline first. -- Added mailbox pagination, enabled by default at 300 messages per page, with optional smooth progressive loading or full-folder loading. -- Folded `display_preferences.adaptive_email_colors` and `mail_preferences.message_loading_mode` into the unreleased V050 runtime migration; V051 remains the next migration number. +- Consolidated migrations V047-V050 into the V050 compatibility baseline and removed their standalone migration files. Databases older than V050 must be upgraded through a V050-capable release first. - Bumped the application/source release to 0.2.15. ### 0.2.14 diff --git a/Cargo.lock b/Cargo.lock index 9147174..afa7ce7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3506,7 +3506,7 @@ dependencies = [ [[package]] name = "rustbox" -version = "0.2.15" +version = "0.2.16" dependencies = [ "aes-gcm", "async-imap", diff --git a/Cargo.toml b/Cargo.toml index 8f4c123..432f159 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustbox" -version = "0.2.15" +version = "0.2.16" edition = "2024" rust-version = "1.99.1" default-run = "rustbox" diff --git a/NOTICE.md b/NOTICE.md index d6abdcf..3727ac2 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -1,6 +1,6 @@ # RustBox attribution / notice -RustBox 0.2.15 is derived from the Oxi webmail project: +RustBox 0.2.16 is derived from the Oxi webmail project: - Upstream: `c0h1b4/oxi` - Base snapshot: `7f1507c486b78cf33e54beb701dd460d3bd2bd5d` diff --git a/README.md b/README.md index 7014745..af1970c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# RustBox 0.2.15 +# RustBox 0.2.16 RustBox is a webmail derived from `c0h1b4/oxi`. The consumed Oxi revision is recorded in `UPSTREAM_BASE`. @@ -34,7 +34,7 @@ rustbox/ `build.rs` combines the CSS modules from `src/web/css/manifest.txt` and JavaScript modules from `src/web/js/manifest.txt`. Cargo embeds the generated CSS/JS bundles, HTML and SVG sprite in the RustBox executable. There is no standalone source `src/web/app.js`; `src/web/` is the single source of truth and Cargo generates the embedded bundles in `OUT_DIR`. -## Storage and search in 0.2.15 +## Storage and search in 0.2.16 RustBox separates three concerns: SQL metadata, blob storage and search. The SQL engine does **not** decide whether `data_dir` may be used. A single-node PostgreSQL/MySQL deployment may still use filesystem blobs and local Tantivy. In cluster mode, local node state is rejected unless the configured backend is explicitly shared. @@ -168,7 +168,7 @@ rustbox search reindex Ready Docker examples are in `docker/`: standalone SQLite, PostgreSQL + SILO (S3-compatible) + OpenSearch, and MySQL + NFS + OpenSearch. -All executable application SQL is centralized by dialect under `src/queries/{sqlite,mysql,pgsql}/queries.rs`. Migrations V047-V049 are consolidated into the V049 compatibility baseline. V050 remains the single runtime migration and contains compact rows, signature insertion mode, adaptive HTML-mail colors and mailbox loading mode. Databases older than V049 must first be upgraded to that baseline. V051 is the next migration number. See `migrations/README.md`. +All executable application SQL is centralized by dialect under `src/queries/{sqlite,mysql,pgsql}/queries.rs`. Migrations V047-V050 are consolidated into the V050 compatibility baseline; databases older than V050 must first be upgraded with a release that can reach that baseline. RustBox 0.2.16 adds V051 for adaptive HTML-mail colors and mailbox loading mode; fresh schemas already contain those columns, while existing V050 tenants migrate automatically to V051. V052 is the next migration number. See `migrations/README.md`. ## Development @@ -237,7 +237,7 @@ Initialize Git after extracting the release archive: ```bash git init git add . -git commit -m "RustBox 0.2.15 release" +git commit -m "RustBox 0.2.16 release" ./scripts/setup-upstream.sh ``` diff --git a/RELEASE-MANIFEST.txt b/RELEASE-MANIFEST.txt index c6d2551..4a0dfb7 100644 --- a/RELEASE-MANIFEST.txt +++ b/RELEASE-MANIFEST.txt @@ -1,6 +1,6 @@ -RustBox 0.2.15 release manifest +RustBox 0.2.16 release manifest -0.2.15 release changes and retained feature set: +0.2.16 release changes and retained feature set: - fixes HTML signature formatting so toolbar actions preserve the selected text and reliably toggle formatting - gives new messages with visible signatures a real editable body entry above the signature and softens/spaces the composer-only separator - strips the editor-only body-entry marker from serialized outgoing HTML while retaining signature de-duplication metadata @@ -30,7 +30,7 @@ RustBox 0.2.15 release manifest - previews PDFs from the authenticated inline attachment endpoint instead of a blob iframe for Safari/iPhone compatibility - presents compose attachment/message size limits as compact raw values without implementation-detail descriptions - retains the 0.2.9 realtime notification, shortcut and 300-message mailbox behavior -- adds opt-in adaptive HTML-mail colors in Appearance and folds both it and mailbox loading mode into the unreleased V050 runtime migration; V051 remains next +- adds opt-in adaptive HTML-mail colors in Appearance plus mailbox loading-mode selection, persisted by runtime migration V051 Architecture: - database_backend = sqlite | mysql | pgsql selects authoritative SQL only - blob storage and search are independent from the SQL engine @@ -54,10 +54,10 @@ Search: Database/schema: - migrations/{sqlite,mysql,pgsql}/schema.sql contain the current fresh schema -- compatibility baseline is V049; former V047-V049 changes are consolidated into `schema.sql`, while V050 remains the single runtime migration -- databases older than V049 must be upgraded to schema V049 before using this build -- V050 contains `mail_preferences.compact_wide_rows`, `identities.signature_insert_mode`, `display_preferences.adaptive_email_colors` and `mail_preferences.message_loading_mode` because this release has not shipped yet -- next migration number: V051 +- compatibility baseline is V050; former V047-V050 changes are consolidated into `schema.sql` and their standalone migrations are removed +- databases older than V050 must be upgraded with a V050-capable RustBox release before using this build +- V051 adds `display_preferences.adaptive_email_colors` and `mail_preferences.message_loading_mode` to existing V050 tenants +- next migration number: V052 Docker examples: - docker/compose-single-sqlite.yml @@ -67,14 +67,14 @@ Docker examples: Operations/docs: - standalone `scripts/migrate_roundcube.py` imports Roundcube contacts/identities using RustBox config.toml and supports SQLite/MySQL/PostgreSQL targets -- README.md documents 0.2.15 configuration +- README.md documents 0.2.16 configuration - docker/README.md documents Compose variants - docs/STORAGE_SEARCH_OPERATIONS.md documents failure modes, shared-storage requirements and migration behavior - TODO.md leaves live SILO/MinIO/AWS/Ceph and real multi-node acceptance validation explicitly pending Build/release metadata: - `scripts/package-release.sh` runs the full Rust release gate before creating ZIP/SHA256 artifacts -- Cargo.toml version = 0.2.15 +- Cargo.toml version = 0.2.16 - rust-toolchain.toml pins Rust 1.99.1 - Cargo.lock is retained for reproducible application builds; the release gate generates it only when missing - CI and scripts/build-release.sh use the retained Cargo.lock (generating it only if missing), then run locked tests/Clippy/release build diff --git a/RELEASE-VALIDATION.txt b/RELEASE-VALIDATION.txt index 98ca8e5..56e64ba 100644 --- a/RELEASE-VALIDATION.txt +++ b/RELEASE-VALIDATION.txt @@ -1,6 +1,6 @@ -RustBox 0.2.15 - final source validation +RustBox 0.2.16 - final source validation -0.2.15 scope: +0.2.16 scope: - signature HTML formatting preserves selected text across toolbar clicks, including formatting removal, while collapsed-caret clicks cannot enable sticky bold/italic/underline typing modes - the HTML signature editor is no longer wrapped in a label, preventing whitespace/outside clicks from implicitly activating the Bold toolbar button - new messages with visible signatures provide an editable body area above a more subtle, better-spaced separator @@ -27,8 +27,8 @@ RustBox 0.2.15 - final source validation - PDF attachment preview uses the authenticated inline URL for Safari/iPhone compatibility - Composing shows only compact attachment/message size-limit values on one line - 0.2.9 realtime notification gating, browser shortcut preservation and 300-message defaults remain intact -- V047-V049 are consolidated into compatibility baseline V049; V050 is the single runtime migration and includes adaptive HTML-mail colors and mailbox loading mode, with V051 next -- version metadata updated to 0.2.15 +- V047-V050 are consolidated into compatibility baseline V050; V051 migrates existing tenants with adaptive HTML-mail colors and mailbox loading mode; V052 is next +- version metadata updated to 0.2.16 Completed in this environment: - offline release validator: scripts/validate-release-static.py (421/421 checks passed) @@ -36,8 +36,8 @@ Completed in this environment: - all JSON files parse successfully - Python helper scripts compile successfully - shell scripts pass `bash -n` -- release metadata consistently identifies 0.2.15 -- V049 baseline consolidation plus the single V050 runtime migration, adaptive colors and mailbox loading mode are validated offline +- release metadata consistently identifies 0.2.16 +- V050 baseline consolidation plus the V051 adaptive-colors/mailbox-loading migration are validated offline Not executable in this packaging environment: diff --git a/config.example.toml b/config.example.toml index c5030a0..92d7361 100644 --- a/config.example.toml +++ b/config.example.toml @@ -1,4 +1,4 @@ -# RustBox 0.2.15 +# RustBox 0.2.16 host = "127.0.0.1" port = 3001 environment = "production" diff --git a/docs/IMPLEMENTATION_STATUS.md b/docs/IMPLEMENTATION_STATUS.md index a2951e7..a074ffa 100644 --- a/docs/IMPLEMENTATION_STATUS.md +++ b/docs/IMPLEMENTATION_STATUS.md @@ -1,9 +1,9 @@ -# RustBox 0.2.15 - implementation status +# RustBox 0.2.16 - implementation status - Draft saves are realtime-silent: Drafts folder/list updates continue, but saving a draft does not surface as a new-mail notification. -This file tracks the `0.2.15` source snapshot. Storage/search scope and outstanding acceptance work are tracked in `TODO.md`. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly. +This file tracks the `0.2.16` source snapshot. Storage/search scope and outstanding acceptance work are tracked in `TODO.md`. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly. -## 0.2.15 browser mail UX +## 0.2.16 browser mail UX - Signature HTML formatting now preserves the selected text when toolbar controls are used, so bold/italic/underline and remove-format can be toggled reliably. - New messages with a visible signature always get an editable body line before the signature; the composer separator is spaced farther from the body and rendered as a subtle solid rule. @@ -28,7 +28,7 @@ This file tracks the `0.2.15` source snapshot. Storage/search scope and outstand - Initial synchronization remains silent for new-mail notifications; bulk operations retain one summary toast; browser/system modifier shortcuts remain preserved. - Mailbox pagination is enabled by default at 300 messages per page; the API/preferences accept page sizes up to 300, with progressive and load-all alternatives. - Blob deletion uses a durable SQL outbox for filesystem/shared POSIX/NFS and S3 backends; attachment/draft metadata deletion is transactionally paired with cleanup enqueue and failed deletes retry in the background. -- V047-V049 are consolidated into the V049 compatibility baseline. V050 remains the single runtime migration and includes compact rows, signature insertion mode, adaptive HTML-mail colors and mailbox loading mode; V051 is next. +- V047-V050 are consolidated into the V050 compatibility baseline. RustBox 0.2.16 uses V051 to add adaptive HTML-mail colors and mailbox loading mode to existing V050 tenants; V052 is next. ## 0.2.8 browser security headers @@ -48,7 +48,7 @@ This file tracks the `0.2.15` source snapshot. Storage/search scope and outstand - Draft attachment upload/read/delete/snapshot/send paths use the `BlobStorage` abstraction and logical object keys instead of assuming node-local paths. - OpenSearch is available as the cluster-capable indexer. Local Tantivy remains single-node only; search may also be disabled. - Search mutations use a durable SQL outbox with claim/lease, retry/backoff and dead-letter state; the index remains rebuildable derived state. -- The V049 compatibility baseline includes the former V047 attachment/search-outbox, V048 folder counter generation and V049 blob deletion outbox changes. V050 is the single runtime migration for compact-row/signature preferences, adaptive HTML-mail colors and mailbox loading mode. V051 is reserved as the next migration number. +- The V050 compatibility baseline includes the former V047 attachment/search-outbox changes, V048 folder counter generation, V049 blob deletion outbox and compact-row/signature preferences. V051 adds adaptive HTML-mail colors and mailbox loading mode; V052 is reserved as the next migration number. - SQL global-schema initialization is centralized in `db::pool::configure()`; database-backed sessions do not repeat startup DDL for SQLite, MySQL or PostgreSQL. - Docker Compose examples cover standalone SQLite, PostgreSQL + SILO (S3-compatible) + OpenSearch, and MySQL + NFS + OpenSearch. - Live SILO/MinIO/AWS S3/Ceph RGW, live NFS multi-host, live OpenSearch and full multi-node failover acceptance remain release-environment validation items and are not represented as completed here. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 7d05521..a100df5 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -26,7 +26,7 @@ RUSTBOX_CONFIG=./config.dev.toml ./target/release/rustbox --check-config Browser JavaScript source lives in functional modules under `src/web/js/`, ordered by `src/web/js/manifest.txt`. `build.rs` concatenates those modules into the embedded `rustbox-ui.js` asset during every Cargo build. The repository has no duplicate `ui/` snapshot; `src/web/` is the only browser UI source. -## Updating an existing checkout to 0.2.15 +## Updating an existing checkout to 0.2.16 Do not overlay the release with `cp *` or another command that skips dotfiles. That can retain stale `.github`, `.env.example`, or `Cargo.lock` files. diff --git a/docs/STORAGE_SEARCH_OPERATIONS.md b/docs/STORAGE_SEARCH_OPERATIONS.md index 89a2124..2907d26 100644 --- a/docs/STORAGE_SEARCH_OPERATIONS.md +++ b/docs/STORAGE_SEARCH_OPERATIONS.md @@ -1,6 +1,6 @@ -# RustBox 0.2.15 storage/search operations +# RustBox 0.2.16 storage/search operations -RustBox 0.2.15 treats SQL, blob storage and search as independent capabilities. The database engine does not decide whether `data_dir` is allowed. +RustBox 0.2.16 treats SQL, blob storage and search as independent capabilities. The database engine does not decide whether `data_dir` is allowed. ## Deployment matrix diff --git a/migrations/README.md b/migrations/README.md index 6f71c99..8543d0c 100644 --- a/migrations/README.md +++ b/migrations/README.md @@ -1,42 +1,35 @@ -# Database schemas and migrations +# RustBox database schema and migrations -RustBox keeps SQL, blob storage and search as independent concerns. +RustBox keeps one complete fresh-install schema per supported SQL backend: -```text -database_backend = sqlite | mysql | pgsql -session_backend = database | redis -storage.backend = filesystem | s3 -search.backend = disabled | local_tantivy | opensearch -``` +- `sqlite/schema.sql` +- `mysql/schema.sql` +- `pgsql/schema.sql` -## Layout +## Compatibility baseline -```text -migrations/ -├── sqlite/schema.sql -├── mysql/schema.sql -└── pgsql/schema.sql -``` +The consolidated compatibility baseline is **V050**. Historical migrations V047-V050 are already represented by the complete `schema.sql` files and are intentionally not shipped as standalone runtime migrations in this source tree. -Each `schema.sql` is the complete V050 schema for fresh installations. Migrations V047-V049 have been consolidated into the **V049 compatibility baseline** and their standalone files are intentionally removed. V050 remains the single runtime migration. Because RustBox 0.2.15 has not been released yet, V050 includes `mail_preferences.compact_wide_rows`, `identities.signature_insert_mode`, `display_preferences.adaptive_email_colors` and `mail_preferences.message_loading_mode`. +Databases older than V050 must first be upgraded with a RustBox release that can reach V050. RustBox 0.2.16 accepts V050 databases and migrates them forward normally. -`mail_preferences.message_loading_mode` defaults to `pagination`; `messages_per_page` defaults to 300. Supported modes are `pagination`, `progressive` and `all`. +## V051 — RustBox 0.2.16 -Databases older than **V049** are no longer migrated directly by this build. Upgrade them to schema V049 first; this build then applies V050. **V051** is the next migration number after this snapshot. +V051 adds the preferences introduced in 0.2.16: -Account data is isolated inside the selected physical database with a deterministic, collision-checked table prefix derived from the account hash. The `{{p}}` marker in tenant SQL is replaced by RustBox at provisioning time. Sessions are global and therefore are not prefixed. +- `display_preferences.adaptive_email_colors`, default `0` / disabled; +- `mail_preferences.message_loading_mode`, default `pagination`. -## Runtime migrations +`mail_preferences.messages_per_page` remains `300` by default. Supported message loading modes are `pagination`, `progressive` and `all`. -V050 is the only runtime migration in this unreleased snapshot. Future schema-changing releases must add the same logical migration for SQLite, MySQL and PostgreSQL and register it in `src/db/pool.rs`. +Fresh installations already contain the V051 columns in `schema.sql` and are registered at the latest schema version. Existing V050 tenants execute `V051__adaptive_email_colors_and_message_loading_mode.sql` before application queries use the new columns. -Redis and Redis Sentinel do not use SQL migrations. +The next migration number is **V052**. -## Engine notes +## Migration rules -- SQLite uses `data_dir/rustbox.sqlite` by default; `database_url` may point to another persistent SQLite file. -- MySQL requires `database_url` and targets MySQL 8.0.13 or newer. -- PostgreSQL requires `database_url`. -- MySQL/PostgreSQL are full application backends, not session-only databases. -- The SQL engine does not choose blob/search storage. PostgreSQL/MySQL may still use local filesystem/Tantivy in single-node mode. -- Cluster mode requires a shared MySQL/PostgreSQL database plus cluster-safe blob/search choices; local `data_dir` is not inherently required. +Any future schema-changing release must: + +1. update all three complete `schema.sql` files; +2. add the same logical numbered migration for SQLite, MySQL and PostgreSQL; +3. register that migration in `src/db/pool.rs`; +4. extend the offline migration tests in `scripts/validate-release-static.py`. diff --git a/migrations/pgsql/V050__compact_rows_and_signature_mode.sql b/migrations/mysql/V051__adaptive_email_colors_and_message_loading_mode.sql similarity index 51% rename from migrations/pgsql/V050__compact_rows_and_signature_mode.sql rename to migrations/mysql/V051__adaptive_email_colors_and_message_loading_mode.sql index 436e705..7e975c4 100644 --- a/migrations/pgsql/V050__compact_rows_and_signature_mode.sql +++ b/migrations/mysql/V051__adaptive_email_colors_and_message_loading_mode.sql @@ -3,9 +3,3 @@ ALTER TABLE {{p}}display_preferences ALTER TABLE {{p}}mail_preferences ADD COLUMN message_loading_mode TEXT NOT NULL DEFAULT 'pagination'; - -ALTER TABLE {{p}}mail_preferences - ADD COLUMN compact_wide_rows BIGINT NOT NULL DEFAULT 1; - -ALTER TABLE {{p}}identities - ADD COLUMN signature_insert_mode TEXT NOT NULL DEFAULT 'silent'; diff --git a/migrations/mysql/schema.sql b/migrations/mysql/schema.sql index cf0ad28..079252c 100644 --- a/migrations/mysql/schema.sql +++ b/migrations/mysql/schema.sql @@ -1,7 +1,7 @@ -- RustBox 0.2.0 MySQL schema. -- One physical database contains global sessions plus isolated per-account tables. -- Application tables are materialized by replacing {{p}} with a collision-checked prefix. --- Squashed compatibility baseline: V049. Current schema: V050. +-- Squashed compatibility baseline: V050; current schema: V051. -- RUSTBOX:GLOBAL-BEGIN CREATE TABLE IF NOT EXISTS rustbox_accounts ( diff --git a/migrations/mysql/V050__compact_rows_and_signature_mode.sql b/migrations/pgsql/V051__adaptive_email_colors_and_message_loading_mode.sql similarity index 50% rename from migrations/mysql/V050__compact_rows_and_signature_mode.sql rename to migrations/pgsql/V051__adaptive_email_colors_and_message_loading_mode.sql index d724db9..7e975c4 100644 --- a/migrations/mysql/V050__compact_rows_and_signature_mode.sql +++ b/migrations/pgsql/V051__adaptive_email_colors_and_message_loading_mode.sql @@ -3,9 +3,3 @@ ALTER TABLE {{p}}display_preferences ALTER TABLE {{p}}mail_preferences ADD COLUMN message_loading_mode TEXT NOT NULL DEFAULT 'pagination'; - -ALTER TABLE {{p}}mail_preferences - ADD COLUMN compact_wide_rows BIGINT NOT NULL DEFAULT 1; - -ALTER TABLE {{p}}identities - ADD COLUMN signature_insert_mode VARCHAR(16) NOT NULL DEFAULT 'silent'; diff --git a/migrations/pgsql/schema.sql b/migrations/pgsql/schema.sql index a5e951b..60f1667 100644 --- a/migrations/pgsql/schema.sql +++ b/migrations/pgsql/schema.sql @@ -1,7 +1,7 @@ -- RustBox 0.2.0 PostgreSQL schema. -- One physical database contains global sessions plus isolated per-account tables. -- Application tables are materialized by replacing {{p}} with a collision-checked prefix. --- Squashed compatibility baseline: V049. Current schema: V050. +-- Squashed compatibility baseline: V050; current schema: V051. -- RUSTBOX:GLOBAL-BEGIN CREATE TABLE IF NOT EXISTS rustbox_accounts ( diff --git a/migrations/sqlite/V050__compact_rows_and_signature_mode.sql b/migrations/sqlite/V051__adaptive_email_colors_and_message_loading_mode.sql similarity index 51% rename from migrations/sqlite/V050__compact_rows_and_signature_mode.sql rename to migrations/sqlite/V051__adaptive_email_colors_and_message_loading_mode.sql index 3d8aa6a..a75eb08 100644 --- a/migrations/sqlite/V050__compact_rows_and_signature_mode.sql +++ b/migrations/sqlite/V051__adaptive_email_colors_and_message_loading_mode.sql @@ -3,9 +3,3 @@ ALTER TABLE {{p}}display_preferences ALTER TABLE {{p}}mail_preferences ADD COLUMN message_loading_mode TEXT NOT NULL DEFAULT 'pagination'; - -ALTER TABLE {{p}}mail_preferences - ADD COLUMN compact_wide_rows INTEGER NOT NULL DEFAULT 1; - -ALTER TABLE {{p}}identities - ADD COLUMN signature_insert_mode TEXT NOT NULL DEFAULT 'silent'; diff --git a/migrations/sqlite/schema.sql b/migrations/sqlite/schema.sql index c47002b..5fea266 100644 --- a/migrations/sqlite/schema.sql +++ b/migrations/sqlite/schema.sql @@ -1,7 +1,7 @@ -- RustBox 0.2.0 SQLite schema. -- One physical database contains global sessions plus isolated per-account tables. -- Application tables are materialized from the tenant section by replacing {{p}}. --- Squashed compatibility baseline: V049. Current schema: V050. +-- Squashed compatibility baseline: V050; current schema: V051. -- RUSTBOX:GLOBAL-BEGIN CREATE TABLE IF NOT EXISTS rustbox_accounts ( diff --git a/packaging/rustbox.toml b/packaging/rustbox.toml index 7272dc5..97a0c3d 100644 --- a/packaging/rustbox.toml +++ b/packaging/rustbox.toml @@ -1,4 +1,4 @@ -# RustBox 0.2.15 - packaged production configuration (DEB/RPM) +# RustBox 0.2.16 - packaged production configuration (DEB/RPM) # # This file contains all supported RustBox configuration options. # Commented options are optional and do not change the packaged defaults. diff --git a/scripts/validate-release-static.py b/scripts/validate-release-static.py index 460fb8c..c2bde50 100755 --- a/scripts/validate-release-static.py +++ b/scripts/validate-release-static.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Static/offline release checks for RustBox 0.2.15. +"""Static/offline release checks for RustBox 0.2.16. These checks intentionally avoid pretending to replace `cargo test`: they validate configuration, SQL migrations, Docker examples, query-catalog parity and release @@ -49,14 +49,14 @@ def extract_section(text: str, begin: str, end: str) -> str: # Release/toolchain metadata. cargo = tomllib.loads(read("Cargo.toml")) -require(cargo["package"]["version"] == "0.2.15", "Cargo package version is 0.2.15") +require(cargo["package"]["version"] == "0.2.16", "Cargo package version is 0.2.16") require(cargo["package"]["rust-version"] == "1.99.1", "Cargo rust-version is 1.99.1") toolchain = tomllib.loads(read("rust-toolchain.toml")) require(toolchain["toolchain"]["channel"] == "1.99.1", "rust-toolchain pins Rust 1.99.1") require((ROOT / "Cargo.lock").is_file(), "Cargo.lock is retained for reproducible application builds") lock = tomllib.loads(read("Cargo.lock")) lock_rustbox = next((pkg for pkg in lock.get("package", []) if pkg.get("name") == "rustbox"), {}) -require(lock_rustbox.get("version") == "0.2.15", "Cargo.lock RustBox package version is 0.2.15") +require(lock_rustbox.get("version") == "0.2.16", "Cargo.lock RustBox package version is 0.2.16") require(cargo["dependencies"].get("encoding_rs") == "0.8", "direct charset decoder dependency is pinned") require("encoding_rs" in lock_rustbox.get("dependencies", []), "Cargo.lock records direct charset decoder dependency") require("cargo generate-lockfile" in read("scripts/build-release.sh"), "release script generates Cargo.lock when missing") @@ -71,10 +71,10 @@ require("make_zip.py" in package_script and "sha256sum" in package_script, "rele require("cargo generate-lockfile" in read(".github/workflows/ci.yml"), "CI regenerates Cargo.lock before --locked checks") require("validate-release-static.py" in read("scripts/build-release.sh"), "release script runs offline/static release gate") require("validate-release-static.py" in read(".github/workflows/ci.yml"), "CI runs offline/static release gate") -require(read("README.md").startswith("# RustBox 0.2.15"), "README identifies RustBox 0.2.15") -require(read("RELEASE-MANIFEST.txt").startswith("RustBox 0.2.15"), "release manifest identifies RustBox 0.2.15") -require(read("RELEASE-VALIDATION.txt").startswith("RustBox 0.2.15"), "release validation identifies RustBox 0.2.15") -require(read("docs/IMPLEMENTATION_STATUS.md").startswith("# RustBox 0.2.15"), "implementation status identifies RustBox 0.2.15") +require(read("README.md").startswith("# RustBox 0.2.16"), "README identifies RustBox 0.2.16") +require(read("RELEASE-MANIFEST.txt").startswith("RustBox 0.2.16"), "release manifest identifies RustBox 0.2.16") +require(read("RELEASE-VALIDATION.txt").startswith("RustBox 0.2.16"), "release validation identifies RustBox 0.2.16") +require(read("docs/IMPLEMENTATION_STATUS.md").startswith("# RustBox 0.2.16"), "implementation status identifies RustBox 0.2.16") bootstrap_js = read("src/web/js/00-bootstrap.js") bindings_js = read("src/web/js/95-bindings-boot.js") realtime_js = read("src/web/js/80-settings-realtime.js") @@ -111,7 +111,6 @@ require('id="compose-save-draft"' in read("src/web/index.html") and '$("#compose require('rememberSignatureRange' in bindings_js and 'selectedSignatureRange' in bindings_js and 'if (!range || range.collapsed) return null;' in bindings_js and 'state.identitySignatureRange = null;' in bindings_js and '.signature-editor-toolbar button' in bindings_js and 'event.preventDefault();' in bindings_js and 'restoreEditorRange(range, signatureEditor);' in bindings_js, "signature formatting preserves real selections and refuses collapsed-caret commands that would enable sticky typing styles") index_html = read("src/web/index.html") -require('