Skip to content

Commit 0f68a41

Browse files
authored
fix(scripts): 2 years sla skips (#3490)
1 parent 6561610 commit 0f68a41

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

config/release.config.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
},
2525
"sla": {
2626
"csharp": {
27+
"6.12.1": {
28+
"releaseDate": "2022-02-14",
29+
"supportStart": "2022-08-31",
30+
"supportEnd": "2024-08-31",
31+
"supportStatus": "maintenance"
32+
},
2733
"6.13.0": {
2834
"releaseDate": "2022-08-31",
2935
"supportStart": "2022-11-08",
@@ -313,7 +319,6 @@
313319
},
314320
"3.31.2": {
315321
"releaseDate": "2024-06-25",
316-
"supportEnd": "2024-06-25",
317322
"supportStatus": "active"
318323
}
319324
},
@@ -540,6 +545,12 @@
540545
}
541546
},
542547
"ruby": {
548+
"2.2.5": {
549+
"releaseDate": "2022-05-24",
550+
"supportStart": "2022-09-26",
551+
"supportEnd": "2024-09-26",
552+
"supportStatus": "maintenance"
553+
},
543554
"2.3.0": {
544555
"releaseDate": "2022-09-26",
545556
"supportEnd": "2022-10-21",

scripts/cli/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { formatter } from '../formatter.js';
1010
import { generate } from '../generate.js';
1111
import { playground } from '../playground.js';
1212
import { createReleasePR } from '../release/createReleasePR.js';
13+
import { generateSLA } from '../release/sla.js';
1314
import { snippetsGenerateMany } from '../snippets/generate.js';
1415
import { buildSpecs } from '../specs';
1516
import type { Language } from '../types.js';
@@ -244,9 +245,16 @@ program
244245
undefined,
245246
)
246247
.option('-d, --dry-run', 'does not push anything to GitHub')
247-
.action(async (langArgs: LangArg[], { verbose, releaseType, dryRun }) => {
248+
.option('-sla, --sla-only', 'only generates the sla policy', false)
249+
.action(async (langArgs: LangArg[], { verbose, releaseType, dryRun, slaOnly }) => {
248250
setVerbose(Boolean(verbose));
249251

252+
if (slaOnly) {
253+
await generateSLA({});
254+
255+
return;
256+
}
257+
250258
if (langArgs.length === 0) {
251259
langArgs = [ALL];
252260
}

scripts/release/__tests__/sla.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,18 @@ describe('generateLanguageSLA', () => {
7171

7272
it('ignores versions older than 2 years', () => {
7373
generateLanguageSLA([
74+
"v1.0.9 Thu Dec 28 15:48:25 2011 +0000",
7475
"v1.1.4 Thu Dec 28 15:48:25 2021 +0000",
7576
"v1.4.7 Tue Jan 2 14:17:11 2024 +0000",
7677
], 'php', {current: "1.4.7", next: null, releaseType: null})
7778

7879
expect(fullReleaseConfig.sla.php).toEqual({
80+
"1.1.4": {
81+
"releaseDate": "2021-12-28",
82+
"supportEnd": "2026-01-02",
83+
"supportStart": "2024-01-02",
84+
"supportStatus": "maintenance",
85+
},
7986
"1.4.7": {
8087
"releaseDate": "2024-01-02",
8188
"supportStatus": "active",

scripts/release/sla.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ function getMajorMinor(lang: Language, version: string): { major: number; minor:
1414
const matches = version.match(/(\d+)\.(\d+)/);
1515

1616
if (!matches || matches.length < 3) {
17-
throw new Error(`unable to parse version '${version}' for language '${lang}'`);
17+
console.warn(`unable to parse version '${version}' for language '${lang}'`);
18+
19+
return { major: 0, minor: 0 };
1820
}
1921

2022
return { major: parseInt(matches[1], 10), minor: parseInt(matches[2], 10) };
@@ -83,12 +85,15 @@ async function getTags(lang: Language): Promise<string[]> {
8385
*/
8486
export function generateLanguageSLA(tags: string[], lang: Language, version: Version): void {
8587
const start = new Date();
88+
const old = new Date(start);
89+
old.setFullYear(start.getFullYear() - 2);
8690
const end = new Date(start);
8791
end.setFullYear(start.getFullYear() + 2);
8892

8993
// @ts-expect-error -- force reset our sla policy to remove outdated ones
9094
fullReleaseConfig.sla[lang] = {};
9195

96+
let prevTagRelease = start;
9297
let prevTagMajor = 0;
9398
let prevTagMinor = 0;
9499
let prevTagVersion = '';
@@ -107,30 +112,39 @@ export function generateLanguageSLA(tags: string[], lang: Language, version: Ver
107112
continue;
108113
}
109114

110-
const releaseDate = new Date(tagReleaseDate);
111-
const deadline = new Date(releaseDate);
112-
deadline.setFullYear(releaseDate.getFullYear() + 2);
115+
const { major: tagMajor, minor: tagMinor } = getMajorMinor(lang, tagVersion);
113116

114-
if (start.getTime() > deadline.getTime()) {
117+
if (tagMajor === 0 && tagMinor === 0) {
115118
continue;
116119
}
117120

118-
const { major: tagMajor, minor: tagMinor } = getMajorMinor(lang, tagVersion);
119-
120-
fullReleaseConfig.sla[lang][tagVersion] = {
121-
releaseDate: releaseDate.toISOString().split('T')[0],
122-
};
121+
const releaseDate = new Date(tagReleaseDate);
122+
const deadline = new Date(releaseDate);
123+
deadline.setFullYear(releaseDate.getFullYear() + 2);
123124

124125
// the current tag version defines the maintenance policy of the previous one
125126
if (prevTagVersion !== '') {
126127
// if the previous tag is on the same major.minor version, we don't support it
127128
if (tagMajor === prevTagMajor && tagMinor === prevTagMinor) {
128129
setInactive(lang, prevTagVersion, releaseDate);
130+
131+
if (prevTagRelease.getTime() < old.getTime()) {
132+
delete fullReleaseConfig.sla[lang][prevTagVersion];
133+
}
129134
} else {
130135
setMaintenance(lang, prevTagVersion, releaseDate, deadline);
136+
137+
if (start.getTime() > deadline.getTime()) {
138+
delete fullReleaseConfig.sla[lang][prevTagVersion];
139+
}
131140
}
132141
}
133142

143+
fullReleaseConfig.sla[lang][tagVersion] = {
144+
releaseDate: releaseDate.toISOString().split('T')[0],
145+
};
146+
147+
prevTagRelease = releaseDate;
134148
prevTagMajor = tagMajor;
135149
prevTagMinor = tagMinor;
136150
prevTagVersion = tagVersion;

0 commit comments

Comments
 (0)