Skip to content

Commit 9bc649a

Browse files
Merge pull request #6 from pieterclaerhout/improved-pr-number-detection
Improved pr number detection
2 parents 24b1bc6 + 8405cb8 commit 9bc649a

File tree

9 files changed

+206
-167
lines changed

9 files changed

+206
-167
lines changed

dist/index.js

Lines changed: 87 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,14 @@ const core = __importStar(__nccwpck_require__(2186));
4444
const github = __importStar(__nccwpck_require__(5438));
4545
const getYamlConfigAsync_1 = __nccwpck_require__(7919);
4646
const parseConfig_1 = __nccwpck_require__(5826);
47-
const getContextPullRequestDetails_1 = __nccwpck_require__(7236);
4847
const assignReviewersAsync_1 = __nccwpck_require__(3019);
49-
function runAssigner(client, configPath) {
48+
const helpers = __importStar(__nccwpck_require__(6401));
49+
function runAssigner(client, configPath, prNumber) {
5050
var _a;
5151
return __awaiter(this, void 0, void 0, function* () {
5252
try {
53-
const unassignIfLabelRemoved = core.getInput("unassign-if-label-removed", {
54-
required: false,
55-
});
56-
const contextDetails = (0, getContextPullRequestDetails_1.getContextPullRequestDetails)();
57-
if (contextDetails == null) {
53+
const prReviewersAndAssignees = yield helpers.getPrReviewersAndAssignees(client, prNumber);
54+
if (prReviewersAndAssignees === undefined) {
5855
throw new Error("No context details");
5956
}
6057
let userConfig;
@@ -68,10 +65,10 @@ function runAssigner(client, configPath) {
6865
const contextPayload = github.context.payload;
6966
core.debug("Assigning reviewers...");
7067
const assignedResult = yield (0, assignReviewersAsync_1.assignReviewersAsync)({
71-
client,
72-
contextDetails,
73-
contextPayload,
68+
client: client,
7469
labelReviewers: config.assign,
70+
contextDetails: prReviewersAndAssignees,
71+
contextPayload: contextPayload,
7572
});
7673
if (assignedResult.status === "error") {
7774
core.setFailed(assignedResult.message);
@@ -175,10 +172,11 @@ function assignReviewersAsync({ client, labelReviewers, contextDetails, contextP
175172
};
176173
}
177174
const result = yield (0, setReviewersAsync_1.setReviewersAsync)({
178-
client,
175+
client: client,
179176
reviewers: reviewersToAssign,
180-
contextPayload,
181-
action: "assign",
177+
contextPayload: contextPayload,
178+
pullRequestDetails: contextDetails,
179+
// action: "assign",
182180
});
183181
if (result == null) {
184182
return {
@@ -196,56 +194,6 @@ function assignReviewersAsync({ client, labelReviewers, contextDetails, contextP
196194
exports.assignReviewersAsync = assignReviewersAsync;
197195

198196

199-
/***/ }),
200-
201-
/***/ 7236:
202-
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
203-
204-
"use strict";
205-
206-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
207-
if (k2 === undefined) k2 = k;
208-
var desc = Object.getOwnPropertyDescriptor(m, k);
209-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
210-
desc = { enumerable: true, get: function() { return m[k]; } };
211-
}
212-
Object.defineProperty(o, k2, desc);
213-
}) : (function(o, m, k, k2) {
214-
if (k2 === undefined) k2 = k;
215-
o[k2] = m[k];
216-
}));
217-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
218-
Object.defineProperty(o, "default", { enumerable: true, value: v });
219-
}) : function(o, v) {
220-
o["default"] = v;
221-
});
222-
var __importStar = (this && this.__importStar) || function (mod) {
223-
if (mod && mod.__esModule) return mod;
224-
var result = {};
225-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
226-
__setModuleDefault(result, mod);
227-
return result;
228-
};
229-
Object.defineProperty(exports, "__esModule", ({ value: true }));
230-
exports.getContextPullRequestDetails = void 0;
231-
const github = __importStar(__nccwpck_require__(5438));
232-
function getContextPullRequestDetails() {
233-
var _a;
234-
const pullRequest = github.context.payload.pull_request;
235-
if (typeof pullRequest === "undefined") {
236-
return null;
237-
}
238-
const labels = pullRequest.labels;
239-
const reviewers = pullRequest.requested_reviewers;
240-
return {
241-
labels: labels.map((label) => label.name),
242-
reviewers: reviewers.map((reviewer) => reviewer.login),
243-
baseSha: (_a = pullRequest === null || pullRequest === void 0 ? void 0 : pullRequest.base) === null || _a === void 0 ? void 0 : _a.sha,
244-
};
245-
}
246-
exports.getContextPullRequestDetails = getContextPullRequestDetails;
247-
248-
249197
/***/ }),
250198

251199
/***/ 7919:
@@ -371,35 +319,28 @@ exports.setReviewersAsync = void 0;
371319
function setReviewersAsync(options) {
372320
return __awaiter(this, void 0, void 0, function* () {
373321
const payload = options.contextPayload;
374-
const pullRequest = payload.pull_request;
322+
const prNumber = options.pullRequestDetails.prNumber;
375323
const repository = payload.repository;
376-
if (typeof pullRequest === "undefined" || typeof repository === "undefined") {
324+
if (prNumber === undefined || repository === undefined) {
377325
throw new Error("Cannot resolve action context");
378326
}
379327
if (options.reviewers.length === 0) {
380328
return null;
381329
}
382330
const repoOwner = repository.owner.login;
383-
const pullNumber = pullRequest.number;
331+
const pullNumber = prNumber;
384332
const repo = repository.name;
385-
const prOwner = pullRequest.user.login;
333+
const prOwner = options.pullRequestDetails.owner;
386334
const reviewers = options.reviewers.filter((reviewer) => reviewer !== prOwner);
387335
if (reviewers.length === 0) {
388336
return null;
389337
}
390-
const result = options.action === "assign"
391-
? yield options.client.rest.pulls.requestReviewers({
392-
owner: repoOwner,
393-
repo,
394-
pull_number: pullNumber,
395-
reviewers,
396-
})
397-
: yield options.client.rest.pulls.removeRequestedReviewers({
398-
owner: repoOwner,
399-
repo,
400-
pull_number: pullNumber,
401-
reviewers,
402-
});
338+
const result = yield options.client.rest.pulls.requestReviewers({
339+
owner: repoOwner,
340+
repo,
341+
pull_number: pullNumber,
342+
reviewers,
343+
});
403344
return {
404345
url: result.url,
405346
};
@@ -448,7 +389,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
448389
});
449390
};
450391
Object.defineProperty(exports, "__esModule", ({ value: true }));
451-
exports.getChangedFiles = exports.getPrNumber = exports.fetchContent = void 0;
392+
exports.getPrReviewersAndAssignees = exports.getChangedFiles = exports.getPrNumber = exports.fetchContent = void 0;
452393
const github = __importStar(__nccwpck_require__(5438));
453394
const core = __importStar(__nccwpck_require__(2186));
454395
function fetchContent(client, repoPath) {
@@ -463,12 +404,33 @@ function fetchContent(client, repoPath) {
463404
});
464405
}
465406
exports.fetchContent = fetchContent;
466-
function getPrNumber() {
467-
const pullRequest = github.context.payload.pull_request;
468-
if (!pullRequest) {
469-
return undefined;
470-
}
471-
return pullRequest.number;
407+
function getPrNumber(client) {
408+
return __awaiter(this, void 0, void 0, function* () {
409+
try {
410+
const pullRequest = github.context.payload.pull_request;
411+
if (pullRequest) {
412+
return pullRequest.number;
413+
}
414+
const result = yield client.rest.repos.listPullRequestsAssociatedWithCommit({
415+
owner: github.context.repo.owner,
416+
repo: github.context.repo.repo,
417+
commit_sha: github.context.sha,
418+
});
419+
const pr = result.data
420+
.filter((el) => el.state === "open")
421+
.find((el) => {
422+
return github.context.payload.ref === `refs/heads/${el.head.ref}`;
423+
});
424+
if (pr !== undefined) {
425+
core.info(`📄 Linked PR: ${pr.number} | ${pr.title}`);
426+
}
427+
return pr === null || pr === void 0 ? void 0 : pr.number;
428+
}
429+
catch (error) {
430+
core.error(`🚨 Failed to get PR number: ${error}`);
431+
return undefined;
432+
}
433+
});
472434
}
473435
exports.getPrNumber = getPrNumber;
474436
function getChangedFiles(client, prNumber) {
@@ -477,9 +439,11 @@ function getChangedFiles(client, prNumber) {
477439
owner: github.context.repo.owner,
478440
repo: github.context.repo.repo,
479441
pull_number: prNumber,
442+
per_page: 100,
480443
});
481444
const listFilesResponse = yield client.paginate(listFilesOptions);
482445
const changedFiles = listFilesResponse.map((f) => f.filename);
446+
// TODO: loop when more than 30 files changed
483447
if (changedFiles.length > 0) {
484448
core.info("📄 Changed files");
485449
for (const file of changedFiles) {
@@ -490,6 +454,32 @@ function getChangedFiles(client, prNumber) {
490454
});
491455
}
492456
exports.getChangedFiles = getChangedFiles;
457+
function getPrReviewersAndAssignees(client, prNumber) {
458+
var _a, _b;
459+
return __awaiter(this, void 0, void 0, function* () {
460+
try {
461+
const pullRequest = yield client.rest.pulls.get({
462+
owner: github.context.repo.owner,
463+
repo: github.context.repo.repo,
464+
pull_number: prNumber,
465+
});
466+
const labels = pullRequest.data.labels;
467+
const reviewers = pullRequest.data.requested_reviewers;
468+
return {
469+
prNumber: prNumber,
470+
labels: labels.map((label) => label.name),
471+
reviewers: reviewers.map((reviewer) => reviewer.login),
472+
baseSha: (_a = pullRequest.data.base) === null || _a === void 0 ? void 0 : _a.sha,
473+
owner: (_b = pullRequest.data.user) === null || _b === void 0 ? void 0 : _b.login,
474+
};
475+
}
476+
catch (error) {
477+
core.error(`🚨 Failed to get PR details: ${error}`);
478+
return undefined;
479+
}
480+
});
481+
}
482+
exports.getPrReviewersAndAssignees = getPrReviewersAndAssignees;
493483

494484

495485
/***/ }),
@@ -565,7 +555,7 @@ function runLabeler(client, configPath, prNumber) {
565555
}
566556
}
567557
catch (error) {
568-
core.error(error);
558+
core.error(` 🚨 ${error}`);
569559
core.setFailed(error.message);
570560
}
571561
});
@@ -730,18 +720,22 @@ const assigner_1 = __nccwpck_require__(3463);
730720
const owner_1 = __nccwpck_require__(7612);
731721
function run() {
732722
return __awaiter(this, void 0, void 0, function* () {
733-
const prNumber = helpers.getPrNumber();
723+
const token = core.getInput("token", { required: true });
724+
const configPath = core.getInput("configuration-path", { required: true });
725+
const client = github.getOctokit(token);
726+
const prNumber = yield helpers.getPrNumber(client);
734727
if (!prNumber) {
735728
console.log("Could not get pull request number from context, exiting");
736729
return;
737730
}
738-
const token = core.getInput("token", { required: true });
739-
const configPath = core.getInput("configuration-path", { required: true });
740-
const client = github.getOctokit(token);
741731
core.info(`📄 Pull Request Number: ${prNumber}`);
732+
core.info(`🏭 Running labeler for ${prNumber}`);
742733
yield (0, labeler_1.runLabeler)(client, configPath, prNumber);
743-
yield (0, assigner_1.runAssigner)(client, configPath);
734+
core.info(`🏭 Running assigner for ${prNumber}`);
735+
yield (0, assigner_1.runAssigner)(client, configPath, prNumber);
736+
core.info(`🏭 Running owner for ${prNumber}`);
744737
yield (0, owner_1.runOwner)(client, prNumber);
738+
core.info(`📄 Finsihed for ${prNumber}`);
745739
});
746740
}
747741
exports.run = run;

