From e5439e773a70e83923f8c8ea3989732bfea0c312 Mon Sep 17 00:00:00 2001 From: Alex Burgel Date: Mon, 14 Aug 2023 12:51:55 -0400 Subject: [PATCH] Add option to skip updating or recreating comments when message is unchanged --- __tests__/comment.test.ts | 16 +++++++++- __tests__/config.test.ts | 64 ++++++++++++++++++++++++++++++--------- action.yml | 4 +++ src/comment.ts | 19 ++++++++++-- src/config.ts | 3 ++ src/main.ts | 9 +++++- 6 files changed, 96 insertions(+), 19 deletions(-) diff --git a/__tests__/comment.test.ts b/__tests__/comment.test.ts index 8c140dd..e1f38ad 100644 --- a/__tests__/comment.test.ts +++ b/__tests__/comment.test.ts @@ -7,7 +7,8 @@ import { findPreviousComment, getBodyOf, updateComment, - minimizeComment + minimizeComment, + commentsEqual } from "../src/comment" jest.mock("@actions/core", () => ({ @@ -250,3 +251,16 @@ describe("getBodyOf", () => { } ) }) + +describe("commentsEqual", () => { + test.each([ + { body: "body", previous: "body\n", header: "header", expected: true }, + { body: "body", previous: "body\n", header: "", expected: true }, + { body: "body", previous: "body\n", header: "header", expected: false }, + { body: "body", previous: "body", header: "header", expected: false }, + { body: "body", previous: "", header: "header", expected: false }, + { body: "", previous: "body", header: "header", expected: false }, + ])("commentsEqual(%s, %s, %s)", ({body, previous, header, expected}) => { + expect(commentsEqual(body, previous, header)).toEqual(expected) + }) +}) diff --git a/__tests__/config.test.ts b/__tests__/config.test.ts index 327917c..6e2926e 100644 --- a/__tests__/config.test.ts +++ b/__tests__/config.test.ts @@ -12,6 +12,7 @@ beforeEach(() => { process.env["INPUT_HIDE_DETAILS"] = "false" process.env["INPUT_GITHUB_TOKEN"] = "some-token" process.env["INPUT_IGNORE_EMPTY"] = "false" + process.env["INPUT_SKIP_UNCHANGED"] = "false" process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"] = "false" }) @@ -35,6 +36,7 @@ afterEach(() => { delete process.env["INPUT_GITHUB_TOKEN"] delete process.env["INPUT_PATH"] delete process.env["INPUT_IGNORE_EMPTY"] + delete process.env["INPUT_SKIP_UNCHANGED"] delete process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"] }) @@ -53,7 +55,8 @@ test("repo", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -71,7 +74,8 @@ test("header", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -89,7 +93,8 @@ test("append", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -107,7 +112,8 @@ test("recreate", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -125,7 +131,8 @@ test("delete", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -143,7 +150,8 @@ test("hideOldComment", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -161,7 +169,8 @@ test("hideAndRecreate", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -179,7 +188,8 @@ test("hideClassify", async () => { hideClassify: "OFF_TOPIC", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -197,7 +207,8 @@ test("hideDetails", async () => { hideClassify: "OUTDATED", hideDetails: true, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -216,7 +227,8 @@ describe("path", () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("hi there\n") }) @@ -235,7 +247,8 @@ describe("path", () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual( "hi there\n\nhey there\n" @@ -256,7 +269,8 @@ describe("path", () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("") }) @@ -276,7 +290,8 @@ test("message", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: false + ignoreEmpty: false, + skipUnchanged: false }) expect(await require("../src/config").getBody()).toEqual("hello there") }) @@ -295,7 +310,28 @@ test("ignore_empty", async () => { hideClassify: "OUTDATED", hideDetails: false, githubToken: "some-token", - ignoreEmpty: true + ignoreEmpty: true, + skipUnchanged: false + }) + expect(await require("../src/config").getBody()).toEqual("") +}) + +test("skip_unchanged", async () => { + process.env["INPUT_SKIP_UNCHANGED"] = "true" + expect(require("../src/config")).toMatchObject({ + pullRequestNumber: expect.any(Number), + repo: {owner: "marocchino", repo: "stick-pull-request-comment"}, + header: "", + append: false, + recreate: false, + deleteOldComment: false, + hideOldComment: false, + hideAndRecreate: false, + hideClassify: "OUTDATED", + hideDetails: false, + githubToken: "some-token", + ignoreEmpty: false, + skipUnchanged: true }) expect(await require("../src/config").getBody()).toEqual("") }) diff --git a/action.yml b/action.yml index 6b335c3..776b192 100644 --- a/action.yml +++ b/action.yml @@ -61,6 +61,10 @@ inputs: description: "Indicates whether to ignore missing or empty messages" default: "false" required: false + skip_unchanged: + description: "only update or recreate if message is different from previous. Only `true` is allowed. Just skip this item when you don't need it." + default: "false" + required: false follow_symbolic_links: description: "Indicates whether to follow symbolic links for path" default: "false" diff --git a/src/comment.ts b/src/comment.ts index 4c7a148..eb3e96c 100644 --- a/src/comment.ts +++ b/src/comment.ts @@ -15,6 +15,10 @@ function headerComment(header: String): string { return `` } +function bodyWithHeader(body: string, header: string): string { + return `${body}\n${headerComment(header)}` +} + export async function findPreviousComment( octokit: InstanceType, repo: { @@ -100,7 +104,7 @@ export async function updateComment( id, body: previousBody ? `${previousBody}\n${body}` - : `${body}\n${headerComment(header)}` + : bodyWithHeader(body, header) } } ) @@ -126,7 +130,7 @@ export async function createComment( issue_number, body: previousBody ? `${previousBody}\n${body}` - : `${body}\n${headerComment(header)}` + : bodyWithHeader(body, header) }) } export async function deleteComment( @@ -162,7 +166,7 @@ export async function minimizeComment( } export function getBodyOf( - previous: {body?: string}, + previous: {body: string}, append: boolean, hideDetails: boolean ): string | undefined { @@ -176,3 +180,12 @@ export function getBodyOf( return previous.body?.replace(/()/g, "$1$2") } + +export function commentsEqual( + body: string, + previous: string, + header: string +): boolean { + const newBody = bodyWithHeader(body, header) + return newBody === previous +} diff --git a/src/config.ts b/src/config.ts index 13ee0de..814d001 100644 --- a/src/config.ts +++ b/src/config.ts @@ -28,6 +28,9 @@ export const onlyCreateComment = core.getBooleanInput("only_create", { export const onlyUpdateComment = core.getBooleanInput("only_update", { required: true }) +export const skipUnchanged = core.getBooleanInput("skip_unchanged", { + required: true +}) export const hideOldComment = core.getBooleanInput("hide", {required: true}) export const githubToken = core.getInput("GITHUB_TOKEN", {required: true}) export const ignoreEmpty = core.getBooleanInput("ignore_empty", { diff --git a/src/main.ts b/src/main.ts index 34f792e..59bb4a1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,7 @@ import { recreate, repo, ignoreEmpty, + skipUnchanged, onlyCreateComment, onlyUpdateComment } from "./config" @@ -23,7 +24,8 @@ import { findPreviousComment, getBodyOf, minimizeComment, - updateComment + updateComment, + commentsEqual } from "./comment" async function run(): Promise { @@ -99,6 +101,11 @@ async function run(): Promise { return } + if (skipUnchanged && commentsEqual(body, previous.body, header)) { + // don't recreate or update if the message is unchanged + return + } + const previousBody = getBodyOf(previous, append, hideDetails) if (recreate) { await deleteComment(octokit, previous.id)