backstage

Форк
0
/
generate-merge-message.js 
122 строки · 3.5 Кб
1
#!/usr/bin/env node
2
/*
3
 * Copyright 2022 The Backstage Authors
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *     http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17

18
const { execFile: execFileCb } = require('child_process');
19
const { promisify } = require('util');
20
const { resolve: resolvePath } = require('path');
21

22
const execFile = promisify(execFileCb);
23

24
async function hasNewChangesets(baseRef, headRef) {
25
  if (!baseRef) {
26
    throw new Error('baseRef is required');
27
  }
28
  if (!headRef) {
29
    throw new Error('headRef is required');
30
  }
31

32
  const { stdout } = await execFile('git', [
33
    'diff',
34
    '--compact-summary',
35
    baseRef,
36
    headRef,
37
    '--',
38
    '.changeset/*.md',
39
    ':(exclude).changeset/create-app-*.md',
40
  ]);
41
  return stdout.includes('(new)');
42
}
43

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),
52
  );
53
  return releaseDay;
54
}
55

56
function getReleaseSchedule() {
57
  const firstReleaseYear = 2022;
58
  const firstReleaseMonth = 2;
59

60
  return Array(100)
61
    .fill(0)
62
    .map((_, i) => {
63
      const date = getReleaseOfMonth(firstReleaseYear, firstReleaseMonth + i);
64
      return { version: `1.${i}.0`, date };
65
    });
66
}
67

68
function getCurrentRelease() {
69
  const { version: releaseVersion } = require(resolvePath('package.json'));
70

71
  const match = releaseVersion.match(/^(\d+\.\d+\.\d+)/);
72
  if (!match) {
73
    throw new Error(`Failed to parse release version, '${releaseVersion}'`);
74
  }
75
  const [versionStr] = match;
76
  if (versionStr === releaseVersion) {
77
    return releaseVersion;
78
  }
79
  const [major, minor] = versionStr.split('.').map(Number);
80
  return `${major}.${minor - 1}.0`;
81
}
82

83
function findNextRelease(currentRelease, releaseSchedule) {
84
  const currentIndex = releaseSchedule.findIndex(
85
    r => r.version === currentRelease,
86
  );
87
  if (currentIndex === -1) {
88
    throw new Error(
89
      `Failed to find current release '${currentRelease}' in release schedule`,
90
    );
91
  }
92

93
  return releaseSchedule[currentIndex + 1];
94
}
95

96
async function main() {
97
  const [diffBaseRefRef = 'origin/master', diffHeadRef = 'HEAD'] =
98
    process.argv.slice(2);
99
  const needsMessage = await hasNewChangesets(diffBaseRefRef, diffHeadRef);
100
  if (!needsMessage) {
101
    return;
102
  }
103

104
  const currentRelease = getCurrentRelease();
105
  const releaseSchedule = getReleaseSchedule();
106
  const nextRelease = findNextRelease(currentRelease, releaseSchedule);
107

108
  const scheduledDate = nextRelease.date
109
    .toUTCString()
110
    .replace(/\s*\d+:\d+:\d+.*/, '');
111
  process.stdout.write(
112
    [
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}.`,
115
    ].join(' '),
116
  );
117
}
118

119
main().catch(error => {
120
  console.error(error.stack);
121
  process.exit(1);
122
});
123

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.