mirror of
https://github.com/marocchino/sticky-pull-request-comment.git
synced 2025-12-13 04:01:14 +00:00
Add option to skip updating or recreating comments when message is unchanged
This commit is contained in:
parent
077277a006
commit
e5439e773a
6 changed files with 96 additions and 19 deletions
|
|
@ -7,7 +7,8 @@ import {
|
||||||
findPreviousComment,
|
findPreviousComment,
|
||||||
getBodyOf,
|
getBodyOf,
|
||||||
updateComment,
|
updateComment,
|
||||||
minimizeComment
|
minimizeComment,
|
||||||
|
commentsEqual
|
||||||
} from "../src/comment"
|
} from "../src/comment"
|
||||||
|
|
||||||
jest.mock("@actions/core", () => ({
|
jest.mock("@actions/core", () => ({
|
||||||
|
|
@ -250,3 +251,16 @@ describe("getBodyOf", () => {
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("commentsEqual", () => {
|
||||||
|
test.each([
|
||||||
|
{ body: "body", previous: "body\n<!-- Sticky Pull Request Commentheader -->", header: "header", expected: true },
|
||||||
|
{ body: "body", previous: "body\n<!-- Sticky Pull Request Comment -->", header: "", expected: true },
|
||||||
|
{ body: "body", previous: "body\n<!-- Sticky Pull Request Commenta different header -->", 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)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ beforeEach(() => {
|
||||||
process.env["INPUT_HIDE_DETAILS"] = "false"
|
process.env["INPUT_HIDE_DETAILS"] = "false"
|
||||||
process.env["INPUT_GITHUB_TOKEN"] = "some-token"
|
process.env["INPUT_GITHUB_TOKEN"] = "some-token"
|
||||||
process.env["INPUT_IGNORE_EMPTY"] = "false"
|
process.env["INPUT_IGNORE_EMPTY"] = "false"
|
||||||
|
process.env["INPUT_SKIP_UNCHANGED"] = "false"
|
||||||
process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"] = "false"
|
process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"] = "false"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -35,6 +36,7 @@ afterEach(() => {
|
||||||
delete process.env["INPUT_GITHUB_TOKEN"]
|
delete process.env["INPUT_GITHUB_TOKEN"]
|
||||||
delete process.env["INPUT_PATH"]
|
delete process.env["INPUT_PATH"]
|
||||||
delete process.env["INPUT_IGNORE_EMPTY"]
|
delete process.env["INPUT_IGNORE_EMPTY"]
|
||||||
|
delete process.env["INPUT_SKIP_UNCHANGED"]
|
||||||
delete process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"]
|
delete process.env["INPUT_FOLLOW_SYMBOLIC_LINKS"]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -53,7 +55,8 @@ test("repo", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -71,7 +74,8 @@ test("header", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -89,7 +93,8 @@ test("append", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -107,7 +112,8 @@ test("recreate", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -125,7 +131,8 @@ test("delete", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -143,7 +150,8 @@ test("hideOldComment", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -161,7 +169,8 @@ test("hideAndRecreate", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -179,7 +188,8 @@ test("hideClassify", async () => {
|
||||||
hideClassify: "OFF_TOPIC",
|
hideClassify: "OFF_TOPIC",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -197,7 +207,8 @@ test("hideDetails", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: true,
|
hideDetails: true,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -216,7 +227,8 @@ describe("path", () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("hi there\n")
|
expect(await require("../src/config").getBody()).toEqual("hi there\n")
|
||||||
})
|
})
|
||||||
|
|
@ -235,7 +247,8 @@ describe("path", () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual(
|
expect(await require("../src/config").getBody()).toEqual(
|
||||||
"hi there\n\nhey there\n"
|
"hi there\n\nhey there\n"
|
||||||
|
|
@ -256,7 +269,8 @@ describe("path", () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
@ -276,7 +290,8 @@ test("message", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
githubToken: "some-token",
|
||||||
ignoreEmpty: false
|
ignoreEmpty: false,
|
||||||
|
skipUnchanged: false
|
||||||
})
|
})
|
||||||
expect(await require("../src/config").getBody()).toEqual("hello there")
|
expect(await require("../src/config").getBody()).toEqual("hello there")
|
||||||
})
|
})
|
||||||
|
|
@ -295,7 +310,28 @@ test("ignore_empty", async () => {
|
||||||
hideClassify: "OUTDATED",
|
hideClassify: "OUTDATED",
|
||||||
hideDetails: false,
|
hideDetails: false,
|
||||||
githubToken: "some-token",
|
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("")
|
expect(await require("../src/config").getBody()).toEqual("")
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,10 @@ inputs:
|
||||||
description: "Indicates whether to ignore missing or empty messages"
|
description: "Indicates whether to ignore missing or empty messages"
|
||||||
default: "false"
|
default: "false"
|
||||||
required: 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:
|
follow_symbolic_links:
|
||||||
description: "Indicates whether to follow symbolic links for path"
|
description: "Indicates whether to follow symbolic links for path"
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,10 @@ function headerComment(header: String): string {
|
||||||
return `<!-- Sticky Pull Request Comment${header} -->`
|
return `<!-- Sticky Pull Request Comment${header} -->`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function bodyWithHeader(body: string, header: string): string {
|
||||||
|
return `${body}\n${headerComment(header)}`
|
||||||
|
}
|
||||||
|
|
||||||
export async function findPreviousComment(
|
export async function findPreviousComment(
|
||||||
octokit: InstanceType<typeof GitHub>,
|
octokit: InstanceType<typeof GitHub>,
|
||||||
repo: {
|
repo: {
|
||||||
|
|
@ -100,7 +104,7 @@ export async function updateComment(
|
||||||
id,
|
id,
|
||||||
body: previousBody
|
body: previousBody
|
||||||
? `${previousBody}\n${body}`
|
? `${previousBody}\n${body}`
|
||||||
: `${body}\n${headerComment(header)}`
|
: bodyWithHeader(body, header)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -126,7 +130,7 @@ export async function createComment(
|
||||||
issue_number,
|
issue_number,
|
||||||
body: previousBody
|
body: previousBody
|
||||||
? `${previousBody}\n${body}`
|
? `${previousBody}\n${body}`
|
||||||
: `${body}\n${headerComment(header)}`
|
: bodyWithHeader(body, header)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export async function deleteComment(
|
export async function deleteComment(
|
||||||
|
|
@ -162,7 +166,7 @@ export async function minimizeComment(
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getBodyOf(
|
export function getBodyOf(
|
||||||
previous: {body?: string},
|
previous: {body: string},
|
||||||
append: boolean,
|
append: boolean,
|
||||||
hideDetails: boolean
|
hideDetails: boolean
|
||||||
): string | undefined {
|
): string | undefined {
|
||||||
|
|
@ -176,3 +180,12 @@ export function getBodyOf(
|
||||||
|
|
||||||
return previous.body?.replace(/(<details.*?)\s*\bopen\b(.*>)/g, "$1$2")
|
return previous.body?.replace(/(<details.*?)\s*\bopen\b(.*>)/g, "$1$2")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function commentsEqual(
|
||||||
|
body: string,
|
||||||
|
previous: string,
|
||||||
|
header: string
|
||||||
|
): boolean {
|
||||||
|
const newBody = bodyWithHeader(body, header)
|
||||||
|
return newBody === previous
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,9 @@ export const onlyCreateComment = core.getBooleanInput("only_create", {
|
||||||
export const onlyUpdateComment = core.getBooleanInput("only_update", {
|
export const onlyUpdateComment = core.getBooleanInput("only_update", {
|
||||||
required: true
|
required: true
|
||||||
})
|
})
|
||||||
|
export const skipUnchanged = core.getBooleanInput("skip_unchanged", {
|
||||||
|
required: true
|
||||||
|
})
|
||||||
export const hideOldComment = core.getBooleanInput("hide", {required: true})
|
export const hideOldComment = core.getBooleanInput("hide", {required: true})
|
||||||
export const githubToken = core.getInput("GITHUB_TOKEN", {required: true})
|
export const githubToken = core.getInput("GITHUB_TOKEN", {required: true})
|
||||||
export const ignoreEmpty = core.getBooleanInput("ignore_empty", {
|
export const ignoreEmpty = core.getBooleanInput("ignore_empty", {
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import {
|
||||||
recreate,
|
recreate,
|
||||||
repo,
|
repo,
|
||||||
ignoreEmpty,
|
ignoreEmpty,
|
||||||
|
skipUnchanged,
|
||||||
onlyCreateComment,
|
onlyCreateComment,
|
||||||
onlyUpdateComment
|
onlyUpdateComment
|
||||||
} from "./config"
|
} from "./config"
|
||||||
|
|
@ -23,7 +24,8 @@ import {
|
||||||
findPreviousComment,
|
findPreviousComment,
|
||||||
getBodyOf,
|
getBodyOf,
|
||||||
minimizeComment,
|
minimizeComment,
|
||||||
updateComment
|
updateComment,
|
||||||
|
commentsEqual
|
||||||
} from "./comment"
|
} from "./comment"
|
||||||
|
|
||||||
async function run(): Promise<undefined> {
|
async function run(): Promise<undefined> {
|
||||||
|
|
@ -99,6 +101,11 @@ async function run(): Promise<undefined> {
|
||||||
return
|
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)
|
const previousBody = getBodyOf(previous, append, hideDetails)
|
||||||
if (recreate) {
|
if (recreate) {
|
||||||
await deleteComment(octokit, previous.id)
|
await deleteComment(octokit, previous.id)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue