Files

34 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

2026-08-22 03:12:58 -05:00
import { readFile, writeFile } from 'node:fs/promises'
import { resolve } from 'node:path'
const sourceUrl = 'https://www.php.net/releases/index.php?json&version=8&max=30'
const baselinePath = resolve('runtime/upstream-baseline.json')
const reportArgument = process.argv.indexOf('--report')
const reportPath = reportArgument >= 0 ? process.argv[reportArgument + 1] : undefined
function latestByBranch(releases) {
const result = {}
for (const version of Object.keys(releases)) {
if (!/^8\.[2-5]\.\d+$/.test(version)) continue
const branch = version.split('.').slice(0, 2).join('.')
if (!result[branch] || Number(version.split('.')[2]) > Number(result[branch].split('.')[2])) result[branch] = version
}
return result
}
const baseline = JSON.parse(await readFile(baselinePath, 'utf8'))
const response = await fetch(sourceUrl, { headers: { 'user-agent': 'Aurora-Dockside-Runtime-Watcher/1.0' } })
if (!response.ok) throw new Error(`PHP release feed returned HTTP ${response.status}.`)
const releases = await response.json()
const latest = latestByBranch(releases)
const updates = Object.entries(latest)
.filter(([branch, version]) => baseline.php[branch] !== version)
.map(([branch, version]) => ({ branch, packaged: baseline.php[branch] || 'not tracked', upstream: version, security: releases[version]?.tags?.includes('security') === true }))
const lines = updates.length
? ['# PHP runtime releases need packaging', '', 'The official PHP release feed contains versions newer than Auroras tracked packaging baseline.', '', '| Branch | Aurora baseline | Upstream | Security release |', '| --- | --- | --- | --- |', ...updates.map((update) => `| ${update.branch} | ${update.packaged} | ${update.upstream} | ${update.security ? 'Yes' : 'No'} |`), '', `Source: ${sourceUrl}`, '', 'After packages pass platform tests, update `runtime/upstream-baseline.json` and the signed runtime catalog.']
: ['# PHP runtime release check', '', 'No untracked PHP releases were found.']
if (reportPath) await writeFile(reportPath, `${lines.join('\n')}\n`, 'utf8')
process.stdout.write(`${JSON.stringify({ updates, latest })}\n`)