From aba414bc6145c3218340b35fddc015d04a68d7f9 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Fri, 5 Jan 2024 15:57:53 -0300 Subject: [PATCH 01/14] added code to update the prs --- src/github/pullRequest.ts | 25 ++++++++++++++++--- src/index.ts | 51 +++++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/github/pullRequest.ts b/src/github/pullRequest.ts index 4b920a0..6fa432c 100644 --- a/src/github/pullRequest.ts +++ b/src/github/pullRequest.ts @@ -1,5 +1,3 @@ -import { PullRequest } from "@octokit/webhooks-types"; - import { ActionLogger, GitHubClient } from "./types"; /** API class that uses the default token to access the data from the pull request and the repository */ @@ -7,9 +5,28 @@ export class PullRequestApi { constructor( private readonly api: GitHubClient, private readonly logger: ActionLogger, + private readonly repo: { owner: string; repo: string }, ) {} - getPrAuthor(pr: PullRequest): string { - return pr.user.login; + async listPRs(onlyAutoMerge: boolean): Promise { + const openPRs = await this.api.paginate(this.api.rest.pulls.list, { + ...this.repo, + state: "open", + }); + + if (onlyAutoMerge) { + return openPRs.filter((pr) => pr.auto_merge).map((pr) => pr.number); + } else { + return openPRs.map((pr) => pr.number); + } + } + + async update(number: number): Promise { + const { data } = await this.api.rest.pulls.updateBranch({ + ...this.repo, + pull_number: number, + }); + + return data.message; } } diff --git a/src/index.ts b/src/index.ts index e815eec..5cbd072 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ -import { getInput, info, setOutput } from "@actions/core"; +import { getInput, setOutput, summary } from "@actions/core"; +import { SummaryTableRow } from "@actions/core/lib/summary"; import { context, getOctokit } from "@actions/github"; import { Context } from "@actions/github/lib/context"; -import { PullRequest } from "@octokit/webhooks-types"; import { PullRequestApi } from "./github/pullRequest"; import { generateCoreLogger } from "./util"; @@ -23,10 +23,47 @@ const getRepo = (ctx: Context) => { const repo = getRepo(context); setOutput("repo", `${repo.owner}/${repo.repo}`); +const logger = generateCoreLogger(); -if (context.payload.pull_request) { +const action = async () => { const token = getInput("GITHUB_TOKEN", { required: true }); - const api = new PullRequestApi(getOctokit(token), generateCoreLogger()); - const author = api.getPrAuthor(context.payload.pull_request as PullRequest); - info("Author of the PR is " + author); -} + const repoInfo = getRepo(context); + const api = new PullRequestApi(getOctokit(token), logger, repoInfo); + const prs = await api.listPRs(true); + if (prs.length > 0) { + logger.info(`About to update ${prs.length} PRs 🗄️`); + const rows: SummaryTableRow[] = [ + [ + { data: "PR Number", header: true }, + { data: "Result", header: true }, + ], + ]; + for (const number of prs) { + logger.info(`📡 - Updating #${number}`); + const repoTxt = `[#${number}](https://github.com/${repoInfo.owner}/${repoInfo.repo}/pull/${number})`; + try { + await api.update(number); + rows.push([repoTxt, "Pass ✅"]); + logger.info(`📥 - Updated #${number}`); + } catch (error) { + logger.error(error as string | Error); + rows.push([repoTxt, "Fail ❌"]); + } + } + logger.info(" - Finished updating PRs"); + await summary + .addHeading("Up to date", 1) + .addHeading("PRs updated", 3) + .addTable(rows) + .write(); + } else { + logger.info("No matching PRs found. Aborting"); + summary.addHeading("Up to date", 1).addHeading("No matching PRs found"); + } +}; + +action() + .then(() => { + logger.info("Operation completed"); + }) + .catch((e) => logger.error(e as Error)); From 62f71beaae3d853c1c8d23af9e5b782e2e5be489 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:18:47 +0100 Subject: [PATCH 02/14] updated repo description --- README.md | 4 ++-- action.yml | 8 ++++---- package.json | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9c37671..6fc62bf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Parity GitHub Action template +# Up to date action -Template used to generate GitHub Actions. +Keep your pull request up to date when the target branch changes. ## To start diff --git a/action.yml b/action.yml index aea5528..76db4bb 100644 --- a/action.yml +++ b/action.yml @@ -1,9 +1,9 @@ -name: "Example Action" -description: "This values need to be changed" +name: "Up to Date PRs" +description: "Keep all your PRs up to date when a new commit is pushed to the main branch" author: Bullrich branding: - icon: copy - color: yellow + icon: git-merge + color: gray-dark inputs: GITHUB_TOKEN: required: true diff --git a/package.json b/package.json index a1a6de4..cb5b94f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "parity-action-template", + "name": "up-to-date-action", "version": "0.0.1", - "description": "GitHub action template for Parity", + "description": "Keep all your PRs up to date when a new commit is pushed to the main branch", "main": "src/index.ts", "scripts": { "start": "node dist", @@ -12,14 +12,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/Bullrich/parity-action-template.git" + "url": "git+https://github.com/paritytech/up-to-date-action.git" }, "author": "Javier Bullrich ", "license": "MIT", "bugs": { - "url": "https://github.com/Bullrich/parity-action-template/issues" + "url": "https://github.com/paritytech/up-to-date-action/issues" }, - "homepage": "https://github.com/Bullrich/parity-action-template#readme", + "homepage": "https://github.com/paritytech/up-to-date-action#readme", "dependencies": { "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", From cc4477192900607f0e65baf4f73bad71a64679da Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:43:12 +0100 Subject: [PATCH 03/14] updated readme --- .github/update-branch.png | Bin 0 -> 22609 bytes README.md | 70 +++++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 .github/update-branch.png diff --git a/.github/update-branch.png b/.github/update-branch.png new file mode 100644 index 0000000000000000000000000000000000000000..7729e3a53f1a0627ea152f3647ae4777c47f0759 GIT binary patch literal 22609 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 Date: Tue, 9 Jan 2024 11:43:25 +0100 Subject: [PATCH 04/14] implemented image on itself --- .github/workflows/up-to-date.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/workflows/up-to-date.yml diff --git a/.github/workflows/up-to-date.yml b/.github/workflows/up-to-date.yml new file mode 100644 index 0000000..c32565e --- /dev/null +++ b/.github/workflows/up-to-date.yml @@ -0,0 +1,12 @@ +name: Up to date + +on: [push] + +jobs: + updatePullRequests: + runs-on: ubuntu-latest + steps: + - name: Update all the PRs + uses: paritytech/up-to-date-action@main + with: + GITHUB_TOKEN: ${{ github.secret }} From 7767e8b3ebe813c26bdb5c98e9f433a2dca63dc3 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:43:57 +0100 Subject: [PATCH 05/14] removed unused logger --- src/github/pullRequest.ts | 3 +-- src/index.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/github/pullRequest.ts b/src/github/pullRequest.ts index 6fa432c..422e7bc 100644 --- a/src/github/pullRequest.ts +++ b/src/github/pullRequest.ts @@ -1,10 +1,9 @@ -import { ActionLogger, GitHubClient } from "./types"; +import { GitHubClient } from "./types"; /** API class that uses the default token to access the data from the pull request and the repository */ export class PullRequestApi { constructor( private readonly api: GitHubClient, - private readonly logger: ActionLogger, private readonly repo: { owner: string; repo: string }, ) {} diff --git a/src/index.ts b/src/index.ts index 5cbd072..d37546c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,7 +28,7 @@ const logger = generateCoreLogger(); const action = async () => { const token = getInput("GITHUB_TOKEN", { required: true }); const repoInfo = getRepo(context); - const api = new PullRequestApi(getOctokit(token), logger, repoInfo); + const api = new PullRequestApi(getOctokit(token), repoInfo); const prs = await api.listPRs(true); if (prs.length > 0) { logger.info(`About to update ${prs.length} PRs 🗄️`); From 16b3850f5533937e11f0d9ef9e646258f112689e Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:47:56 +0100 Subject: [PATCH 06/14] updated summary to have PRs title --- src/github/pullRequest.ts | 10 +++++++--- src/index.ts | 9 +++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/github/pullRequest.ts b/src/github/pullRequest.ts index 422e7bc..76967b2 100644 --- a/src/github/pullRequest.ts +++ b/src/github/pullRequest.ts @@ -7,16 +7,20 @@ export class PullRequestApi { private readonly repo: { owner: string; repo: string }, ) {} - async listPRs(onlyAutoMerge: boolean): Promise { + async listPRs( + onlyAutoMerge: boolean, + ): Promise<{ number: number; title: string }[]> { const openPRs = await this.api.paginate(this.api.rest.pulls.list, { ...this.repo, state: "open", }); if (onlyAutoMerge) { - return openPRs.filter((pr) => pr.auto_merge).map((pr) => pr.number); + return openPRs + .filter((pr) => pr.auto_merge) + .map(({ number, title }) => ({ number, title }) as const); } else { - return openPRs.map((pr) => pr.number); + return openPRs.map(({ number, title }) => ({ number, title }) as const); } } diff --git a/src/index.ts b/src/index.ts index d37546c..1fe67e0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -35,19 +35,20 @@ const action = async () => { const rows: SummaryTableRow[] = [ [ { data: "PR Number", header: true }, + { data: "Title", header: true }, { data: "Result", header: true }, ], ]; - for (const number of prs) { - logger.info(`📡 - Updating #${number}`); + for (const { number, title } of prs) { + logger.info(`📡 - Updating ${title} #${number}`); const repoTxt = `[#${number}](https://github.com/${repoInfo.owner}/${repoInfo.repo}/pull/${number})`; try { await api.update(number); - rows.push([repoTxt, "Pass ✅"]); + rows.push([repoTxt, title, "Pass ✅"]); logger.info(`📥 - Updated #${number}`); } catch (error) { logger.error(error as string | Error); - rows.push([repoTxt, "Fail ❌"]); + rows.push([repoTxt, title, "Fail ❌"]); } } logger.info(" - Finished updating PRs"); From 2fb940afbced25f9b8e17f30788e0b4b533d2544 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:50:11 +0100 Subject: [PATCH 07/14] added missing emoji to log --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1fe67e0..a3351fb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -51,7 +51,7 @@ const action = async () => { rows.push([repoTxt, title, "Fail ❌"]); } } - logger.info(" - Finished updating PRs"); + logger.info("🪄 - Finished updating PRs"); await summary .addHeading("Up to date", 1) .addHeading("PRs updated", 3) From a730f2ffc6b8bbcea649f224200414d9384fde70 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 11:52:03 +0100 Subject: [PATCH 08/14] fixed wrong action configuration It should be pointing to main --- .github/workflows/up-to-date.yml | 5 ++++- README.md | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/up-to-date.yml b/.github/workflows/up-to-date.yml index c32565e..3929ba2 100644 --- a/.github/workflows/up-to-date.yml +++ b/.github/workflows/up-to-date.yml @@ -1,6 +1,9 @@ name: Up to date -on: [push] +on: + push: + branches: + - 'main' jobs: updatePullRequests: diff --git a/README.md b/README.md index 69cabb1..ba93948 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,10 @@ It basically does the same thing as pressing the following button: ```yml name: Up to date -on: [push] +on: + push: + branches: + - 'main' jobs: updatePullRequests: From 0e2057c7d5ada02907a8269e1daf483e79e3271e Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 12:15:08 +0100 Subject: [PATCH 09/14] disabled requirement of auto merge This should be required in #3 --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index a3351fb..7aba1ba 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,7 +29,7 @@ const action = async () => { const token = getInput("GITHUB_TOKEN", { required: true }); const repoInfo = getRepo(context); const api = new PullRequestApi(getOctokit(token), repoInfo); - const prs = await api.listPRs(true); + const prs = await api.listPRs(false); if (prs.length > 0) { logger.info(`About to update ${prs.length} PRs 🗄️`); const rows: SummaryTableRow[] = [ From f34e38cc2a7a170bbfc14410efe0ccc4d8d13dc2 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 12:15:21 +0100 Subject: [PATCH 10/14] fixed wrong token name It is `token`, not `secret` --- .github/workflows/up-to-date.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/up-to-date.yml b/.github/workflows/up-to-date.yml index 3929ba2..b80b7a9 100644 --- a/.github/workflows/up-to-date.yml +++ b/.github/workflows/up-to-date.yml @@ -12,4 +12,4 @@ jobs: - name: Update all the PRs uses: paritytech/up-to-date-action@main with: - GITHUB_TOKEN: ${{ github.secret }} + GITHUB_TOKEN: ${{ github.token }} From 8fdfe256eaa097cac205c6d65aec76848cd3a356 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 12:19:37 +0100 Subject: [PATCH 11/14] fixed link not working in table Tables do not allow for adding a link and this change should fix that --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 7aba1ba..f9ac9bb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,8 +40,8 @@ const action = async () => { ], ]; for (const { number, title } of prs) { - logger.info(`📡 - Updating ${title} #${number}`); - const repoTxt = `[#${number}](https://github.com/${repoInfo.owner}/${repoInfo.repo}/pull/${number})`; + logger.info(`📡 - Updating '${title}' #${number}`); + const repoTxt = `${repoInfo.owner}/${repoInfo.repo}#${number}`; try { await api.update(number); rows.push([repoTxt, title, "Pass ✅"]); From 6b9401b82eee1a63b8ccc9c750b2a7f7658588a4 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 12:19:54 +0100 Subject: [PATCH 12/14] sort PRs by number. Oldest PRs first --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index f9ac9bb..169418a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,7 +39,7 @@ const action = async () => { { data: "Result", header: true }, ], ]; - for (const { number, title } of prs) { + for (const { number, title } of prs.sort((a, b) => a.number - b.number)) { logger.info(`📡 - Updating '${title}' #${number}`); const repoTxt = `${repoInfo.owner}/${repoInfo.repo}#${number}`; try { From 357637cfdafcdc2d8563d7cf3587bd55456a200f Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 12:31:24 +0100 Subject: [PATCH 13/14] added missing parameter to github app --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ba93948..f5b0856 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ In some cases, specially in big organizations, it is more organized to use a Git - Repository permissions: - Pull Requests - [x] Write + - Contents + - [x] Write Because this project is intended to be used with a token we need to do an extra step to generate one from the GitHub app: - After you create the app, copy the *App ID* and the *private key* and set them as secrets. From 417cd1feddf2b3edda66ebbde9e3d0f0a7022c62 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 9 Jan 2024 14:11:27 +0100 Subject: [PATCH 14/14] change log for setFailed in case of error --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 169418a..fdd5631 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { getInput, setOutput, summary } from "@actions/core"; +import { getInput, setFailed, setOutput, summary } from "@actions/core"; import { SummaryTableRow } from "@actions/core/lib/summary"; import { context, getOctokit } from "@actions/github"; import { Context } from "@actions/github/lib/context"; @@ -67,4 +67,4 @@ action() .then(() => { logger.info("Operation completed"); }) - .catch((e) => logger.error(e as Error)); + .catch(setFailed);