Compare commits

..

4 Commits

Author SHA1 Message Date
0875e69c2d Merge pull request 'build(fdroid): drop unused foojay toolchain resolver; release v2.7.4' (#24) from release/v2.7.4 into main
All checks were successful
Release — F-Droid repo + Gitea release / detect (push) Successful in 5s
Release — F-Droid repo + Gitea release / release (push) Successful in 8m15s
Reviewed-on: #24
2026-06-21 18:23:46 +00:00
ac572da40a build(fdroid): drop unused foojay toolchain resolver; release v2.7.4
All checks were successful
CI / ci (pull_request) Successful in 8m50s
F-Droid's official build scanner rejects the foojay-resolver-convention
plugin because it can fetch a JDK over the network during the offline,
reproducible build. The plugin was inert here (no toolchain block ever
invoked it), so removing it leaves the app functionally identical to
2.7.3 and still reproducible byte-for-byte from source.

Bumps versionName to 2.7.4 (the release trigger) and retargets the
official fdroiddata recipe draft at v2.7.4, plus two recipe corrections
the fdroiddata CI caught on the v2.7.3 submission (MR !40967):
- Categories: 'Time' (retired in the current taxonomy) -> 'Calendar & Agenda'
- AutoUpdateMode: 'Version v%v' (invalid per schema) -> 'Version'

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:09:31 +02:00
f27811d215 Merge pull request 'chore(fdroid): finalize recipe at v2.7.3 + reproducible-release CI guard' (#23) from chore/fdroid-recipe-2730 into main
All checks were successful
Release — F-Droid repo + Gitea release / detect (push) Successful in 4s
Release — F-Droid repo + Gitea release / release (push) Has been skipped
Reviewed-on: #23
2026-06-21 12:59:56 +00:00
36e2199dff chore(fdroid): finalize recipe at v2.7.3 + reproducible-release CI guard
All checks were successful
CI / ci (pull_request) Successful in 8m50s
v2.7.3 is the first release built with `vcsInfo { include = false }` and is
verified reproducible: a clean from-source build matched the published
calendula_v2.7.3.apk byte-for-byte across all 1382 zip entries (only the
signature block differs, which F-Droid copies).

- Point the fdroiddata recipe's Builds entry + CurrentVersion at v2.7.3
  (was the 2.7.2 placeholder, which lacks the fix and would fail verification).
- UpdateCheckMode: Tags ^v[0-9.]+$ — after this one-time submission F-Droid
  auto-tracks new release tags and adds build entries itself; no manual recipe
  edits per release.
- Add scripts/check_reproducible_release.sh + an always-on CI step asserting the
  release build keeps VCS-info disabled, so reproducibility can't silently
  regress and quietly stop official-repo publishing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:28:01 +02:00
7 changed files with 65 additions and 20 deletions

View File

@@ -30,6 +30,12 @@ jobs:
# Full history so the base..HEAD diff below has a merge-base. # Full history so the base..HEAD diff below has a merge-base.
fetch-depth: 0 fetch-depth: 0
# Cheap, always-on guard: the release build must stay reproducible for the
# official F-Droid repo (no AGP VCS-info embedding). Runs regardless of
# change scope so a regression can't slip through on a "docs-only" PR.
- name: Reproducible-release invariant
run: bash scripts/check_reproducible_release.sh
# Decide whether anything that affects the app build changed. Docs, # Decide whether anything that affects the app build changed. Docs,
# F-Droid metadata and the licence don't, so those PRs skip the SDK + # F-Droid metadata and the licence don't, so those PRs skip the SDK +
# Gradle work below but still report a green `ci`. # Gradle work below but still report a green `ci`.

View File

@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [2.7.4] — 2026-06-21
### Changed
- Build cleanup that lets Calendula ship in the official F-Droid repository:
removed an unused Gradle toolchain-resolver plugin, which F-Droid's offline,
reproducible build process disallows. No functional or visible changes — this
is the same app as 2.7.3.
## [2.7.3] — 2026-06-21 ## [2.7.3] — 2026-06-21
### Fixed ### Fixed

View File

@@ -28,8 +28,8 @@ android {
// which builds this version and then creates the matching vX.Y.Z tag + // which builds this version and then creates the matching vX.Y.Z tag +
// release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 + // release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 +
// PATCH from versionName, e.g. 2.7.2 -> 20702). See docs/RELEASING.md. // PATCH from versionName, e.g. 2.7.2 -> 20702). See docs/RELEASING.md.
versionCode = 20703 versionCode = 20704
versionName = "2.7.3" versionName = "2.7.4"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -15,7 +15,7 @@
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
Categories: Categories:
- Time - Calendar & Agenda
License: MIT License: MIT
AuthorName: Jean-Luc Makiola AuthorName: Jean-Luc Makiola
SourceCode: https://gitea.jeanlucmakiola.de/makiolaj/calendula SourceCode: https://gitea.jeanlucmakiola.de/makiolaj/calendula
@@ -27,16 +27,18 @@ AutoName: Calendula
RepoType: git RepoType: git
Repo: https://gitea.jeanlucmakiola.de/makiolaj/calendula.git Repo: https://gitea.jeanlucmakiola.de/makiolaj/calendula.git
# IMPORTANT: the first build entry MUST target the first release that contains # First build entry = v2.7.4, the first release that BOTH disables AGP VCS-info
# `vcsInfo { include = false }` (added on branch chore/release-verification-process). # (`vcsInfo { include = false }`, since v2.7.3) AND drops the unused Gradle
# v2.7.1 and earlier embed META-INF/version-control-info.textproto, whose # foojay toolchain-resolver plugin, which F-Droid's offline build scanner rejects
# env-dependent git metadata breaks reproducibility — they will NOT verify. # (it can fetch a JDK over the network). The plugin was inert here (no toolchain
# Update the versionName/versionCode/commit/Binaries below once that release is # block invoked it), so v2.7.4 is functionally identical to v2.7.3 and reproduces
# tagged (e.g. v2.7.2 -> versionCode 20702). Values below are placeholders. # byte-for-byte from source. v2.7.3 and earlier either embed
# META-INF/version-control-info.textproto or trip the foojay scanner — do not
# target them. Subsequent versions are added automatically (AutoUpdateMode).
Builds: Builds:
- versionName: 2.7.2 - versionName: 2.7.4
versionCode: 20702 versionCode: 20704
commit: v2.7.2 commit: v2.7.4
subdir: app subdir: app
gradle: gradle:
- yes - yes
@@ -49,10 +51,13 @@ Builds:
AllowedAPKSigningKeys: 5cdaee8eb31cb0df9157c646ae3ec8b3dc43b5bb72624e088c9ddea0c4eb5ec1 AllowedAPKSigningKeys: 5cdaee8eb31cb0df9157c646ae3ec8b3dc43b5bb72624e088c9ddea0c4eb5ec1
# Our own developer-signed APK for reproducible-build verification. %v -> the # Our own developer-signed APK for reproducible-build verification. %v -> the
# versionName, so v2.7.2 resolves to calendula_v2.7.2.apk on the self-hosted repo. # versionName, so v2.7.4 resolves to calendula_v2.7.4.apk on the self-hosted repo.
Binaries: https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo/calendula_v%v.apk Binaries: https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo/calendula_v%v.apk
AutoUpdateMode: Version v%v # After this one-time submission F-Droid auto-tracks new vX.Y.Z tags and creates
UpdateCheckMode: Tags # build entries itself — no manual recipe edits per release. The tag regex keeps
CurrentVersion: 2.7.2 # it to release tags only.
CurrentVersionCode: 20702 AutoUpdateMode: Version
UpdateCheckMode: Tags ^v[0-9.]+$
CurrentVersion: 2.7.4
CurrentVersionCode: 20704

View File

@@ -0,0 +1,6 @@
### Changed
- Build cleanup that lets Calendula ship in the official F-Droid repository:
removed an unused Gradle toolchain-resolver plugin, which F-Droid's offline,
reproducible build process disallows. No functional or visible changes — this
is the same app as 2.7.3.

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
# Reproducibility guard for the official F-Droid repo.
#
# F-Droid only republishes OUR signed binary if a from-source build reproduces
# it byte-for-byte. AGP's VCS-info injection writes
# META-INF/version-control-info.textproto with build-environment git metadata
# (commit hash / path) — env-dependent, and the one thing that broke
# reproducibility before we disabled it. It MUST stay off on the release build,
# or new versions silently stop publishing to the official repo (fails safe, but
# you'd be stuck on an old version without noticing). Fail loudly if it regresses.
set -euo pipefail
F="app/build.gradle.kts"
# Match `vcsInfo { ... include = false ... }` within the block, tolerant of
# whitespace/newlines (-z: whole file as one record; [^}] stays inside the block).
if grep -Pzoq 'vcsInfo\s*\{[^}]*include\s*=\s*false' "$F"; then
echo "OK: release build disables AGP VCS-info — stays reproducible for F-Droid."
else
echo "ERROR: '$F' release build is missing 'vcsInfo { include = false }'." >&2
echo "AGP would embed env-dependent git metadata (version-control-info.textproto)," >&2
echo "breaking F-Droid reproducible builds. Restore it. See docs/fdroid-official/." >&2
exit 1
fi

View File

@@ -11,9 +11,6 @@ pluginManagement {
gradlePluginPortal() gradlePluginPortal()
} }
} }
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
dependencyResolutionManagement { dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)