diff --git a/src/pages/applications/ReleaseManagementPage.tsx b/src/pages/applications/ReleaseManagementPage.tsx index fee6902..53ca628 100644 --- a/src/pages/applications/ReleaseManagementPage.tsx +++ b/src/pages/applications/ReleaseManagementPage.tsx @@ -114,6 +114,27 @@ function newestBuildVersion(builds: BuildJob[]) { .find((value): value is string => Boolean(value)) ?? ''; } +function incrementPatchVersion(value: string) { + const match = value.trim().match(/^(v?)(\d+)\.(\d+)\.(\d+)(.*)$/); + if (!match) return value; + const [, prefix, major, minor, patch, suffix] = match; + return `${prefix}${major}.${minor}.${Number(patch) + 1}${suffix}`; +} + +function newestReleaseVersion(releases: AppRelease[], appId: string) { + return releases + .filter((release) => release.app.id === appId && release.version) + .sort((a, b) => releaseTime(b) - releaseTime(a)) + .map((release) => release.version) + .find((value): value is string => Boolean(value)) ?? ''; +} + +function nextReleaseVersion(releases: AppRelease[], appId: string, builds: BuildJob[]) { + const latestReleaseVersion = newestReleaseVersion(releases, appId); + if (latestReleaseVersion) return incrementPatchVersion(latestReleaseVersion); + return newestBuildVersion(builds); +} + function buildCount(release: AppRelease) { const imageTags = release.imageTags as ImageTags | null | undefined; const count = Object.keys(imageTags?.images ?? {}).length + Object.keys(imageTags?.artifacts ?? {}).length; @@ -266,7 +287,7 @@ export function ReleaseManagementPage() { const appBuilds = candidateBuilds.filter((build) => build.component.app.id === nextAppId); const latestBuilds = latestCandidateBuilds(appBuilds); setSelectedBuildIds(latestBuildIdsByComponent(latestBuilds)); - setVersion((prev) => prev || newestBuildVersion(appBuilds)); + setVersion(nextReleaseVersion(releases, nextAppId, appBuilds)); setReleaseModalOpen(true); }; @@ -462,7 +483,7 @@ export function ReleaseManagementPage() { selectApp(event.target.value); const appBuilds = candidateBuilds.filter((build) => build.component.app.id === event.target.value); setSelectedBuildIds(latestBuildIdsByComponent(appBuilds)); - setVersion(newestBuildVersion(appBuilds)); + setVersion(nextReleaseVersion(releases, event.target.value, appBuilds)); }}> {candidateGroups.map((group) => )}