-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathchangelog.js
More file actions
108 lines (97 loc) · 4.09 KB
/
changelog.js
File metadata and controls
108 lines (97 loc) · 4.09 KB
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
const _ = require("lodash");
const IssueLib = require("./issue");
const MergeRequestLib = require("./mergeRequest");
const Moment = require("moment-timezone");
const Env = require("../env");
const Logger = require("../logger");
// Changelog available format
exports.CHANGELOG_FORMAT_SLACK = "slack-format";
exports.CHANGELOG_FORMAT_GITLAB = "gitlab-format";
exports.CHANGELOG_FORMAT = [
exports.CHANGELOG_FORMAT_SLACK,
exports.CHANGELOG_FORMAT_GITLAB
];
const LABEL_CONFIG = [
{ name: "breaking change", title: "Notable changes" },
{ name: "enhancement", title: "Enhancements" },
{ name: "feature", title: "New features" },
{ name: "bug", title: "Fixed bugs" }
];
exports.generateChangeLogContent = async ({ releaseDate, issues, mergeRequests }, options = {}) => {
// Separate by labels
let changelogBucket = exports._createLabelBucket();
const renderEmptySections = options.renderEmptySections != null ? options.renderEmptySections : true;
exports._populateIssuesWithBucketByIssue(changelogBucket, issues, options);
exports._populateMergeRequestsWithBucketByMergeRequests(changelogBucket, mergeRequests, options);
const labelConfigs = [
...LABEL_CONFIG,
{ name: "issues", title: "Closed issues", default: true },
{ name: "mergeRequests", title: "Merged merge requests", default: true }
];
if (options.useSlack) {
let changelogContent = `*Release note (${Moment.tz(releaseDate, Env.TZ).format("YYYY-MM-DD")})*\n`;
for (const labelConfig of labelConfigs) {
if (changelogBucket[labelConfig.name]) {
changelogContent += `*${labelConfig.title}*\n`;
changelogContent += changelogBucket[labelConfig.name].join("\n");
}
}
return changelogContent;
} else {
let changelogContent = `### Release note (${Moment.tz(releaseDate, Env.TZ).format("YYYY-MM-DD")})\n`;
for (const labelConfig of labelConfigs) {
if (changelogBucket[labelConfig.name]) {
if (!_.isEmpty(changelogBucket[labelConfig.name]) || (labelConfig.default && renderEmptySections)) {
changelogContent += `#### ${labelConfig.title}\n`;
if (!_.isEmpty(changelogBucket[labelConfig.name])) changelogContent += changelogBucket[labelConfig.name].join("\n") + "\n";
}
}
}
return changelogContent;
}
};
exports._createLabelBucket = () => {
const labelBucket = { issues: [], mergeRequests: [] };
for (const labelConfigItem of LABEL_CONFIG) {
labelBucket[labelConfigItem.name] = [];
}
return labelBucket;
};
exports._populateIssuesWithBucketByIssue = (bucket, issues, options = {}) => {
for (const issue of issues) {
let added = false;
for (const label of issue.labels || []) {
if (_.has(bucket, label)) {
bucket[label].push(IssueLib.decorateIssue(issue, options));
added = true;
}
}
if (!added) bucket.issues.push(IssueLib.decorateIssue(issue, options));
}
return bucket;
};
exports._populateMergeRequestsWithBucketByMergeRequests = (bucket, mergeRequests, options = {}) => {
for (const mergeRequest of mergeRequests) {
let added = false;
for (const label of mergeRequest.labels || []) {
if (_.has(bucket, label)) {
bucket[label].push(MergeRequestLib.decorateMergeRequest(mergeRequest, options));
added = true;
}
}
if (!added) bucket.mergeRequests.push(MergeRequestLib.decorateMergeRequest(mergeRequest, options));
}
return bucket;
};
exports.getChangelogByStartAndEndDate = async (startDate, endDate, options = {}) => {
Logger.info(`Time range that we are looking at MRs and issues is between ${Moment.tz(startDate, Env.TZ)} and ${Moment.tz(endDate, Env.TZ)}`);
const mergeRequests = await MergeRequestLib.getMergeRequestByProjectIdStateStartDateAndEndDate(Env.GITLAB_PROJECT_ID, "merged", startDate, endDate);
Logger.info(`Found ${mergeRequests ? mergeRequests.length : 0} merge requests`);
const issues = await IssueLib.searchIssuesByProjectIdStateStartDateAndEndDate(Env.GITLAB_PROJECT_ID, "closed", startDate, endDate);
Logger.info(`Found ${issues ? issues.length : 0} issues`);
return {
mergeRequests,
issues,
releaseDate: endDate
}
};