2 Commits
Author SHA1 Message Date
adrianoftyrielandPaperclip 4d7cd6182f Rename the installed Android package to ca.wallacenet.prolibertategames
Build and Release APK / Build APK and publish release (push) Failing after 7s
Follows the Gitea repo rename: the applicationId (and its .dev variant)
now matches the repo, the launcher name and the docs, instead of carrying
the abandoned Pilgrims of Katan identity.

The JVM namespace stays org.prolibertate.games, so no source file moves;
only the installed identity changes.

Co-Authored-By: Paperclip <[email protected]>
2026-10-14 14:47:13 +00:00
adrianoftyrielandPaperclip b58b4251dc Rename the Gitea repo references to ProLibertateGames
Build and Release APK / Build APK and publish release (push) Canceled after 0s
The repo was renamed from PilgrimsOfKatan to ProLibertateGames on the
Gitea instance. Update every reference so nothing points at the old name:

- OTA updater: the repo constant and the User-Agent
- publish-release.sh: the default repo, the asset name, the release title
- CI/release workflows: the artifact names and the staged APK name
- settings.gradle.kts: the Gradle project name
- Protocol.kt / LanTransport.kt: the mDNS service label and the Wi-Fi lock tag
- docs (README, CLAUDE.md, docs/CI.md) and the update-policy test fixtures

The installed applicationId is left unchanged in this commit.