src/assigner/assigner.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@ import * as github from "@actions/github";
33

44
import { getYamlConfigAsync } from "./utils/getYamlConfigAsync";
55
import { parseConfig } from "./utils/parseConfig";
6-
import { getContextPullRequestDetails } from "./utils/getContextPullRequestDetails";
76
import { assignReviewersAsync } from "./utils/assignReviewersAsync";
87

98
import * as common from "../common/common";
9+
import * as helpers from "../common/helpers";
1010

1111
import { Config } from "./config";
1212

1313
export async function runAssigner(
1414
client: common.ClientType,
15-
configPath: string
15+
configPath: string,
16+
prNumber: number
1617
): Promise<void> {
1718
try {
18-
const unassignIfLabelRemoved = core.getInput("unassign-if-label-removed", {
19-
required: false,
20-
});
21-
22-
const contextDetails = getContextPullRequestDetails();
23-
if (contextDetails == null) {
19+
const prReviewersAndAssignees = await helpers.getPrReviewersAndAssignees(
20+
client,
21+
prNumber
22+
);
23+
if (prReviewersAndAssignees === undefined) {
2424
throw new Error("No context details");
2525
}
2626

@@ -41,10 +41,10 @@ export async function runAssigner(
4141
core.debug("Assigning reviewers...");
4242

4343
const assignedResult = await assignReviewersAsync({
44-
client,
45-
contextDetails,
46-
contextPayload,
44+
client: client,
4745
labelReviewers: config.assign,
46+
contextDetails: prReviewersAndAssignees,
47+
contextPayload: contextPayload,
4848
});
4949

5050
if (assignedResult.status === "error") {

src/assigner/utils/assignReviewersAsync.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import type { WebhookPayload } from "@actions/github/lib/interfaces";
22
import type { Config } from "../config";
33
import type { AssignReviewersReturn } from "../types";
4-
import type { ContextPullRequestDetails } from "./getContextPullRequestDetails";
54
import { setReviewersAsync } from "./setReviewersAsync";
65
import * as common from "../../common/common";
76

87
interface Options {
98
client: common.ClientType;
109
labelReviewers: Config["assign"];
11-
contextDetails: ContextPullRequestDetails;
10+
contextDetails: common.PullRequestDetails;
1211
contextPayload: WebhookPayload;
1312
}
1413

@@ -55,10 +54,11 @@ export async function assignReviewersAsync({
5554
}
5655

5756
const result = await setReviewersAsync({
58-
client,
57+
client: client,
5958
reviewers: reviewersToAssign,
60-
contextPayload,
61-
action: "assign",
59+
contextPayload: contextPayload,
60+
pullRequestDetails: contextDetails,
61+
// action: "assign",
6262
});
6363

6464
if (result == null) {

src/assigner/utils/getContextPullRequestDetails.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)