From 51dba1959a7a74ab790ef1251c4645b6fd075ba5 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Fri, 31 Jul 2026 22:14:48 +0200 Subject: [PATCH] 2.18.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cut 2.18.0. Adds the retroactive entries for #114 and #70, whose PRs landed on main directly rather than on this branch. The fastlane changelog is now hand-written and capped at 500 chars — Play rejects longer "What's New" text and F-Droid truncates it, while copying the CHANGELOG.md section produced up to 8k chars. The sync script keeps a committed file and only falls back to CHANGELOG.md when one is missing. --- .gitea/workflows/release.yaml | 7 +-- CHANGELOG.md | 15 ++++++ app/build.gradle.kts | 4 +- docs/RELEASING.md | 29 ++++++++--- .../android/en-US/changelogs/21800.txt | 12 +++++ scripts/sync_changelog_to_fastlane.sh | 51 +++++++++++-------- 6 files changed, 84 insertions(+), 34 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/21800.txt diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index b821041..46fe5fc 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -264,9 +264,10 @@ jobs: cp app/build/outputs/apk/release/app-release.apk "fdroid/repo/calendula_v${VERSION}.apk" # Per-version "What's New": ensure this version's changelog exists in the - # fastlane tree (committed at release-cut time for the official repo; this - # regenerates it from CHANGELOG.md so the self-hosted repo never depends on - # the commit having happened). The transform below then carries it across. + # fastlane tree. The committed hand-written summary (kept under Play's + # 500-char cap) is used as-is; only if it is missing does the script fall + # back to CHANGELOG.md, so the self-hosted repo never depends on the + # commit having happened. The transform below then carries it across. - name: Ensure this version's changelog is in the fastlane tree if: env.IS_RELEASE == 'true' run: bash scripts/sync_changelog_to_fastlane.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index e23551d..19e5eeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.18.0] — 2026-07-31 + ### Added - A new event no longer always lasts an hour. **Settings → New event form → Default duration** sets how long one opens, and each calendar may keep its own @@ -57,6 +59,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 is now called **Harmonise calendar colours**; turning it off still shows the raw colours from your calendar source ([#21], [#36]). +### Fixed +- The back gesture closes the sidebar instead of the app. With the drawer open, + swiping back left Calendula altogether rather than putting the sidebar away + ([#114]). +- The sidebar lines up. "Calendula", "View" and "Calendars" now share the left + edge of the rows under them, and the view, jump-to-date, Settings and calendar + rows sit on one vertical axis instead of each icon finding its own — the same + alignment the Settings screens use ([#114]). +- The status- and navigation-bar icons follow Calendula's own light/dark choice. + Setting the app dark while the system stayed light — or the other way round — + left the clock and battery drawn for the system's theme, so they could sit + near-invisible against the app's own bar ([#70]). + ## [2.17.1] — 2026-07-30 ### Added diff --git a/app/build.gradle.kts b/app/build.gradle.kts index beebbc0..595c6ce 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,8 +28,8 @@ android { // which builds this version and then creates the matching vX.Y.Z tag + // release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 + // PATCH from versionName, e.g. 2.7.2 -> 20702). See docs/RELEASING.md. - versionCode = 21701 - versionName = "2.17.1" + versionCode = 21800 + versionName = "2.18.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 758760a..19537f7 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -33,15 +33,27 @@ Published version codes so far: `v0.1.0`→100 … `v1.0.0`→10000 … `v2.0.0` the F-Droid per-version changelog. 3. Bump the committed `versionName` (and `versionCode`) in `app/build.gradle.kts` to the new version. **This bump is what triggers the - release** when the branch merges to `main`. Then run + release** when the branch merges to `main`. Then write the per-version + "What's New" by hand to + `fastlane/metadata/android/en-US/changelogs/.txt` and commit it. + + **Keep it under 500 characters.** That one file is what both the **official** + F-Droid repo (which reads it from the tagged source tree) and **Google Play** + publish, and Play caps "What's New" at 500 characters while F-Droid truncates + long entries in-client. So it is a short summary — a handful of bullets + naming the headline changes — not a copy of the CHANGELOG.md section, which + runs to thousands of characters. `CHANGELOG.md` stays the full account and is + what the Gitea/Codeberg release notes use. + + Then run ```bash scripts/sync_changelog_to_fastlane.sh ``` - and commit the generated - `fastlane/metadata/android/en-US/changelogs/.txt`. This is what - makes the **official** F-Droid repo show this version's changelog (it reads - the changelog from the tagged source tree). The self-hosted pipeline - regenerates it regardless, so forgetting only affects the official listing. + to check it. The script **keeps** a committed file untouched and only warns + if it is over the limit; it extracts the CHANGELOG.md section as a fallback + solely when the file is missing, so the self-hosted pipeline always has + something to publish. The pipeline runs the same script, so forgetting to + write the file yields a long auto-generated changelog rather than none. 4. **Verify the release build on a real device** — the mandatory gate. The shipped APK is R8-shrunk/obfuscated, and bugs that only appear there, or only on first run, never show up in the debug build or on a device that @@ -142,8 +154,9 @@ because the store listing already lives in `fastlane/metadata/android/` — the same tree the official F-Droid repo harvests. One metadata source, two stores. **What gets uploaded per release:** the AAB, plus the per-version "What's New" -from `fastlane/metadata/android/en-US/changelogs/.txt` (generated -from `CHANGELOG.md` by `scripts/sync_changelog_to_fastlane.sh`). Listing text is +from `fastlane/metadata/android/en-US/changelogs/.txt` — the +hand-written summary from step 3, which is why it must stay **under 500 +characters**: Play rejects a longer one. Listing text is **not** touched — an accidental overwrite of a live listing triggers a Play policy review. Sync it deliberately with `bundle exec fastlane listing`. diff --git a/fastlane/metadata/android/en-US/changelogs/21800.txt b/fastlane/metadata/android/en-US/changelogs/21800.txt new file mode 100644 index 0000000..97acb85 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/21800.txt @@ -0,0 +1,12 @@ +New +• Default event duration — how long a new event opens, per calendar. +• Week & day: choose an hour height, or pinch to zoom. "Fit whole day" shows all 24 hours at once. +• Tap the date in the top bar to jump to another day. + +Changed +• Calendar colours reworked so event text is always readable. +• Reminders now carry Calendula's own status-bar icon. + +Fixed +• Back closes the sidebar instead of the app, and its rows line up. +• Status-bar icons follow the app's light/dark choice. diff --git a/scripts/sync_changelog_to_fastlane.sh b/scripts/sync_changelog_to_fastlane.sh index f6d0e93..f446965 100755 --- a/scripts/sync_changelog_to_fastlane.sh +++ b/scripts/sync_changelog_to_fastlane.sh @@ -1,19 +1,24 @@ #!/usr/bin/env bash -# Write the current version's CHANGELOG.md section into the fastlane changelog -# file that F-Droid harvests: fastlane/metadata/android/en-US/changelogs/.txt -# (en-US is F-Droid's fallback locale, so it covers every language). +# Ensure the current version's "What's New" exists at +# fastlane/metadata/android/en-US/changelogs/.txt — the one file both the +# official F-Droid repo and Google Play read (en-US is F-Droid's fallback +# locale, so it covers every language). # -# Run this when cutting a release (after editing CHANGELOG.md and bumping -# versionName in app/build.gradle.kts) and COMMIT the result, so the OFFICIAL -# F-Droid repo — which reads the changelog from the tagged source tree — shows -# this version's "What's New". The self-hosted release pipeline also runs it so -# its changelog never depends on the file having been committed. Idempotent. +# A COMMITTED file wins and is never rewritten. Play caps "What's New" at 500 +# characters and F-Droid truncates long entries in-client, so this file is a +# hand-written summary, not a copy of the CHANGELOG.md section — those run to +# thousands of characters. Write it when cutting a release, keep it under 500, +# and commit it. # -# Extraction matches the awk used for the Gitea release notes so all three -# (release notes, self-hosted changelog, official changelog) stay in sync. +# Only when the file is missing does this fall back to extracting the +# CHANGELOG.md section, so the self-hosted release pipeline always has +# something to publish. The extraction matches the awk used for the Gitea +# release notes. set -euo pipefail cd "$(dirname "$0")/.." # repo root +LIMIT=500 + VERSION=$(grep -oP 'versionName\s*=\s*"\K[^"]+' app/build.gradle.kts) [ -n "$VERSION" ] || { echo "No versionName in app/build.gradle.kts" >&2; exit 1; } MAJOR=${VERSION%%.*}; rest=${VERSION#*.}; MINOR=${rest%%.*}; PATCH=${rest##*.} @@ -24,18 +29,22 @@ CL_DIR="fastlane/metadata/android/en-US/changelogs" mkdir -p "$CL_DIR" OUT="$CL_DIR/${VERSION_CODE}.txt" -awk -v ver="$VERSION" ' - $0 ~ "^## \\[" ver "\\]" { flag = 1; next } - /^## \[/ { flag = 0 } - flag' CHANGELOG.md > "$OUT" -# Trim leading blank lines (same as the pipeline did). -sed -i -e '/./,$!d' "$OUT" -if [ ! -s "$OUT" ]; then - echo "See CHANGELOG.md for $VERSION." > "$OUT" +if [ -s "$OUT" ]; then + ACTION="Kept" +else + ACTION="Generated" + awk -v ver="$VERSION" ' + $0 ~ "^## \\[" ver "\\]" { flag = 1; next } + /^## \[/ { flag = 0 } + flag' CHANGELOG.md > "$OUT" + # Trim leading blank lines (same as the pipeline did). + sed -i -e '/./,$!d' "$OUT" + [ -s "$OUT" ] || echo "See CHANGELOG.md for $VERSION." > "$OUT" fi CHARS=$(wc -m < "$OUT" | tr -d ' ') -echo "Wrote $OUT (version $VERSION, code $VERSION_CODE, ${CHARS} chars)" -if [ "$CHARS" -gt 500 ]; then - echo " note: >500 chars — F-Droid may truncate this changelog in-client." >&2 +echo "$ACTION $OUT (version $VERSION, code $VERSION_CODE, ${CHARS} chars)" +if [ "$CHARS" -gt "$LIMIT" ]; then + echo " warning: >${LIMIT} chars — Play rejects this and F-Droid truncates it." >&2 + echo " Replace $OUT with a hand-written summary under ${LIMIT} chars." >&2 fi