Skip to content

Commit 252bb49

Browse files
authored
Merge pull request #2897 from ruby/check-milestone
Check if milestone is set
2 parents 980b7af + b0b51b2 commit 252bb49

1 file changed

Lines changed: 80 additions & 0 deletions

File tree

.github/workflows/milestone.yml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
name: Check milestone
2+
3+
on:
4+
pull_request:
5+
types: [opened, edited, labeled, unlabeled, milestoned, demilestoned, synchronize]
6+
7+
jobs:
8+
check:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- uses: actions/checkout@v4
13+
14+
- name: Extract RBS::Version
15+
id: version
16+
run: |
17+
# Extract version string from lib/rbs/version.rb
18+
version=$(ruby -e 'load "lib/rbs/version.rb"; print RBS::VERSION')
19+
echo "version=$version" >> "$GITHUB_OUTPUT"
20+
21+
# Parse major.minor.patch
22+
IFS='.' read -r major minor patch _rest <<< "$version"
23+
echo "major=$major" >> "$GITHUB_OUTPUT"
24+
echo "minor=$minor" >> "$GITHUB_OUTPUT"
25+
echo "patch=$patch" >> "$GITHUB_OUTPUT"
26+
27+
echo "RBS::VERSION = $version (major=$major, minor=$minor, patch=$patch)"
28+
29+
- name: Check milestone
30+
uses: actions/github-script@v7
31+
with:
32+
script: |
33+
const pr = context.payload.pull_request;
34+
const milestone = pr.milestone;
35+
const labels = pr.labels.map(l => l.name);
36+
37+
const version = '${{ steps.version.outputs.version }}';
38+
const major = '${{ steps.version.outputs.major }}';
39+
const minor = '${{ steps.version.outputs.minor }}';
40+
const patch = parseInt('${{ steps.version.outputs.patch }}', 10);
41+
42+
if (!milestone) {
43+
if (labels.includes('no-milestone')) {
44+
core.info('No milestone set, but no-milestone label is present — OK');
45+
return;
46+
}
47+
core.setFailed(
48+
'No milestone set. Add a milestone or add the "no-milestone" label.'
49+
);
50+
return;
51+
}
52+
53+
if (labels.includes('no-milestone')) {
54+
core.setFailed(
55+
'Milestone is set but "no-milestone" label is present. Remove the label or the milestone.'
56+
);
57+
return;
58+
}
59+
60+
const milestoneName = milestone.title;
61+
core.info(`Milestone: "${milestoneName}", RBS::VERSION: ${version}`);
62+
63+
// Expected milestone based on version:
64+
// patch == 0 → "RBS major.minor" (e.g. "RBS 4.0")
65+
// patch >= 1 → "RBS major.minor.x" (e.g. "RBS 4.0.x")
66+
let expectedMilestone;
67+
if (patch === 0) {
68+
expectedMilestone = `RBS ${major}.${minor}`;
69+
} else {
70+
expectedMilestone = `RBS ${major}.${minor}.x`;
71+
}
72+
73+
if (milestoneName !== expectedMilestone) {
74+
core.setFailed(
75+
`Milestone "${milestoneName}" does not match RBS::VERSION ${version}. ` +
76+
`Expected milestone: "${expectedMilestone}"`
77+
);
78+
} else {
79+
core.info(`Milestone "${milestoneName}" matches RBS::VERSION ${version}`);
80+
}

0 commit comments

Comments
 (0)