mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-22 18:38:12 +00:00
android: derive release notes from changelog
This commit is contained in:
@@ -15,12 +15,17 @@ export function installAndroidFixtureCleanup(): void {
|
||||
export function writeAndroidFixture(params: {
|
||||
version: string;
|
||||
versionCode: number;
|
||||
changelog?: string;
|
||||
releaseNotes?: string;
|
||||
packageVersion?: string;
|
||||
versionProperties?: string;
|
||||
prefix?: string;
|
||||
}): string {
|
||||
const rootDir = makeTempDir(tempDirs, params.prefix ?? "openclaw-android-version-");
|
||||
fs.mkdirSync(path.join(rootDir, "apps", "android", "Config"), { recursive: true });
|
||||
fs.mkdirSync(path.join(rootDir, "apps", "android", "fastlane", "metadata", "android", "en-US"), {
|
||||
recursive: true,
|
||||
});
|
||||
fs.writeFileSync(
|
||||
path.join(rootDir, "package.json"),
|
||||
`${JSON.stringify({ version: params.packageVersion ?? "2026.6.2" }, null, 2)}\n`,
|
||||
@@ -31,10 +36,31 @@ export function writeAndroidFixture(params: {
|
||||
`${JSON.stringify({ version: params.version, versionCode: params.versionCode }, null, 2)}\n`,
|
||||
"utf8",
|
||||
);
|
||||
const releaseNotes =
|
||||
"OpenClaw is now available on Android.\n\nConnect to your OpenClaw Gateway.\n";
|
||||
fs.writeFileSync(
|
||||
path.join(rootDir, "apps", "android", "CHANGELOG.md"),
|
||||
params.changelog ?? `# OpenClaw Android Changelog\n\n## Unreleased\n\n${releaseNotes}`,
|
||||
"utf8",
|
||||
);
|
||||
fs.writeFileSync(
|
||||
path.join(rootDir, "apps", "android", "Config", "Version.properties"),
|
||||
params.versionProperties ?? "",
|
||||
"utf8",
|
||||
);
|
||||
fs.writeFileSync(
|
||||
path.join(
|
||||
rootDir,
|
||||
"apps",
|
||||
"android",
|
||||
"fastlane",
|
||||
"metadata",
|
||||
"android",
|
||||
"en-US",
|
||||
"release_notes.txt",
|
||||
),
|
||||
params.releaseNotes ?? releaseNotes,
|
||||
"utf8",
|
||||
);
|
||||
return rootDir;
|
||||
}
|
||||
|
||||
@@ -3,11 +3,14 @@ import path from "node:path";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
canonicalAndroidVersionCode,
|
||||
extractChangelogSection,
|
||||
normalizeGatewayVersionToPinnedAndroidVersion,
|
||||
normalizePinnedAndroidVersion,
|
||||
renderAndroidReleaseNotes,
|
||||
renderAndroidVersionProperties,
|
||||
resolveAndroidVersion,
|
||||
resolveGatewayVersionForAndroidRelease,
|
||||
syncAndroidVersioning,
|
||||
} from "../../scripts/lib/android-version.ts";
|
||||
import {
|
||||
installAndroidFixtureCleanup,
|
||||
@@ -25,6 +28,11 @@ describe("resolveAndroidVersion", () => {
|
||||
|
||||
expect(resolveAndroidVersion(rootDir)).toEqual({
|
||||
canonicalVersion: "2026.6.2",
|
||||
changelogPath: path.join(rootDir, "apps/android/CHANGELOG.md"),
|
||||
releaseNotesPath: path.join(
|
||||
rootDir,
|
||||
"apps/android/fastlane/metadata/android/en-US/release_notes.txt",
|
||||
),
|
||||
versionCode: 2026060201,
|
||||
versionFilePath: path.join(rootDir, "apps/android/version.json"),
|
||||
versionPropertiesPath: path.join(rootDir, "apps/android/Config/Version.properties"),
|
||||
@@ -134,3 +142,84 @@ describe("renderAndroidVersionProperties", () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("renderAndroidReleaseNotes", () => {
|
||||
it("extracts exact pinned-version notes before Unreleased notes", () => {
|
||||
const rootDir = writeAndroidFixture({
|
||||
version: "2026.6.2",
|
||||
versionCode: 2026060201,
|
||||
changelog: [
|
||||
"# OpenClaw Android Changelog",
|
||||
"",
|
||||
"## Unreleased",
|
||||
"",
|
||||
"Future Android changes.",
|
||||
"",
|
||||
"## 2026.6.2 - 2026-06-02",
|
||||
"",
|
||||
"Pinned Android release notes.",
|
||||
"",
|
||||
].join("\n"),
|
||||
});
|
||||
const version = resolveAndroidVersion(rootDir);
|
||||
|
||||
expect(
|
||||
renderAndroidReleaseNotes(
|
||||
version,
|
||||
"# OpenClaw Android Changelog\n\n## Unreleased\n\nFuture Android changes.\n\n## 2026.6.2 - 2026-06-02\n\nPinned Android release notes.\n",
|
||||
),
|
||||
).toBe("Pinned Android release notes.\n");
|
||||
});
|
||||
|
||||
it("falls back to Unreleased notes while iterating on a release train", () => {
|
||||
const rootDir = writeAndroidFixture({
|
||||
version: "2026.6.2",
|
||||
versionCode: 2026060201,
|
||||
});
|
||||
const version = resolveAndroidVersion(rootDir);
|
||||
|
||||
expect(
|
||||
renderAndroidReleaseNotes(
|
||||
version,
|
||||
"# OpenClaw Android Changelog\n\n## Unreleased\n\nPending Android notes.\n",
|
||||
),
|
||||
).toBe("Pending Android notes.\n");
|
||||
});
|
||||
|
||||
it("rejects changelogs without exact-version or Unreleased notes", () => {
|
||||
const rootDir = writeAndroidFixture({
|
||||
version: "2026.6.2",
|
||||
versionCode: 2026060201,
|
||||
});
|
||||
const version = resolveAndroidVersion(rootDir);
|
||||
|
||||
expect(() =>
|
||||
renderAndroidReleaseNotes(
|
||||
version,
|
||||
"# OpenClaw Android Changelog\n\n## 2026.6.1\n\nOld notes.\n",
|
||||
),
|
||||
).toThrow("Unable to find Android changelog notes for 2026.6.2");
|
||||
});
|
||||
|
||||
it("treats empty changelog sections as absent", () => {
|
||||
expect(
|
||||
extractChangelogSection("## Unreleased\n\n\n## 2026.6.2\n\nNotes.\n", "Unreleased"),
|
||||
).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("syncAndroidVersioning", () => {
|
||||
it("syncs generated Gradle version properties and Fastlane release notes", () => {
|
||||
const rootDir = writeAndroidFixture({
|
||||
version: "2026.6.2",
|
||||
versionCode: 2026060201,
|
||||
releaseNotes: "stale notes\n",
|
||||
versionProperties: "stale version\n",
|
||||
});
|
||||
|
||||
expect(syncAndroidVersioning({ mode: "write", rootDir }).updatedPaths).toEqual([
|
||||
path.join(rootDir, "apps/android/Config/Version.properties"),
|
||||
path.join(rootDir, "apps/android/fastlane/metadata/android/en-US/release_notes.txt"),
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1172,7 +1172,9 @@ describe("scripts/changed-lanes", () => {
|
||||
it("keeps release metadata commits off the full changed gate", () => {
|
||||
const result = detectChangedLanes([
|
||||
"CHANGELOG.md",
|
||||
"apps/android/CHANGELOG.md",
|
||||
"apps/android/Config/Version.properties",
|
||||
"apps/android/fastlane/metadata/android/en-US/release_notes.txt",
|
||||
"apps/android/version.json",
|
||||
"apps/ios/CHANGELOG.md",
|
||||
"apps/ios/Config/Version.xcconfig",
|
||||
|
||||
Reference in New Issue
Block a user