Skip to content

Commit b8f09b7

Browse files
committed
main try catch refactor
1 parent ad68e2e commit b8f09b7

File tree

11 files changed

+121
-71
lines changed

11 files changed

+121
-71
lines changed

__tests__/getLabels.test.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
jest.mock('@actions/core')
22
import { Octokit } from "@octokit/core"
3+
import { RequestError } from "@octokit/request-error"
34
import { getLabels } from '../src/getLabels'
45

56
const octokit = new Octokit({
@@ -20,11 +21,19 @@ test('get labels', async () => {
2021
})
2122

2223
test('get labels not found', async () => {
23-
const labels = await getLabels(octokit, 99999, repoName, owner)
24-
expect(labels).toBeUndefined()
24+
try {
25+
await getLabels(octokit, 999, repoName, owner)
26+
} catch (error) {
27+
expect(error).toBeInstanceOf(RequestError)
28+
expect(error).toHaveProperty('status', 404)
29+
}
2530
})
2631

2732
test('get labels error', async () => {
28-
const labels = await getLabels(nooctokit, prNumber, repoName, owner)
29-
expect(labels).toBeUndefined()
33+
try {
34+
await getLabels(nooctokit, prNumber, repoName, owner)
35+
} catch (error) {
36+
expect(error).toBeInstanceOf(RequestError)
37+
expect(error).toHaveProperty('status', 401)
38+
}
3039
})

__tests__/mergePR.test.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
jest.mock('@actions/core')
22
import { Octokit } from "@octokit/core"
3+
import { RequestError } from "@octokit/request-error"
34
import { mergePR } from '../src/mergePR'
45

56
const octokit = new Octokit({
@@ -10,7 +11,7 @@ const nooctokit = new Octokit({
1011
auth: '1234567890'
1112
})
1213

13-
const prNumber = 6
14+
const prNumber = 7
1415
const repoName = 'github-action-close-code-pr'
1516
const owner = 'ThingsO2'
1617

@@ -22,11 +23,19 @@ test('merge PR', async () => {
2223
})
2324

2425
test('merge PR already merged', async () => {
25-
const mergeResult = await mergePR(octokit, 5, repoName, owner)
26-
expect(mergeResult).toBeUndefined()
26+
try {
27+
await mergePR(octokit, 5, repoName, owner)
28+
} catch (error) {
29+
expect(error).toBeInstanceOf(RequestError)
30+
expect(error).toHaveProperty('status', 405)
31+
}
2732
})
2833

2934
test('merge PR no token', async () => {
30-
const mergeResult = await mergePR(nooctokit, prNumber, repoName, owner)
31-
expect(mergeResult).toBeUndefined()
35+
try {
36+
await mergePR(nooctokit, prNumber, repoName, owner)
37+
} catch (error) {
38+
expect(error).toBeInstanceOf(RequestError)
39+
expect(error).toHaveProperty('status', 401)
40+
}
3241
})

__tests__/searchCodePR.test.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,17 @@ test('search code PR', async () => {
2222
})
2323

2424
test('search code PR not found', async () => {
25-
const res = await searchCodePR(octokit, 15, repoName, owner)
26-
expect(res).toBeUndefined()
25+
try {
26+
await searchCodePR(octokit, 15, repoName, owner)
27+
} catch (error) {
28+
expect(error).toHaveProperty('status', 404)
29+
}
2730
})
2831

2932
test('search code PR error', async () => {
30-
const res = await searchCodePR(nooctokit, prNumber, repoName, owner)
31-
expect(res).toBeUndefined()
33+
try {
34+
await searchCodePR(nooctokit, prNumber, repoName, owner)
35+
} catch (error) {
36+
expect(error).toHaveProperty('status', 401)
37+
}
3238
})

__tests__/searchPRwithLabels.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ test('search PR with Labels no found', async () => {
2424
})
2525

2626
test('search PR with Labels error', async () => {
27-
const issue = await searchPRwithLabels(nooctokit, repoName, owner, ['test'])
28-
expect(issue).toBeUndefined()
27+
try {
28+
await searchPRwithLabels(nooctokit, repoName, owner, ['test'])
29+
} catch (error) {
30+
expect(error).toHaveProperty('status', 401)
31+
}
2932
})

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
},
1414
"dependencies": {
1515
"@actions/core": "^1.9.1",
16-
"@octokit/core": "^4.0.5"
16+
"@octokit/core": "^4.0.5",
17+
"@octokit/request-error": "^3.0.1"
1718
},
1819
"devDependencies": {
1920
"@octokit/types": "^7.5.0",

src/getLabels.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1-
import * as core from '@actions/core'
21
import { Octokit } from "@octokit/core"
2+
import { RequestError } from "@octokit/request-error"
33
import { Endpoints } from "@octokit/types"
44

55
type listLabelsOnIssueResponse = Endpoints["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"]["response"]
66

7-
export async function getLabels(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<string[] | undefined> {
7+
export async function getLabels(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<string[]> {
88

99
const res = await doRequest(octokit, prNumber, repoName, owner)
1010

11+
if (res instanceof RequestError) {
12+
throw res
13+
}
1114
if (res.status === 200) {
1215
return res.data.map((label) => label.name)
1316
}
14-
core.error(`Error: ${res}`)
17+
1518
return undefined
1619
}
1720

18-
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<listLabelsOnIssueResponse> {
21+
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<listLabelsOnIssueResponse | RequestError> {
1922

2023
const request = "GET /repos/{owner}/{repo}/issues/{issue_number}/labels"
2124

@@ -32,6 +35,9 @@ async function doRequest(octokit: Octokit, prNumber: number, repoName: string, o
3235
headers: {}
3336
}
3437
} catch (error) {
35-
return error
38+
return new RequestError(error.message, error.status, {
39+
request: error.request,
40+
response: error.response,
41+
})
3642
}
3743
}

src/main.ts

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as core from '@actions/core'
22
import { Octokit } from "@octokit/core"
3+
import { RequestError } from "@octokit/request-error"
34
import { getLabels } from './getLabels'
45
import { searchPRwithLabels } from './searchPRwithLabels'
56
import { searchCodePR } from './searchCodePR'
@@ -11,7 +12,7 @@ interface Input {
1112
owner: string
1213
}
1314

14-
export const main = (octokit: Octokit, input: Input, merge: boolean): Promise<core.ExitCode> => {
15+
export async function main(octokit: Octokit, input: Input, merge: boolean): Promise<core.ExitCode>{
1516

1617
const prNumber = input.prNumber
1718
const repoName = input.repoName
@@ -20,46 +21,35 @@ export const main = (octokit: Octokit, input: Input, merge: boolean): Promise<co
2021
core.info(`PR Number: ${prNumber}`)
2122
core.info(`Repo Name: ${repoName}`)
2223

23-
return getLabels(octokit, prNumber, repoName, owner).then((labels) => {
24+
try {
25+
const labels = await getLabels(octokit, prNumber, repoName, owner)
2426
core.info(`Labels: ${labels}`)
25-
if (labels === undefined) {
26-
core.setFailed(`Request label failed`)
27-
return core.ExitCode.Failure
28-
}
29-
// Remove *-pro labels from the list
3027
const labelsToSearch = labels.filter((label) => !label.endsWith("-pro"))
31-
return searchPRwithLabels(octokit, repoName, owner, labelsToSearch).then((PRs) => {
32-
core.info(`PRs: ${PRs}`)
33-
if (PRs === undefined) {
34-
core.setFailed(`Request PRs failed`)
35-
return core.ExitCode.Failure
36-
}
37-
if (PRs.length > 0) {
38-
core.info('PRs found, nothing to merge')
39-
return core.ExitCode.Success
40-
} else {
41-
core.info('No PRs found, merge original code PR')
42-
return searchCodePR(octokit, prNumber, repoName, owner).then((codePR) => {
43-
core.info(`Repo: ${codePR.base.repo.name} PR: ${codePR?.number}`)
44-
if (codePR === undefined) {
45-
core.setFailed(`Request code PR failed`)
28+
const PRs = await searchPRwithLabels(octokit, repoName, owner, labelsToSearch)
29+
core.info(`PRs: ${PRs}`)
30+
if (PRs.length > 0) {
31+
core.info('PRs found, nothing to merge')
32+
return core.ExitCode.Success
33+
} else {
34+
core.info('No PRs found, merge original code PR')
35+
const codePR = await searchCodePR(octokit, prNumber, repoName, owner)
36+
core.info(`Repo: ${codePR.base.repo.name} PR: ${codePR?.number}`)
37+
if (merge) {
38+
return mergePR(octokit, codePR.number, codePR.base.repo.name, owner).then((mergeResult) => {
39+
core.info(`Merge Result: ${mergeResult}`)
40+
if (mergeResult === undefined) {
41+
core.setFailed(`Merge PR failed`)
4642
return core.ExitCode.Failure
4743
}
48-
if (merge) {
49-
return mergePR(octokit, codePR.number, codePR.base.repo.name, owner).then((mergeResult) => {
50-
core.info(`Merge Result: ${mergeResult}`)
51-
if (mergeResult === undefined) {
52-
core.setFailed(`Merge PR failed`)
53-
return core.ExitCode.Failure
54-
}
55-
return core.ExitCode.Success
56-
})
57-
}
5844
return core.ExitCode.Success
5945
})
6046
}
61-
})
62-
})
47+
return core.ExitCode.Success
48+
}
49+
} catch (error) {
50+
core.setFailed(error.message)
51+
return Promise.resolve(core.ExitCode.Failure)
52+
}
6353
}
6454

6555
try {

src/mergePR.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
1-
import * as core from '@actions/core'
21
import { Octokit } from "@octokit/core"
2+
import { RequestError } from "@octokit/request-error"
33
import { Endpoints } from "@octokit/types"
44

55
type mergePR = Endpoints["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"]["response"]
66

7-
export async function mergePR(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<mergePR['data'] | undefined> {
7+
export async function mergePR(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<mergePR['data']> {
88

99
const res = await doRequest(octokit, prNumber, repoName, owner)
1010

11+
if (res instanceof RequestError) {
12+
throw res
13+
}
14+
1115
if (res.status === 200) {
1216
return res.data
1317
}
14-
core.error(`Error: ${res}`)
18+
1519
return undefined
1620
}
1721

18-
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<mergePR> {
22+
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<mergePR | RequestError>{
23+
1924
const request = "PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"
2025

2126
try {
@@ -31,6 +36,9 @@ async function doRequest(octokit: Octokit, prNumber: number, repoName: string, o
3136
headers: {}
3237
}
3338
} catch (error) {
34-
return error
39+
return new RequestError(error.message, error.status, {
40+
request: error.request,
41+
response: error.response,
42+
})
3543
}
3644
}

src/searchCodePR.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
1-
import * as core from '@actions/core'
1+
import { RequestError } from "@octokit/request-error"
22
import { Octokit } from "@octokit/core"
33
import { Endpoints } from "@octokit/types"
44

55
type pullRequest = Endpoints["GET /repos/{owner}/{repo}/pulls/{pull_number}"]["response"]
66

7-
export async function searchCodePR(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<pullRequest['data'] | undefined> {
7+
export async function searchCodePR(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<pullRequest['data']> {
88

99
const res = await doRequest(octokit, prNumber, repoName, owner)
1010

11+
if (res instanceof RequestError) {
12+
throw res
13+
}
14+
1115
if (res.status === 200) {
1216
const re = /^([a-z\-1-9]+)\s([a-z-]+)\s\#pr(\d+)$/
1317
const match = res.data.title.match(re)
1418
if (match) {
1519
const originalRepoName = match[1]
1620
const originalPrNumber = parseInt(match[3])
1721
const original = await doRequest(octokit, originalPrNumber, originalRepoName, owner)
22+
if (original instanceof RequestError) {
23+
throw res
24+
}
1825
if (original.status === 200) {
1926
return original.data
2027
}
2128
}
2229
}
23-
core.error(`Error: ${res}`)
30+
2431
return undefined
2532
}
2633

27-
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<pullRequest> {
34+
async function doRequest(octokit: Octokit, prNumber: number, repoName: string, owner: string): Promise<pullRequest | RequestError> {
35+
2836
const request = "GET /repos/{owner}/{repo}/pulls/{pull_number}"
2937

3038
try {
@@ -40,6 +48,9 @@ async function doRequest(octokit: Octokit, prNumber: number, repoName: string, o
4048
headers: {}
4149
}
4250
} catch (error) {
43-
return error
51+
return new RequestError(error.message, error.status, {
52+
request: error.request,
53+
response: error.response,
54+
})
4455
}
4556
}

src/searchPRwithLabels.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
1-
import * as core from '@actions/core'
1+
import { RequestError } from "@octokit/request-error"
22
import { Octokit } from "@octokit/core"
33
import { Endpoints } from "@octokit/types"
44

55
type listIssues = Endpoints["GET /repos/{owner}/{repo}/issues"]["response"]
66

7-
export async function searchPRwithLabels(octokit: Octokit, repoName: string, owner: string, labels: string[]): Promise<number[] | undefined> {
7+
export async function searchPRwithLabels(octokit: Octokit, repoName: string, owner: string, labels: string[]): Promise<number[]> {
88

99
const res = await doRequest(octokit, repoName, owner, labels)
1010

11+
if (res instanceof RequestError) {
12+
throw res
13+
}
14+
1115
if (res.status === 200) {
1216
return res.data.map((issue) => issue.number)
1317
}
14-
core.error(`Error: ${res}`)
18+
1519
return undefined
1620
}
1721

18-
async function doRequest(octokit: Octokit, repoName: string, owner: string, labels: string[]): Promise<listIssues> {
22+
async function doRequest(octokit: Octokit, repoName: string, owner: string, labels: string[]): Promise<listIssues | RequestError> {
1923

2024
const request = "GET /repos/{owner}/{repo}/issues"
2125

@@ -32,6 +36,9 @@ async function doRequest(octokit: Octokit, repoName: string, owner: string, labe
3236
headers: {}
3337
}
3438
} catch (error) {
35-
return error
39+
return new RequestError(error.message, error.status, {
40+
request: error.request,
41+
response: error.response,
42+
})
3643
}
3744
}

0 commit comments

Comments
 (0)