mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-05-03 22:37:06 +02:00
Add tool to bump version & create PR
This includes a tool to update the various files in the repo that need to change when a version increments. It also includes a workflow to trigger the action manually, passing it a version & a changelog url. It'll update the values, build the app, build the doc, make a commit in a branch, and create a pull request to merge this stuff back into dev.
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
// import { Octokit } from "@octokit/rest";
|
||||
import commandLineArgs from "command-line-args";
|
||||
|
||||
import fs from 'fs/promises';
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import pandoc from 'node-pandoc';
|
||||
|
||||
// https://github.com/75lb/command-line-args
|
||||
const optionDefinitions = [
|
||||
{ name: 'version', alias: 'v', type: String, required: true },
|
||||
{ name: 'versionNumber', alias: 'n', type: Number },
|
||||
{ name: 'versionDescription', alias: 'd', type: String },
|
||||
{ name: 'changelog', alias: 'l', type: String },
|
||||
];
|
||||
|
||||
const cliArgs = commandLineArgs(optionDefinitions);
|
||||
|
||||
const appPaths = {};
|
||||
appPaths.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
appPaths.mainPackage = path.join(appPaths.root, "./package.json");
|
||||
appPaths.electronPackage = path.join(appPaths.root, "./electron/package.json");
|
||||
appPaths.constants = path.join(appPaths.root, "./src/Constants.ts");
|
||||
appPaths.sphinxConf = path.join(appPaths.root, "./doc/source/conf.py");
|
||||
appPaths.sphinxChangelog = path.join(appPaths.root, "./doc/source/changelog.rst");
|
||||
|
||||
async function main(version, versionNumber, changelog) {
|
||||
console.log(`Updating app files to match v${version}`);
|
||||
|
||||
const [ major, minor ]= version.split('.');
|
||||
const shortVersion = `${major}.${minor}`;
|
||||
const modifiedMainPackage = (await fs.readFile(appPaths.mainPackage, 'utf8')).
|
||||
replace(/(^\s*"version":\s)"(.*)",$/m, `$1"${version}",`);
|
||||
await fs.writeFile(appPaths.mainPackage, modifiedMainPackage);
|
||||
console.log(`Modified ${appPaths.mainPackage}`);
|
||||
|
||||
const modifiedElectronPackage = (await fs.readFile(appPaths.electronPackage, 'utf8')).
|
||||
replace(/(^\s*"version":\s)"(.*)",$/m, `$1"${version}",`);
|
||||
await fs.writeFile(appPaths.electronPackage, modifiedElectronPackage);
|
||||
console.log(`Modified ${appPaths.electronPackage}`);
|
||||
|
||||
let modifiedConstants = (await fs.readFile(appPaths.constants, 'utf8')).
|
||||
replace(/(^\s*?VersionString:\s)"(.*)",/m, `$1"${version}",`);
|
||||
modifiedConstants = modifiedConstants.
|
||||
replace(/(^\s*?VersionNumber:\s)(.*),/m, `$1${versionNumber},`);
|
||||
|
||||
if (changelog.trim() !== '') {
|
||||
let htmlChangelog = '';
|
||||
try {
|
||||
htmlChangelog = await transform(changelog, 'html');
|
||||
console.log('Converted markdown changelog to html')
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
const paddedChangelog = htmlChangelog.split('\n').
|
||||
map((line) => (line.trim() !== '' ? ' ' + line : '')).
|
||||
join('\n').replaceAll('`', '\\`');
|
||||
|
||||
modifiedConstants = modifiedConstants.
|
||||
replace(/(^\s*?LatestUpdate:\s`\n)(.*)`,$/ms, `$1${paddedChangelog}\n` + "`,");
|
||||
}
|
||||
await fs.writeFile(appPaths.constants, modifiedConstants);
|
||||
console.log(`Modified ${appPaths.constants}`);
|
||||
|
||||
let modifiedSphinxConfig = (await fs.readFile(appPaths.sphinxConf, 'utf8')).
|
||||
replace(/(^version = ')(.*)'$/m, `$1${shortVersion}'`);
|
||||
modifiedSphinxConfig = modifiedSphinxConfig.
|
||||
replace(/(^release = ')(.*)'$/m, `$1${version}'`);
|
||||
await fs.writeFile(appPaths.sphinxConf, modifiedSphinxConfig);
|
||||
console.log(`Modified ${appPaths.sphinxConf}`);
|
||||
|
||||
if (changelog.trim() !== '') {
|
||||
let modifiedSphinxChangelog = await fs.readFile(appPaths.sphinxChangelog, 'utf8');
|
||||
const lines = modifiedSphinxChangelog.split('\n');
|
||||
let rstChangelog = '';
|
||||
try {
|
||||
rstChangelog = await transform(changelog, 'rst');
|
||||
console.log('Converted markdown changelog to rst')
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
lines.splice(5, 0, rstChangelog);
|
||||
modifiedSphinxChangelog = lines.join('\n');
|
||||
await fs.writeFile(appPaths.sphinxChangelog, modifiedSphinxChangelog);
|
||||
console.log(`Modified ${appPaths.sphinxChangelog}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function transform(markdown, format) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const args = `-f markdown -t ${format}`;
|
||||
pandoc(markdown, args, (error, rst) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve(rst);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function getChangelog() {
|
||||
// Read from stdin
|
||||
// https://stackoverflow.com/a/56012724
|
||||
try {
|
||||
return readFileSync(0, 'utf-8').replace('\r\n', '\n');
|
||||
} catch (error) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
getChangelog().then((changes) => {
|
||||
main(cliArgs.version, cliArgs.versionNumber, changes).then(() => console.log('Done'));
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user