Co-Authored-By: Paperclip <[email protected]>
2026-10-14 14:21:43 +00:00
13 changed files with 37 additions and 37 deletions
+3 -3
View File
@@ -69,7 +69,7 @@ jobs:
- name: Upload debug APK - name: Upload debug APK
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: PilgrimsOfKatan-debug-apk name: ProLibertateGames-debug-apk
path: app/build/outputs/apk/debug/app-debug.apk path: app/build/outputs/apk/debug/app-debug.apk
if-no-files-found: error if-no-files-found: error
retention-days: 14 retention-days: 14
@@ -79,7 +79,7 @@ jobs:
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: PilgrimsOfKatan-reports name: ProLibertateGames-reports
path: | path: |
app/build/reports/ app/build/reports/
if-no-files-found: ignore if-no-files-found: ignore
@@ -109,7 +109,7 @@ jobs:
stamp="$(( ${{ github.run_number }} + offset ))" stamp="$(( ${{ github.run_number }} + offset ))"
version="v${series}.${stamp}-dev" version="v${series}.${stamp}-dev"
src="app/build/outputs/apk/debug/app-debug.apk" src="app/build/outputs/apk/debug/app-debug.apk"
dest="PilgrimsOfKatan-${version}.apk" dest="ProLibertateGames-${version}.apk"
cp "$src" "$dest" cp "$src" "$dest"
echo "version=$version" >> "$GITHUB_OUTPUT" echo "version=$version" >> "$GITHUB_OUTPUT"
echo "apk=$dest" >> "$GITHUB_OUTPUT" echo "apk=$dest" >> "$GITHUB_OUTPUT"
+2 -2
View File
@@ -64,7 +64,7 @@ jobs:
stamp="$(( ${{ github.run_number }} + offset ))" stamp="$(( ${{ github.run_number }} + offset ))"
version="v${series}.${stamp}" version="v${series}.${stamp}"
src="app/build/outputs/apk/debug/app-debug.apk" src="app/build/outputs/apk/debug/app-debug.apk"
dest="PilgrimsOfKatan-${version}.apk" dest="ProLibertateGames-${version}.apk"
cp "$src" "$dest" cp "$src" "$dest"
echo "version=$version" >> "$GITHUB_OUTPUT" echo "version=$version" >> "$GITHUB_OUTPUT"
echo "apk=$dest" >> "$GITHUB_OUTPUT" echo "apk=$dest" >> "$GITHUB_OUTPUT"
@@ -72,7 +72,7 @@ jobs:
- name: Upload APK as workflow artifact - name: Upload APK as workflow artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: PilgrimsOfKatan-apk name: ProLibertateGames-apk
path: ${{ steps.stage.outputs.apk }} path: ${{ steps.stage.outputs.apk }}
if-no-files-found: error if-no-files-found: error
+3 -3
View File
@@ -4,7 +4,7 @@ ProLibertateGames — Wallacenet's build of an Android collection of card and
board games, playable against AI or over Wi-Fi (LAN). Upstream: board games, playable against AI or over Wi-Fi (LAN). Upstream:
[adrianoftyriel/ProLibertateGames](https://github.com/adrianoftyriel/ProLibertateGames) [adrianoftyriel/ProLibertateGames](https://github.com/adrianoftyriel/ProLibertateGames)
(GPL-3.0, kept as the `upstream` remote). Canonical repo: (GPL-3.0, kept as the `upstream` remote). Canonical repo:
<https://git.wallacenet.ca/devadmin/PilgrimsOfKatan>. <https://git.wallacenet.ca/devadmin/ProLibertateGames>.
## Ground rules ## Ground rules
@@ -15,7 +15,7 @@ board games, playable against AI or over Wi-Fi (LAN). Upstream:
branding is the upstream's, restored (see README → Branding): tartan launcher branding is the upstream's, restored (see README → Branding): tartan launcher
icon and splash, Wallace clan red on production and hunting green on dev, icon and splash, Wallace clan red on production and hunting green on dev,
launcher names *Pro Libertate Games* / *Pro Libertate Games DEV*. The launcher names *Pro Libertate Games* / *Pro Libertate Games DEV*. The
installed identity is `ca.wallacenet.pilgrimsofkatan` (+ `.dev`). installed identity is `ca.wallacenet.prolibertategames` (+ `.dev`).
- **The existing catalogue is the regression safety net.** Keep every game - **The existing catalogue is the regression safety net.** Keep every game
green; new games (Katan) arrive as separate tasks, not edits to old ones. green; new games (Katan) arrive as separate tasks, not edits to old ones.
The 22 reference games are `available = true`; Katan is listed with The 22 reference games are `available = true`; Katan is listed with
@@ -46,7 +46,7 @@ One flag — `isDevBuild` in `app/build.gradle.kts` — drives applicationId,
launcher name and brand colour together. Never set them individually. launcher name and brand colour together. Never set them individually.
In-app OTA points at this repo's own Gitea releases In-app OTA points at this repo's own Gitea releases
(`/api/v1/repos/devadmin/PilgrimsOfKatan/releases…`) and is **on**: (`/api/v1/repos/devadmin/ProLibertateGames/releases…`) and is **on**:
`BuildConfig.OTA_ENABLED` is `true`. The channel is a decision already made and `BuildConfig.OTA_ENABLED` is `true`. The channel is a decision already made and
recorded — `docs/CI.md` documents the endpoints, the build-number scheme, and recorded — `docs/CI.md` documents the endpoints, the build-number scheme, and
what publishing requires. Setting the flag to `false` is the kill switch. what publishing requires. Setting the flag to `false` is the kill switch.
+5 -5
View File
@@ -5,7 +5,7 @@ or against other people over Wi-Fi (LAN).
Wallacenet's build of [ProLibertateGames](https://github.com/adrianoftyriel/ProLibertateGames) Wallacenet's build of [ProLibertateGames](https://github.com/adrianoftyriel/ProLibertateGames)
by adrianoftyriel (GNU GPL v3 — see [LICENSE](LICENSE)), hosted at by adrianoftyriel (GNU GPL v3 — see [LICENSE](LICENSE)), hosted at
<https://git.wallacenet.ca/devadmin/PilgrimsOfKatan>. Game rules documentation <https://git.wallacenet.ca/devadmin/ProLibertateGames>. Game rules documentation
lives under [docs/](docs/README.md); build, CI and release decisions live in lives under [docs/](docs/README.md); build, CI and release decisions live in
[docs/CI.md](docs/CI.md). Katan itself arrives in later work — it is listed under [docs/CI.md](docs/CI.md). Katan itself arrives in later work — it is listed under
Board Games as *Coming soon* — and this app ships the reference catalogue Board Games as *Coming soon* — and this app ships the reference catalogue
@@ -190,10 +190,10 @@ smaller than a fingertip.
Requires JDK 17 and the Android SDK (compileSdk 34). Requires JDK 17 and the Android SDK (compileSdk 34).
A local build is a dev build: it installs as A local build is a dev build: it installs as
`ca.wallacenet.pilgrimsofkatan.dev` under the name *Pro Libertate Games DEV* on `ca.wallacenet.prolibertategames.dev` under the name *Pro Libertate Games DEV* on
the hunting-green sett, so it goes on beside a production copy rather than over the hunting-green sett, so it goes on beside a production copy rather than over
it. Set `PLG_CHANNEL=production` to build the production package it. Set `PLG_CHANNEL=production` to build the production package
(`ca.wallacenet.pilgrimsofkatan`, clan red). (`ca.wallacenet.prolibertategames`, clan red).
## CI ## CI
@@ -265,7 +265,7 @@ unit-tested on the JVM like the rules engines are.
### Both channels on one device ### Both channels on one device
A dev build installs under its own `applicationId`, A dev build installs under its own `applicationId`,
`ca.wallacenet.pilgrimsofkatan.dev`, so it is a separate app as far as Android `ca.wallacenet.prolibertategames.dev`, so it is a separate app as far as Android
is concerned and can sit beside the production copy rather than replacing it. Each channel still updates itself is concerned and can sit beside the production copy rather than replacing it. Each channel still updates itself
normally, because an update within a channel keeps the same package. normally, because an update within a channel keeps the same package.
@@ -273,7 +273,7 @@ Three things move together, all off `isDevBuild` in `app/build.gradle.kts`:
| | Production | Dev | | | Production | Dev |
| --- | --- | --- | | --- | --- | --- |
| `applicationId` | `ca.wallacenet.pilgrimsofkatan` | `ca.wallacenet.pilgrimsofkatan.dev` | | `applicationId` | `ca.wallacenet.prolibertategames` | `ca.wallacenet.prolibertategames.dev` |
| Launcher name | Pro Libertate Games | Pro Libertate Games DEV | | Launcher name | Pro Libertate Games | Pro Libertate Games DEV |
| Tartan sett | clan red | hunting green | | Tartan sett | clan red | hunting green |
+1 -1
View File
@@ -58,7 +58,7 @@ android {
// A dev build installs under its own package, so a dev copy and a // A dev build installs under its own package, so a dev copy and a
// production copy can sit side by side on one device instead of one // production copy can sit side by side on one device instead of one
// replacing the other. // replacing the other.
applicationId = if (isDevBuild) "ca.wallacenet.pilgrimsofkatan.dev" else "ca.wallacenet.pilgrimsofkatan" applicationId = if (isDevBuild) "ca.wallacenet.prolibertategames.dev" else "ca.wallacenet.prolibertategames"
minSdk = 24 minSdk = 24
targetSdk = 34 targetSdk = 34
// The -dev suffix in versionName is what the installed app reads to // The -dev suffix in versionName is what the installed app reads to
@@ -308,6 +308,6 @@ class LanTransport(private val context: Context) : Transport {
} }
const val CONNECT_TIMEOUT_MS = 8_000 const val CONNECT_TIMEOUT_MS = 8_000
const val WIFI_LOCK_TAG = "PilgrimsOfKatan:lan" const val WIFI_LOCK_TAG = "ProLibertateGames:lan"
} }
} }
@@ -33,7 +33,7 @@ const val PURPOSE_SCOREKEEPER = "scorekeeper"
/** Service type and name advertised over mDNS. */ /** Service type and name advertised over mDNS. */
const val SERVICE_TYPE = "_plgames._tcp" const val SERVICE_TYPE = "_plgames._tcp"
const val SERVICE_NAME = "PilgrimsOfKatan" const val SERVICE_NAME = "ProLibertateGames"
val protocolJson: Json = Json { val protocolJson: Json = Json {
ignoreUnknownKeys = true ignoreUnknownKeys = true
@@ -12,7 +12,7 @@ import java.net.URI
* meaning to be had from comparing across them, so nothing does. * meaning to be had from comparing across them, so nothing does.
* *
* They also carry different applicationIds — a dev build installs as * They also carry different applicationIds — a dev build installs as
* `…pilgrimsofkatan.dev` — so both can sit on one device, each updating * `…prolibertategames.dev` — so both can sit on one device, each updating
* itself down its own line and leaving the other alone. * itself down its own line and leaving the other alone.
*/ */
enum class UpdateChannel(val label: String, val blurb: String) { enum class UpdateChannel(val label: String, val blurb: String) {
@@ -126,7 +126,7 @@ class Updater(private val activity: Activity) {
(URL(url).openConnection() as HttpURLConnection).apply { (URL(url).openConnection() as HttpURLConnection).apply {
requestMethod = "GET" requestMethod = "GET"
setRequestProperty("Accept", "application/json") setRequestProperty("Accept", "application/json")
setRequestProperty("User-Agent", "PilgrimsOfKatan-Updater") setRequestProperty("User-Agent", "ProLibertateGames-Updater")
connectTimeout = 15_000 connectTimeout = 15_000
readTimeout = 15_000 readTimeout = 15_000
} }
@@ -206,7 +206,7 @@ class Updater(private val activity: Activity) {
const val SERVER = "https://git.wallacenet.ca" const val SERVER = "https://git.wallacenet.ca"
const val SERVER_HOST = "git.wallacenet.ca" const val SERVER_HOST = "git.wallacenet.ca"
const val OWNER = "devadmin" const val OWNER = "devadmin"
const val REPO = "PilgrimsOfKatan" const val REPO = "ProLibertateGames"
/** Release routes, Gitea's `/api/v1` spelling of GitHub's API. */ /** Release routes, Gitea's `/api/v1` spelling of GitHub's API. */
const val API = "$SERVER/api/v1/repos/$OWNER/$REPO" const val API = "$SERVER/api/v1/repos/$OWNER/$REPO"
@@ -22,7 +22,7 @@ class UpdatePolicyTest {
tag = tag, tag = tag,
versionCode = versionCode, versionCode = versionCode,
apkUrl = "https://example.invalid/$tag.apk", apkUrl = "https://example.invalid/$tag.apk",
apkName = "PilgrimsOfKatan-$tag.apk", apkName = "ProLibertateGames-$tag.apk",
channel = channel, channel = channel,
) )
@@ -60,16 +60,16 @@ class UpdatePolicyTest {
// The instance reports its canonical host; the app was told to trust // The instance reports its canonical host; the app was told to trust
// another. Same bytes, one host, whatever the server names itself. // another. Same bytes, one host, whatever the server names itself.
assertEquals( assertEquals(
"https://git.wallacenet.ca/devadmin/PilgrimsOfKatan/releases/download/" + "https://git.wallacenet.ca/devadmin/ProLibertateGames/releases/download/" +
"v1.4.1001-dev/PilgrimsOfKatan-v1.4.1001-dev.apk", "v1.4.1001-dev/ProLibertateGames-v1.4.1001-dev.apk",
onReportedHost( onReportedHost(
"https://git.saskvalleytech.com/devadmin/PilgrimsOfKatan/releases/download/" + "https://git.saskvalleytech.com/devadmin/ProLibertateGames/releases/download/" +
"v1.4.1001-dev/PilgrimsOfKatan-v1.4.1001-dev.apk", "v1.4.1001-dev/ProLibertateGames-v1.4.1001-dev.apk",
"git.wallacenet.ca", "git.wallacenet.ca",
), ),
) )
// A URL that already says the right host is left exactly as it is. // A URL that already says the right host is left exactly as it is.
val already = "https://git.wallacenet.ca/devadmin/PilgrimsOfKatan/releases/download/v1.4.1/a.apk" val already = "https://git.wallacenet.ca/devadmin/ProLibertateGames/releases/download/v1.4.1/a.apk"
assertEquals(already, onReportedHost(already, "git.wallacenet.ca")) assertEquals(already, onReportedHost(already, "git.wallacenet.ca"))
// Anything unparseable survives untouched rather than being dropped. // Anything unparseable survives untouched rather than being dropped.
assertEquals("not a url", onReportedHost("not a url", "git.wallacenet.ca")) assertEquals("not a url", onReportedHost("not a url", "git.wallacenet.ca"))
+7 -7
View File
@@ -1,11 +1,11 @@
# CI, releases, and OTA — decisions and how to build # CI, releases, and OTA — decisions and how to build
Status as of the Pilgrims of Katan bootstrap (WALA-118). Status as of the ProLibertateGames bootstrap (WALA-118).
## Decisions ## Decisions
1. **The release channel is this instance's own releases.** The app ships from 1. **The release channel is this instance's own releases.** The app ships from
<https://git.wallacenet.ca/devadmin/PilgrimsOfKatan>, and the in-app updater <https://git.wallacenet.ca/devadmin/ProLibertateGames>, and the in-app updater
reads that repo's releases over Gitea's REST API. GitHub is not a channel for reads that repo's releases over Gitea's REST API. GitHub is not a channel for
this project; the only GitHub URLs left are the `upstream` remote and the this project; the only GitHub URLs left are the `upstream` remote and the
attribution link in the README. attribution link in the README.
@@ -80,8 +80,8 @@ release — the honest answer for a build nobody stamped.
export JAVA_HOME=... # a JDK 17 install export JAVA_HOME=... # a JDK 17 install
export ANDROID_HOME=... # SDK root (or set sdk.dir in local.properties) export ANDROID_HOME=... # SDK root (or set sdk.dir in local.properties)
./gradlew assembleDebug # dev-channel app (default: ca.wallacenet.pilgrimsofkatan.dev) ./gradlew assembleDebug # dev-channel app (default: ca.wallacenet.prolibertategames.dev)
PLG_CHANNEL=production ./gradlew assembleDebug # production app (ca.wallacenet.pilgrimsofkatan) PLG_CHANNEL=production ./gradlew assembleDebug # production app (ca.wallacenet.prolibertategames)
./gradlew testDebugUnitTest # JVM unit tests ./gradlew testDebugUnitTest # JVM unit tests
./gradlew lintDebug # Android lint (CI runs this too) ./gradlew lintDebug # Android lint (CI runs this too)
``` ```
@@ -113,8 +113,8 @@ so a retry is safe.
| Channel | Endpoint | | Channel | Endpoint |
| --- | --- | | --- | --- |
| production | `GET /api/v1/repos/devadmin/PilgrimsOfKatan/releases/latest` | | production | `GET /api/v1/repos/devadmin/ProLibertateGames/releases/latest` |
| dev | `GET /api/v1/repos/devadmin/PilgrimsOfKatan/releases?limit=30` | | dev | `GET /api/v1/repos/devadmin/ProLibertateGames/releases?limit=30` |
- `/releases/latest` is documented by Gitea as *the most recent non-prerelease, - `/releases/latest` is documented by Gitea as *the most recent non-prerelease,
non-draft release* — the same rule GitHub implements, so the production non-draft release* — the same rule GitHub implements, so the production
@@ -126,7 +126,7 @@ so a retry is safe.
`prerelease`, `draft`, and assets carrying `browser_download_url`. Gitea says `prerelease`, `draft`, and assets carrying `browser_download_url`. Gitea says
`limit` where GitHub says `per_page`. `limit` where GitHub says `per_page`.
- Each asset must be named so it contains its tag — - Each asset must be named so it contains its tag —
`PilgrimsOfKatan-v1.4.1001.apk` for tag `v1.4.1001` — because the updater `ProLibertateGames-v1.4.1001.apk` for tag `v1.4.1001` — because the updater
picks the versioned APK out of the release's assets by that rule. picks the versioned APK out of the release's assets by that rule.
`BuildConfig.OTA_ENABLED` is a kill switch, not a channel decision: it is `BuildConfig.OTA_ENABLED` is a kill switch, not a channel decision: it is
+4 -4
View File
@@ -11,7 +11,7 @@
# Environment: # Environment:
# GITEA_TOKEN required — a token that may create releases on the repo. # GITEA_TOKEN required — a token that may create releases on the repo.
# GITEA_API API base, default https://git.wallacenet.ca/api/v1 # GITEA_API API base, default https://git.wallacenet.ca/api/v1
# GITEA_REPO owner/name, default devadmin/PilgrimsOfKatan # GITEA_REPO owner/name, default devadmin/ProLibertateGames
# #
# The four arguments can also arrive as RELEASE_TAG, RELEASE_APK, # The four arguments can also arrive as RELEASE_TAG, RELEASE_APK,
# RELEASE_KIND and RELEASE_TARGET, which is how the workflows pass them. # RELEASE_KIND and RELEASE_TARGET, which is how the workflows pass them.
@@ -34,7 +34,7 @@ esac
[ -f "$apk" ] || { echo "publish-release: no such APK: ${apk:-<unset>}" >&2; exit 2; } [ -f "$apk" ] || { echo "publish-release: no such APK: ${apk:-<unset>}" >&2; exit 2; }
[ -n "${GITEA_TOKEN:-}" ] || { echo "publish-release: GITEA_TOKEN is not set" >&2; exit 2; } [ -n "${GITEA_TOKEN:-}" ] || { echo "publish-release: GITEA_TOKEN is not set" >&2; exit 2; }
api="${GITEA_API:-${GITHUB_API_URL:-https://git.wallacenet.ca/api/v1}}/repos/${GITEA_REPO:-${GITHUB_REPOSITORY:-devadmin/PilgrimsOfKatan}}" api="${GITEA_API:-${GITHUB_API_URL:-https://git.wallacenet.ca/api/v1}}/repos/${GITEA_REPO:-${GITHUB_REPOSITORY:-devadmin/ProLibertateGames}}"
tmp="$(mktemp -d)" tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT INT TERM trap 'rm -rf "$tmp"' EXIT INT TERM
@@ -43,7 +43,7 @@ trap 'rm -rf "$tmp"' EXIT INT TERM
# updater picks the versioned APK out of a release's assets by finding the one # updater picks the versioned APK out of a release's assets by finding the one
# whose name contains the tag, so an asset called app-debug.apk would only be # whose name contains the tag, so an asset called app-debug.apk would only be
# found by the fallback rule. # found by the fallback rule.
apk_name="PilgrimsOfKatan-${tag}.apk" apk_name="ProLibertateGames-${tag}.apk"
# The tag and the file name are both derived from gradle.properties and a run # The tag and the file name are both derived from gradle.properties and a run
# number, so neither can carry a quote or a backslash into this JSON. # number, so neither can carry a quote or a backslash into this JSON.
@@ -56,7 +56,7 @@ else
fi fi
cat > "$tmp/release.json" <<JSON cat > "$tmp/release.json" <<JSON
{"tag_name":"${tag}","target_commitish":"${target}","name":"Pilgrims of Katan ${tag}","body":"${note}","prerelease":${prerelease},"draft":false} {"tag_name":"${tag}","target_commitish":"${target}","name":"Pro Libertate Games ${tag}","body":"${note}","prerelease":${prerelease},"draft":false}
JSON JSON
code="$(curl -sS -o "$tmp/create.json" -w '%{http_code}' -X POST \ code="$(curl -sS -o "$tmp/create.json" -w '%{http_code}' -X POST \
+1 -1
View File
@@ -14,5 +14,5 @@ dependencyResolutionManagement {
} }
} }
rootProject.name = "PilgrimsOfKatan" rootProject.name = "ProLibertateGames"
include(":app") include(":app")