This repository has been archived by the owner on Jun 22, 2020. It is now read-only.
/
changelogLabels.ts
148 lines (135 loc) · 4.14 KB
/
changelogLabels.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
* Copyright © 2019 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
HandlerResult,
MappedParameter,
MappedParameters,
Parameters,
Secret,
Secrets,
Success,
} from "@atomist/automation-client";
import { CommandHandlerRegistration } from "@atomist/sdm";
import { bold } from "@atomist/slack-messages";
import * as GitHubApi from "@octokit/rest";
import * as github from "../../util/gitHubApi";
import { success } from "../../util/messages";
export const ChangelogLabels = [
"added",
"changed",
"deprecated",
"removed",
"fixed",
"security",
];
@Parameters()
export class ChangelogParameters {
@MappedParameter(MappedParameters.GitHubOwner)
public owner: string;
@MappedParameter(MappedParameters.GitHubRepository)
public repo: string;
@MappedParameter(MappedParameters.GitHubApiUrl)
public apiUrl: string;
@Secret(Secrets.userToken("repo"))
public githubToken: string;
}
/**
* CommandHandler to add required changelog labels to a given repo.
* @returns {HandleCommand<ChangelogParameters>}
*/
export const AddChangelogLabels: CommandHandlerRegistration<ChangelogParameters> = {
name: "AddChangelogLabels",
intent: "add changelog labels",
description: "Add changelog labels to a GitHub repo",
tags: ["github", "changelog", "label"],
paramsMaker: ChangelogParameters,
listener: async cli => {
const result = await upsertChangelogLabels({
api: github.api(cli.parameters.githubToken, cli.parameters.apiUrl),
owner: cli.parameters.owner,
repo: cli.parameters.repo,
});
const msg = (result.code === 0) ?
`Successfully added changelog labels to ${bold(cli.parameters.owner + "/" + cli.parameters.repo)}` :
result.message;
await cli.context.messageClient.respond(success("Changelog Labels", msg));
return result;
},
};
/**
* Information needed to check and create a label.
*/
interface UpsertChangelogLabelsInfo {
/** @octokit/rest API to use to query and create label. */
api: GitHubApi;
/** Name of repository in which to create label */
repo: string;
/** Owner of repository in which to create label */
owner: string;
}
export async function upsertChangelogLabels(info: UpsertChangelogLabelsInfo): Promise<HandlerResult> {
const labels: UpsertLabelInfo[] = ChangelogLabels.map(l => ({
api: info.api,
owner: info.owner,
repo: info.repo,
name: `changelog:${l}`,
color: "C5DB71",
}));
labels.push({
api: info.api,
owner: info.owner,
repo: info.repo,
name: "breaking",
color: "B60205",
});
try {
await Promise.all(labels.map(upsertLabel));
} catch (e) {
const message = `Failed to add changelog labels to ${info.owner}/${info.repo}: ${e.message}`;
return { code: 1, message };
}
return Success;
}
/**
* Information needed to check and create a label.
*/
interface UpsertLabelInfo extends UpsertChangelogLabelsInfo {
/** Name of label to upsert */
name: string;
/** Color of label */
color: string;
}
/**
* Create a label if it does not exist.
*
* @param info label details
*/
async function upsertLabel(info: UpsertLabelInfo): Promise<void> {
try {
await info.api.issues.getLabel({
name: info.name,
repo: info.repo,
owner: info.owner,
});
} catch (err) {
await info.api.issues.createLabel({
owner: info.owner,
repo: info.repo,
name: info.name,
color: info.color,
});
}
}