18
const { execFile: execFileCb } = require('child_process');
19
const { promisify } = require('util');
20
const { resolve: resolvePath } = require('path');
22
const execFile = promisify(execFileCb);
24
async function hasNewChangesets(baseRef, headRef) {
26
throw new Error('baseRef is required');
29
throw new Error('headRef is required');
32
const { stdout } = await execFile('git', [
39
':(exclude).changeset/create-app-*.md',
41
return stdout.includes('(new)');
44
function getReleaseOfMonth(year, month) {
45
const base = new Date(Date.UTC(year, month));
46
const wednesdayOffset =
47
base.getUTCDay() > 3 ? 10 - base.getUTCDay() : 3 - base.getUTCDay();
48
const thirdWednesdayOffset = wednesdayOffset + 7 * 2;
49
const releaseOffset = thirdWednesdayOffset - 1;
50
const releaseDay = new Date(
51
Date.UTC(base.getUTCFullYear(), base.getUTCMonth(), releaseOffset + 1),
56
function getReleaseSchedule() {
57
const firstReleaseYear = 2022;
58
const firstReleaseMonth = 2;
63
const date = getReleaseOfMonth(firstReleaseYear, firstReleaseMonth + i);
64
return { version: `1.${i}.0`, date };
68
function getCurrentRelease() {
69
const { version: releaseVersion } = require(resolvePath('package.json'));
71
const match = releaseVersion.match(/^(\d+\.\d+\.\d+)/);
73
throw new Error(`Failed to parse release version, '${releaseVersion}'`);
75
const [versionStr] = match;
76
if (versionStr === releaseVersion) {
77
return releaseVersion;
79
const [major, minor] = versionStr.split('.').map(Number);
80
return `${major}.${minor - 1}.0`;
83
function findNextRelease(currentRelease, releaseSchedule) {
84
const currentIndex = releaseSchedule.findIndex(
85
r => r.version === currentRelease,
87
if (currentIndex === -1) {
89
`Failed to find current release '${currentRelease}' in release schedule`,
93
return releaseSchedule[currentIndex + 1];
96
async function main() {
97
const [diffBaseRefRef = 'origin/master', diffHeadRef = 'HEAD'] =
98
process.argv.slice(2);
99
const needsMessage = await hasNewChangesets(diffBaseRefRef, diffHeadRef);
104
const currentRelease = getCurrentRelease();
105
const releaseSchedule = getReleaseSchedule();
106
const nextRelease = findNextRelease(currentRelease, releaseSchedule);
108
const scheduledDate = nextRelease.date
110
.replace(/\s*\d+:\d+:\d+.*/, '');
111
process.stdout.write(
113
'Thank you for contributing to Backstage! The changes in this pull request will be part',
114
`of the \`${nextRelease.version}\` release, scheduled for ${scheduledDate}.`,
119
main().catch(error => {
120
console.error(error.stack);