Files
MapLibreParticleLab/platform/macos/scripts/release-notes.js
mwilsnd 20d9e1028c Platform flattening overhaul (#1393)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bart Louwers <bart@emeel.net>
2023-07-26 17:50:34 +02:00

104 lines
3.3 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
const fs = require('fs');
const execSync = require('child_process').execSync;
const ejs = require('ejs');
const _ = require('lodash');
const semver = require('semver');
const changelogPath = 'platform/macos/CHANGELOG.md';
const changelog = fs.readFileSync(changelogPath, 'utf8');
let outputMode = {};
switch(process.argv[2]) {
case "jazzy":
outputMode.isJazzy = true; break;
case "github":
default:
outputMode.isGitHub = true;
}
/*
Find current and immediately previous releases by parsing git tags.
*/
let currentVersion = execSync('git describe --tags --match=macos-v*.*.* --abbrev=0')
.toString()
.trim()
.replace('macos-v', '');
let gitTags = execSync('git tag --list macos-v*.*.*')
.toString()
.split('\n')
.map(function (tag) {
tag = tag.replace('macos-v', '').trim();
return semver.clean(tag);
});
let previousVersion = semver.maxSatisfying(gitTags, "<" + currentVersion);
/*
Parse the raw changelog text and split it into individual releases.
This regular expression:
- Matches lines starting with "## x.x.x".
- Groups the version number.
- Skips the (optional) release date.
- Groups the changelog content.
- Ends when another "## x.x.x" is found.
*/
const regex = /^## (\d+\.\d+\.\d+).*?\n(.+?)(?=\n^## \d+\.\d+\.\d+.*?\n)/gms;
let releaseNotes = [];
while (match = regex.exec(changelog)) {
releaseNotes.push({
'version': match[1],
'changelog': match[2].trim(),
});
}
/*
Match the current tag with the most appropriate release notes.
*/
const versionsInReleaseNotes = _.map(releaseNotes, 'version');
const bestReleaseNotesForCurrentVersion = semver.minSatisfying(versionsInReleaseNotes, ">=" + currentVersion);
const currentReleaseNotes = _.find(releaseNotes, { version: bestReleaseNotesForCurrentVersion });
if (!currentReleaseNotes) {
console.error('Could not find a release section satisfying %s in %s — did you forget to rename the "main" section to %s?', currentVersion, changelogPath, currentVersion.split("-")[0]);
process.exit(1);
}
/*
Fill and print the release notes template.
*/
let templatedReleaseNotes;
if (outputMode.isGitHub) {
templatedReleaseNotes = ejs.render(fs.readFileSync('platform/macos/scripts/release-notes-github.md.ejs', 'utf8'), {
'CURRENTVERSION': currentVersion,
'PREVIOUSVERSION': previousVersion,
'CHANGELOG': currentReleaseNotes.changelog,
'isPrerelease': semver.prerelease(currentVersion)
});
}
if (outputMode.isJazzy) {
const minorReleaseSeries = semver.major(currentVersion) + "." + semver.minor(currentVersion) + ".0";
const range = ">=" + minorReleaseSeries + " <" + currentVersion;
const otherReleasesInSeries = _.filter(releaseNotes, function(release) {
return semver.satisfies(release.version, range);
});
otherReleasesInSeries.forEach(function(release) {
// Bump section headings from h3 to h4.
release.changelog = release.changelog.replace(/^### /gm, '#### ');
});
templatedReleaseNotes = ejs.render(fs.readFileSync('platform/macos/scripts/release-notes-jazzy.md.ejs', 'utf8'), {
'CURRENTVERSION': currentVersion,
'CURRENTCHANGELOG': currentReleaseNotes.changelog,
'OTHERRELEASES': otherReleasesInSeries
});
}
process.stdout.write(templatedReleaseNotes);