| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- name: Milestone Sync
- on:
- pull_request_target:
- types:
- - opened
- - reopened
- - ready_for_review
- - edited
- - milestoned
- - closed
- branches:
- - develop
- permissions:
- issues: write
- pull-requests: write
- concurrency:
- group: milestone-sync-${{ github.event.pull_request.number }}
- jobs:
- milestone-sync:
- if: github.repository_owner == 'GameServerManagers'
- runs-on: ubuntu-latest
- steps:
- - name: Sync selected milestone to linked issues
- uses: actions/github-script@v9
- with:
- script: |
- const { owner, repo } = context.repo;
- const pr = context.payload.pull_request;
- const action = context.payload.action;
- const fixedLabel = 'status: fixed in develop';
- if (action === 'closed' && !pr.merged) {
- return;
- }
- const milestone = pr.milestone;
- const body = (pr.body || '').replace(/<!--[\s\S]*?-->/g, '');
- const issueRef = /\b(close[sd]?|fix(?:e[sd])?|resolve[sd]?|related to):?\s+(?:([\w.-]+)\/([\w.-]+))?#(\d+)/gi;
- const issues = new Map();
- for (const m of body.matchAll(issueRef)) {
- if (m[2] && (m[2].toLowerCase() !== owner.toLowerCase() || m[3].toLowerCase() !== repo.toLowerCase())) {
- continue;
- }
- const number = Number(m[4]);
- const closing = !/^related to$/i.test(m[1]);
- issues.set(number, issues.get(number) || closing);
- }
- for (const [number, closing] of issues) {
- let issue;
- try {
- ({ data: issue } = await github.rest.issues.get({ owner, repo, issue_number: number }));
- } catch (error) {
- core.warning(`Could not read #${number}: ${error.message}`);
- continue;
- }
- if (issue.pull_request) {
- continue;
- }
- if (milestone && issue.milestone?.number !== milestone.number) {
- if (issue.milestone && !pr.merged) {
- core.info(`#${number} is in ${issue.milestone.title}; it will move to ${milestone.title} when this PR merges.`);
- } else {
- await github.rest.issues.update({ owner, repo, issue_number: number, milestone: milestone.number });
- core.info(`Set #${number} milestone to ${milestone.title}.`);
- }
- }
- if (pr.merged && closing && issue.state === 'open' && !issue.labels.some((l) => (l.name || l) === fixedLabel)) {
- await github.rest.issues.addLabels({ owner, repo, issue_number: number, labels: [fixedLabel] });
- core.info(`Labelled #${number} "${fixedLabel}".`);
- }
- }
|