diff --git a/README.md b/README.md index 0fd5383..78d7fa7 100644 --- a/README.md +++ b/README.md @@ -112,16 +112,20 @@ with: path: path-to-comment-contents.txt ``` -### Wrap file output in a code block +### Embed file content inside a message template -Use `prefix` and `suffix` to wrap the comment body with arbitrary text, such as triple backticks for a code block. +Use `{path}` as a placeholder in the `message` to insert file content at that position. ````yaml -uses: marocchino/sticky-pull-request-comment@v3 -with: - path: path-to-comment-contents.txt - prefix: "```" - suffix: "```" +- name: Run Test + run: rake test > result.txt +- uses: marocchino/sticky-pull-request-comment@v3 + with: + path: result.txt + message: | + ``` + {path} + ``` ```` ### Delete the previous comment and add a comment at the end @@ -232,19 +236,11 @@ For more detailed information about permissions, you can read from the link belo ### `message` -**Optional** Comment message - -### `prefix` - -**Optional** Text to prepend to the comment body (before `message` or `path` content). Useful for opening a code block with ` ``` `. - -### `suffix` - -**Optional** Text to append to the comment body (after `message` or `path` content). Useful for closing a code block with ` ``` `. +**Optional** Comment message. When used together with `path`, use `{path}` as a placeholder in the message where the file content should be inserted. ### `path` -**Optional** Path to file containing comment message +**Optional** Path to file containing comment message. When `message` is also provided and contains `{path}`, the file content is embedded at that placeholder position. ### `number` diff --git a/__tests__/config.test.ts b/__tests__/config.test.ts index 0dd6304..7c25634 100644 --- a/__tests__/config.test.ts +++ b/__tests__/config.test.ts @@ -211,23 +211,11 @@ describe("getBody", () => { expect(core.setFailed).toHaveBeenCalledWith("glob error") }) - test("wraps message with prefix and suffix", async () => { - const {config, core} = await loadConfig() - vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "hello there" - if (name === "prefix") return "```" - if (name === "suffix") return "```" - return "" - }) - expect(await config.getBody()).toBe("```\nhello there\n```") - }) - - test("wraps file content with prefix and suffix", async () => { + test("embeds file content in message when {path} placeholder is used", async () => { const {config, core} = await loadConfig() vi.mocked(core.getMultilineInput).mockReturnValue(["__tests__/assets/result"]) vi.mocked(core.getInput).mockImplementation(name => { - if (name === "prefix") return "```" - if (name === "suffix") return "```" + if (name === "message") return "```\n{path}\n```" return "" }) mockGlobCreate.mockResolvedValue({ @@ -236,44 +224,11 @@ describe("getBody", () => { expect(await config.getBody()).toBe("```\nhi there\n\n```") }) - test("applies only prefix when suffix is not provided", async () => { - const {config, core} = await loadConfig() - vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "hello there" - if (name === "prefix") return "```" - return "" - }) - expect(await config.getBody()).toBe("```\nhello there") - }) - - test("applies only suffix when prefix is not provided", async () => { - const {config, core} = await loadConfig() - vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "hello there" - if (name === "suffix") return "```" - return "" - }) - expect(await config.getBody()).toBe("hello there\n```") - }) - - test("embeds file content in message when $path placeholder is used", async () => { + test("replaces all {path} occurrences in message with file content", async () => { const {config, core} = await loadConfig() vi.mocked(core.getMultilineInput).mockReturnValue(["__tests__/assets/result"]) vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "```\n$path\n```" - return "" - }) - mockGlobCreate.mockResolvedValue({ - glob: vi.fn().mockResolvedValue([resolve("__tests__/assets/result")]), - }) - expect(await config.getBody()).toBe("```\nhi there\n\n```") - }) - - test("replaces all $path occurrences in message with file content", async () => { - const {config, core} = await loadConfig() - vi.mocked(core.getMultilineInput).mockReturnValue(["__tests__/assets/result"]) - vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "$path\n---\n$path" + if (name === "message") return "{path}\n---\n{path}" return "" }) mockGlobCreate.mockResolvedValue({ @@ -282,7 +237,7 @@ describe("getBody", () => { expect(await config.getBody()).toBe("hi there\n\n---\nhi there\n") }) - test("uses file content as body when path is provided but message has no $path placeholder", async () => { + test("uses file content as body when path is provided but message has no {path} placeholder", async () => { const {config, core} = await loadConfig() vi.mocked(core.getMultilineInput).mockReturnValue(["__tests__/assets/result"]) vi.mocked(core.getInput).mockImplementation(name => { @@ -295,11 +250,11 @@ describe("getBody", () => { expect(await config.getBody()).toBe("hi there\n") }) - test("embeds multiple files content in message when $path placeholder is used", async () => { + test("embeds multiple files content in message when {path} placeholder is used", async () => { const {config, core} = await loadConfig() vi.mocked(core.getMultilineInput).mockReturnValue(["__tests__/assets/*"]) vi.mocked(core.getInput).mockImplementation(name => { - if (name === "message") return "```\n$path\n```" + if (name === "message") return "```\n{path}\n```" return "" }) mockGlobCreate.mockResolvedValue({ diff --git a/action.yml b/action.yml index f796b90..064c6cd 100644 --- a/action.yml +++ b/action.yml @@ -52,16 +52,10 @@ inputs: default: "OUTDATED" required: false message: - description: "comment message. When used together with path, use `$path` as a placeholder in the message where the file content should be inserted." - required: false - prefix: - description: "text to prepend to the message (e.g. ` ``` ` to open a code block)" - required: false - suffix: - description: "text to append to the message (e.g. ` ``` ` to close a code block)" + description: "comment message. When used together with path, use `{path}` as a placeholder in the message where the file content should be inserted." required: false path: - description: "glob path to file(s) containing comment message. When message is also provided and contains `$path`, the file content is embedded at that placeholder position." + description: "glob path to file(s) containing comment message. When message is also provided and contains `{path}`, the file content is embedded at that placeholder position." required: false ignore_empty: description: "Indicates whether to ignore missing or empty messages" diff --git a/src/config.ts b/src/config.ts index e69eb02..24ab94c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -50,11 +50,8 @@ export async function getBody(): Promise { const followSymbolicLinks = core.getBooleanInput("follow_symbolic_links", { required: true, }) - const prefixInput = core.getInput("prefix", {required: false}) - const suffixInput = core.getInput("suffix", {required: false}) const messageInput = core.getInput("message", {required: false}) - let body: string if (pathInput && pathInput.length > 0) { try { const globber = await create(pathInput.join("\n"), { @@ -64,28 +61,16 @@ export async function getBody(): Promise { const fileContent = (await globber.glob()) .map(path => readFileSync(path, "utf-8")) .join("\n") - if (messageInput && messageInput.includes("$path")) { - body = messageInput.replace(/\$path/g, fileContent) - } else { - body = fileContent + if (messageInput && messageInput.includes("{path}")) { + return messageInput.replace(/\{path\}/g, fileContent) } + return fileContent } catch (error) { if (error instanceof Error) { core.setFailed(error.message) } return "" } - } else { - body = messageInput } - - if (prefixInput || suffixInput) { - const parts: string[] = [] - if (prefixInput) parts.push(prefixInput) - parts.push(body) - if (suffixInput) parts.push(suffixInput) - return parts.join("\n") - } - - return body + return messageInput }