@clickview/ship-it 0.0.43 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __generator = (this && this.__generator) || function (thisArg, body) {
24
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
25
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ function verb(n) { return function (v) { return step([n, v]); }; }
27
+ function step(op) {
28
+ if (f) throw new TypeError("Generator is already executing.");
29
+ while (_) try {
30
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
+ if (y = 0, t) op = [op[0] & 2, t.value];
32
+ switch (op[0]) {
33
+ case 0: case 1: t = op; break;
34
+ case 4: _.label++; return { value: op[1], done: false };
35
+ case 5: _.label++; y = op[1]; op = [0]; continue;
36
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
+ default:
38
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
+ if (t[2]) _.ops.pop();
43
+ _.trys.pop(); continue;
44
+ }
45
+ op = body.call(thisArg, _);
46
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
+ }
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.CheckReleaseReadyTask = void 0;
52
+ require("reflect-metadata");
53
+ var inversify_1 = require("inversify");
54
+ var Logger_1 = require("../utils/Logger");
55
+ var types_1 = require("../types");
56
+ var services_1 = require("../services");
57
+ var utils_1 = require("../utils");
58
+ var CheckReleaseReadyTask = /** @class */ (function () {
59
+ function CheckReleaseReadyTask(service, slackService, trelloService) {
60
+ this.service = service;
61
+ this.slackService = slackService;
62
+ this.trelloService = trelloService;
63
+ }
64
+ CheckReleaseReadyTask.prototype.run = function (options) {
65
+ var _a;
66
+ return __awaiter(this, void 0, void 0, function () {
67
+ var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, _i, projects_1, project, branchName, mergeRequest, owner, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, _b, deployDependenciesTasks_1, task, _c, beforeReleaseTasks_1, task, _d, afterReleaseTasks_1, task, _e, sqlSections_1, sql, milestoneLabel, deployDependenciesMessage, beforeTasksMessage, afterTasksMessage, sqlMessage, taskSummary;
68
+ return __generator(this, function (_f) {
69
+ switch (_f.label) {
70
+ case 0:
71
+ Logger_1.Logger.logTask('Checking status of the current release...');
72
+ return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
73
+ case 1:
74
+ projects = _f.sent();
75
+ deployDependenciesTasks = [];
76
+ beforeReleaseTasks = [];
77
+ afterReleaseTasks = [];
78
+ sqlSections = [];
79
+ _i = 0, projects_1 = projects;
80
+ _f.label = 2;
81
+ case 2:
82
+ if (!(_i < projects_1.length)) return [3 /*break*/, 7];
83
+ project = projects_1[_i];
84
+ return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
85
+ case 3:
86
+ branchName = (_f.sent()).branchName;
87
+ return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
88
+ case 4:
89
+ mergeRequest = _f.sent();
90
+ if (!mergeRequest)
91
+ return [3 /*break*/, 6];
92
+ return [4 /*yield*/, this.trelloService.getMember(mergeRequest.url)];
93
+ case 5:
94
+ owner = (_a = _f.sent()) !== null && _a !== void 0 ? _a : 'Unknown';
95
+ deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
96
+ beforeTasks = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'Tasks', mergeRequest);
97
+ afterTasks = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'Tasks', mergeRequest);
98
+ beforeSQL = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'SQL', mergeRequest);
99
+ afterSQL = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'SQL', mergeRequest);
100
+ if (deployDependencies) {
101
+ deployDependenciesTasks.push({
102
+ project: project.title,
103
+ mr: mergeRequest.title,
104
+ content: deployDependencies,
105
+ owner: owner
106
+ });
107
+ }
108
+ if (beforeTasks) {
109
+ beforeReleaseTasks.push({
110
+ project: project.title,
111
+ mr: mergeRequest.title,
112
+ content: beforeTasks,
113
+ owner: owner
114
+ });
115
+ }
116
+ if (afterTasks) {
117
+ afterReleaseTasks.push({
118
+ project: project.title,
119
+ mr: mergeRequest.title,
120
+ content: afterTasks,
121
+ owner: owner
122
+ });
123
+ }
124
+ if (beforeSQL) {
125
+ sqlSections.push({
126
+ project: project.title,
127
+ mr: mergeRequest.title,
128
+ content: beforeSQL,
129
+ phase: 'BeforeRelease',
130
+ owner: owner
131
+ });
132
+ }
133
+ if (afterSQL) {
134
+ sqlSections.push({
135
+ project: project.title,
136
+ mr: mergeRequest.title,
137
+ content: afterSQL,
138
+ phase: 'AfterRelease',
139
+ owner: owner
140
+ });
141
+ }
142
+ _f.label = 6;
143
+ case 6:
144
+ _i++;
145
+ return [3 /*break*/, 2];
146
+ case 7:
147
+ // PRINTING TIME
148
+ Logger_1.Logger.logInfo('====== ALL DEPLOY DEPENDENCIES ======');
149
+ for (_b = 0, deployDependenciesTasks_1 = deployDependenciesTasks; _b < deployDependenciesTasks_1.length; _b++) {
150
+ task = deployDependenciesTasks_1[_b];
151
+ Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
152
+ Logger_1.Logger.logMessage(task.content);
153
+ }
154
+ Logger_1.Logger.logInfo('====== ALL BEFORE RELEASE TASKS ======');
155
+ for (_c = 0, beforeReleaseTasks_1 = beforeReleaseTasks; _c < beforeReleaseTasks_1.length; _c++) {
156
+ task = beforeReleaseTasks_1[_c];
157
+ Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
158
+ Logger_1.Logger.logMessage(task.content);
159
+ }
160
+ Logger_1.Logger.logInfo('====== ALL AFTER RELEASE TASKS ======');
161
+ for (_d = 0, afterReleaseTasks_1 = afterReleaseTasks; _d < afterReleaseTasks_1.length; _d++) {
162
+ task = afterReleaseTasks_1[_d];
163
+ Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
164
+ Logger_1.Logger.logMessage(task.content);
165
+ }
166
+ Logger_1.Logger.logInfo('====== ALL SQL CHANGES (with context) ======');
167
+ for (_e = 0, sqlSections_1 = sqlSections; _e < sqlSections_1.length; _e++) {
168
+ sql = sqlSections_1[_e];
169
+ Logger_1.Logger.logMessage("\uD83E\uDDFE ".concat(sql.project, " | ").concat(sql.mr, " (").concat(sql.phase === 'BeforeRelease' ? 'Before Release' : 'After Release', ") | \uD83D\uDC64 ").concat(sql.owner));
170
+ Logger_1.Logger.logMessage(sql.content);
171
+ }
172
+ if (!options.slackNotifier) return [3 /*break*/, 11];
173
+ milestoneLabel = "".concat(options.milestone, " Release");
174
+ deployDependenciesMessage = this.formatTaskSection('Deploy Dependencies', deployDependenciesTasks);
175
+ beforeTasksMessage = this.formatTaskSection('Before Release Tasks', beforeReleaseTasks);
176
+ afterTasksMessage = this.formatTaskSection('After Release Tasks', afterReleaseTasks);
177
+ sqlMessage = this.formatSQLSection(sqlSections);
178
+ taskSummary = [deployDependenciesMessage, beforeTasksMessage, afterTasksMessage].filter(Boolean).join('\n');
179
+ if (!taskSummary) return [3 /*break*/, 9];
180
+ return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
181
+ emailList: [],
182
+ threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
183
+ statusMessage: taskSummary,
184
+ statusCleanMessage: 'No Before/After Release Tasks found!'
185
+ })];
186
+ case 8:
187
+ _f.sent();
188
+ _f.label = 9;
189
+ case 9:
190
+ if (!sqlMessage) return [3 /*break*/, 11];
191
+ return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
192
+ emailList: [],
193
+ threadLabel: "".concat(milestoneLabel, " SQL"),
194
+ statusMessage: sqlMessage,
195
+ statusCleanMessage: 'No SQL changes found in release!',
196
+ sendAsFile: true
197
+ })];
198
+ case 10:
199
+ _f.sent();
200
+ _f.label = 11;
201
+ case 11: return [2 /*return*/, true];
202
+ }
203
+ });
204
+ });
205
+ };
206
+ CheckReleaseReadyTask.prototype.formatTaskSection = function (title, items) {
207
+ if (items.length === 0)
208
+ return 'No tasks found!';
209
+ var output = "## ".concat(title, "\n\n");
210
+ for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
211
+ var item = items_1[_i];
212
+ output += "### ".concat(item.project, " \u2013 ").concat(item.mr, "\n");
213
+ output += "**Owner:** ".concat(item.owner, "\n\n");
214
+ output += "".concat(item.content.trim(), "\n");
215
+ }
216
+ return output;
217
+ };
218
+ CheckReleaseReadyTask.prototype.formatSQLSection = function (items) {
219
+ if (items.length === 0)
220
+ return 'No SQL found!';
221
+ var output = "## SQL Changes\n\n";
222
+ for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
223
+ var item = items_2[_i];
224
+ var phaseLabel = item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release';
225
+ output += "### ".concat(item.project, " \u2013 ").concat(item.mr, " (").concat(phaseLabel, ")\n");
226
+ output += "**Owner:** ".concat(item.owner, "\n\n");
227
+ output += "".concat(item.content.trim(), "\n");
228
+ }
229
+ return output;
230
+ };
231
+ CheckReleaseReadyTask = __decorate([
232
+ (0, inversify_1.injectable)(),
233
+ __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
234
+ __param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
235
+ __param(2, (0, inversify_1.inject)(types_1.SERVICES.TrelloService)),
236
+ __metadata("design:paramtypes", [services_1.GitLabService,
237
+ services_1.SlackService,
238
+ services_1.TrelloService])
239
+ ], CheckReleaseReadyTask);
240
+ return CheckReleaseReadyTask;
241
+ }());
242
+ exports.CheckReleaseReadyTask = CheckReleaseReadyTask;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __generator = (this && this.__generator) || function (thisArg, body) {
24
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
25
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ function verb(n) { return function (v) { return step([n, v]); }; }
27
+ function step(op) {
28
+ if (f) throw new TypeError("Generator is already executing.");
29
+ while (_) try {
30
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
+ if (y = 0, t) op = [op[0] & 2, t.value];
32
+ switch (op[0]) {
33
+ case 0: case 1: t = op; break;
34
+ case 4: _.label++; return { value: op[1], done: false };
35
+ case 5: _.label++; y = op[1]; op = [0]; continue;
36
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
+ default:
38
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
+ if (t[2]) _.ops.pop();
43
+ _.trys.pop(); continue;
44
+ }
45
+ op = body.call(thisArg, _);
46
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
+ }
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.UpdateMergeRequestDescriptionTask = void 0;
52
+ require("reflect-metadata");
53
+ var inversify_1 = require("inversify");
54
+ var types_1 = require("../types");
55
+ var services_1 = require("../services");
56
+ var utils_1 = require("../utils");
57
+ var UpdateMergeRequestDescriptionTask = /** @class */ (function () {
58
+ function UpdateMergeRequestDescriptionTask(service) {
59
+ this.service = service;
60
+ }
61
+ UpdateMergeRequestDescriptionTask.prototype.run = function (options) {
62
+ return __awaiter(this, void 0, void 0, function () {
63
+ var projects, _i, projects_1, project, _a, branch, branchName, mergeRequest, projectConfig, description;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0:
67
+ utils_1.Logger.logTask('Updating Merge Requests Descriptions');
68
+ return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
69
+ case 1:
70
+ projects = _b.sent();
71
+ _i = 0, projects_1 = projects;
72
+ _b.label = 2;
73
+ case 2:
74
+ if (!(_i < projects_1.length)) return [3 /*break*/, 8];
75
+ project = projects_1[_i];
76
+ return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
77
+ case 3:
78
+ _a = _b.sent(), branch = _a.branch, branchName = _a.branchName;
79
+ if (!branch) {
80
+ utils_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] does not exist"));
81
+ return [3 /*break*/, 7];
82
+ }
83
+ return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName, 'opened')];
84
+ case 4:
85
+ mergeRequest = _b.sent();
86
+ if (!mergeRequest) {
87
+ utils_1.Logger.logWarning("[".concat(project.title, "]: MR does not exist"));
88
+ return [3 /*break*/, 7];
89
+ }
90
+ return [4 /*yield*/, this.service.getProjectConfig(project.id, options.sourceBranch)];
91
+ case 5:
92
+ projectConfig = _b.sent();
93
+ description = projectConfig.monorepo.enabled ?
94
+ utils_1.Descriptions.getMonorepoCombinedDescription(project.mergeRequests) :
95
+ utils_1.Descriptions.getCombinedDescription(project.mergeRequests);
96
+ return [4 /*yield*/, this.service.updateMergeRequestDescription({
97
+ projectId: project.id,
98
+ mergeRequestIid: mergeRequest.iid,
99
+ description: description
100
+ })];
101
+ case 6:
102
+ mergeRequest = _b.sent();
103
+ utils_1.Logger.logMessage("[".concat(project.title, "]: MR description updated"));
104
+ utils_1.Logger.logInfo(mergeRequest.url);
105
+ _b.label = 7;
106
+ case 7:
107
+ _i++;
108
+ return [3 /*break*/, 2];
109
+ case 8: return [2 /*return*/, true];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ UpdateMergeRequestDescriptionTask = __decorate([
115
+ (0, inversify_1.injectable)(),
116
+ __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
117
+ __metadata("design:paramtypes", [services_1.GitLabService])
118
+ ], UpdateMergeRequestDescriptionTask);
119
+ return UpdateMergeRequestDescriptionTask;
120
+ }());
121
+ exports.UpdateMergeRequestDescriptionTask = UpdateMergeRequestDescriptionTask;
@@ -66,66 +66,86 @@ var ValidateDescriptionsTask = /** @class */ (function () {
66
66
  ValidateDescriptionsTask.prototype.run = function (options) {
67
67
  var _a;
68
68
  return __awaiter(this, void 0, void 0, function () {
69
- var projects, cont, allInvalidDescriptionsMessage, emailList, _i, projects_1, project, invalidMrs, mergeRequestsTargetingSource, projectConfig, isMonorepo, _b, mergeRequestsTargetingSource_1, mr, errors, isMrValid, projectErrorMessage, groupedByUser, key, authorEmail, _c, _d, _e, mr, errors, _f, errors_1, error, threadLabel, statusCleanMessage;
70
- return __generator(this, function (_g) {
71
- switch (_g.label) {
69
+ var projects, cont, allInvalidDescriptionsMessage, emailList, _loop_1, this_1, _i, projects_1, project, threadLabel, statusCleanMessage;
70
+ return __generator(this, function (_b) {
71
+ switch (_b.label) {
72
72
  case 0:
73
73
  utils_1.Logger.logTask('Validating descriptions');
74
74
  return [4 /*yield*/, this.gitLabService.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
75
75
  case 1:
76
- projects = _g.sent();
76
+ projects = _b.sent();
77
77
  cont = true;
78
78
  allInvalidDescriptionsMessage = '';
79
79
  emailList = [];
80
+ _loop_1 = function (project) {
81
+ var invalidMrs, targetBranch, mergeRequestsTargetingSource, projectConfig, isMonorepo, _c, mergeRequestsTargetingSource_1, mr, errors, isMrValid, projectErrorMessage, groupedByUser, key, authorEmail, _d, _e, _f, mr, errors, _g, errors_1, error;
82
+ return __generator(this, function (_h) {
83
+ switch (_h.label) {
84
+ case 0:
85
+ invalidMrs = [];
86
+ return [4 /*yield*/, this_1.getTargetBranch(project, options)];
87
+ case 1:
88
+ targetBranch = _h.sent();
89
+ if (!targetBranch) {
90
+ utils_1.Logger.logWarning("[".concat(project.title, "]: Skipping due to missing target branch"));
91
+ return [2 /*return*/, "continue"];
92
+ }
93
+ mergeRequestsTargetingSource = project.mergeRequests.filter(function (mergeRequest) {
94
+ return mergeRequest.targetBranch === targetBranch;
95
+ });
96
+ return [4 /*yield*/, this_1.gitLabService.getProjectConfig(project.id, options.sourceBranch)];
97
+ case 2:
98
+ projectConfig = _h.sent();
99
+ isMonorepo = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID;
100
+ for (_c = 0, mergeRequestsTargetingSource_1 = mergeRequestsTargetingSource; _c < mergeRequestsTargetingSource_1.length; _c++) {
101
+ mr = mergeRequestsTargetingSource_1[_c];
102
+ errors = utils_1.Descriptions.validate(mr.description, projectConfig);
103
+ isMrValid = errors.length === 0;
104
+ if (isMonorepo && !((_a = mr.labels) === null || _a === void 0 ? void 0 : _a.length))
105
+ isMrValid = false;
106
+ if (!isMrValid)
107
+ invalidMrs.push([mr, errors]);
108
+ }
109
+ if (invalidMrs.length) {
110
+ utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MRs"));
111
+ projectErrorMessage = "[".concat(project.title, "] has invalid MRs");
112
+ allInvalidDescriptionsMessage += "\n".concat(projectErrorMessage);
113
+ groupedByUser = lodash_1.default.groupBy(invalidMrs, function (_a) {
114
+ var mr = _a[0];
115
+ return mr.author;
116
+ });
117
+ for (key in groupedByUser) {
118
+ utils_1.Logger.logMessage(key);
119
+ authorEmail = this_1.slackService.convertToEmailFormat(key);
120
+ emailList.push(authorEmail);
121
+ allInvalidDescriptionsMessage += "\n".concat(key);
122
+ for (_d = 0, _e = groupedByUser[key]; _d < _e.length; _d++) {
123
+ _f = _e[_d], mr = _f[0], errors = _f[1];
124
+ utils_1.Logger.logMessage("- ".concat(mr.url));
125
+ allInvalidDescriptionsMessage += "\n- ".concat(mr.url);
126
+ for (_g = 0, errors_1 = errors; _g < errors_1.length; _g++) {
127
+ error = errors_1[_g];
128
+ utils_1.Logger.logMessage(" - ".concat(error));
129
+ allInvalidDescriptionsMessage += "\n - ".concat(error);
130
+ }
131
+ }
132
+ }
133
+ cont = false;
134
+ }
135
+ return [2 /*return*/];
136
+ }
137
+ });
138
+ };
139
+ this_1 = this;
80
140
  _i = 0, projects_1 = projects;
81
- _g.label = 2;
141
+ _b.label = 2;
82
142
  case 2:
83
143
  if (!(_i < projects_1.length)) return [3 /*break*/, 5];
84
144
  project = projects_1[_i];
85
- invalidMrs = [];
86
- mergeRequestsTargetingSource = project.mergeRequests.filter(function (mergeRequest) {
87
- return mergeRequest.targetBranch === options.sourceBranch;
88
- });
89
- return [4 /*yield*/, this.gitLabService.getProjectConfig(project.id, options.sourceBranch)];
145
+ return [5 /*yield**/, _loop_1(project)];
90
146
  case 3:
91
- projectConfig = _g.sent();
92
- isMonorepo = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID;
93
- for (_b = 0, mergeRequestsTargetingSource_1 = mergeRequestsTargetingSource; _b < mergeRequestsTargetingSource_1.length; _b++) {
94
- mr = mergeRequestsTargetingSource_1[_b];
95
- errors = utils_1.Descriptions.validate(mr.description, projectConfig);
96
- isMrValid = errors.length === 0;
97
- if (isMonorepo && !((_a = mr.labels) === null || _a === void 0 ? void 0 : _a.length))
98
- isMrValid = false;
99
- if (!isMrValid)
100
- invalidMrs.push([mr, errors]);
101
- }
102
- if (invalidMrs.length) {
103
- utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MRs"));
104
- projectErrorMessage = "[".concat(project.title, "] has invalid MRs");
105
- allInvalidDescriptionsMessage += "\n".concat(projectErrorMessage);
106
- groupedByUser = lodash_1.default.groupBy(invalidMrs, function (_a) {
107
- var mr = _a[0];
108
- return mr.author;
109
- });
110
- for (key in groupedByUser) {
111
- utils_1.Logger.logMessage(key);
112
- authorEmail = this.slackService.convertToEmailFormat(key);
113
- emailList.push(authorEmail);
114
- allInvalidDescriptionsMessage += "\n".concat(key);
115
- for (_c = 0, _d = groupedByUser[key]; _c < _d.length; _c++) {
116
- _e = _d[_c], mr = _e[0], errors = _e[1];
117
- utils_1.Logger.logMessage("- ".concat(mr.url));
118
- allInvalidDescriptionsMessage += "\n- ".concat(mr.url);
119
- for (_f = 0, errors_1 = errors; _f < errors_1.length; _f++) {
120
- error = errors_1[_f];
121
- utils_1.Logger.logMessage(" - ".concat(error));
122
- allInvalidDescriptionsMessage += "\n - ".concat(error);
123
- }
124
- }
125
- }
126
- cont = false;
127
- }
128
- _g.label = 4;
147
+ _b.sent();
148
+ _b.label = 4;
129
149
  case 4:
130
150
  _i++;
131
151
  return [3 /*break*/, 2];
@@ -142,8 +162,8 @@ var ValidateDescriptionsTask = /** @class */ (function () {
142
162
  })];
143
163
  case 6:
144
164
  // Send formated status update in slack
145
- _g.sent();
146
- _g.label = 7;
165
+ _b.sent();
166
+ _b.label = 7;
147
167
  case 7:
148
168
  if (cont)
149
169
  utils_1.Logger.logSuccess('All MR descriptions are valid');
@@ -152,6 +172,26 @@ var ValidateDescriptionsTask = /** @class */ (function () {
152
172
  });
153
173
  });
154
174
  };
175
+ ValidateDescriptionsTask.prototype.getTargetBranch = function (project, options) {
176
+ return __awaiter(this, void 0, void 0, function () {
177
+ var _a, branch, branchName;
178
+ return __generator(this, function (_b) {
179
+ switch (_b.label) {
180
+ case 0:
181
+ if (options.target === 'source-branch') {
182
+ return [2 /*return*/, options.sourceBranch];
183
+ }
184
+ return [4 /*yield*/, this.gitLabService.getNextBranchInfo(project.id, options.version)];
185
+ case 1:
186
+ _a = _b.sent(), branch = _a.branch, branchName = _a.branchName;
187
+ if (!branch) {
188
+ utils_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] does not exist"));
189
+ }
190
+ return [2 /*return*/, branchName];
191
+ }
192
+ });
193
+ });
194
+ };
155
195
  ValidateDescriptionsTask = __decorate([
156
196
  (0, inversify_1.injectable)(),
157
197
  __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
@@ -33,3 +33,4 @@ __exportStar(require("./ValidateTask"), exports);
33
33
  __exportStar(require("./VersionTask"), exports);
34
34
  __exportStar(require("./PopulateTrelloBoardTask"), exports);
35
35
  __exportStar(require("./CreateHotfixTask"), exports);
36
+ __exportStar(require("./UpdateMergeRequestDescriptionTask"), exports);
package/lib/src/types.js CHANGED
@@ -42,6 +42,7 @@ exports.TASKS = {
42
42
  EnsureApprovalRulesTask: Symbol.for('EnsureApprovalRulesTask'),
43
43
  CreateHotfixTask: Symbol.for('CreateHotfixTask'),
44
44
  ChangeMilestoneTask: Symbol.for('ChangeMilestoneTask'),
45
+ UpdateMergeRequestDescriptionTask: Symbol.for('UpdateMergeRequestDescriptionTask')
45
46
  };
46
47
  exports.COMMANDS = {
47
48
  StatusCommand: Symbol.for('StatusCommand'),
@@ -60,5 +61,6 @@ exports.COMMANDS = {
60
61
  ListProjectsCommand: Symbol.for('ListProjectsCommand'),
61
62
  CreateTrelloCardsCommand: Symbol.for('CreateTrelloCardsCommand'),
62
63
  ConfigureProjectsCommand: Symbol.for('ConfigureProjectsCommand'),
63
- CreateHotfixCommand: Symbol.for('CreateHotfixCommand')
64
+ CreateHotfixCommand: Symbol.for('CreateHotfixCommand'),
65
+ UpdateDescriptionCommand: Symbol.for('UpdateDescriptionCommand')
64
66
  };