mirror of
https://github.com/marocchino/sticky-pull-request-comment.git
synced 2026-03-29 10:39:24 +00:00
feat: use {path} placeholder and remove prefix/suffix inputs
Co-authored-by: marocchino <128431+marocchino@users.noreply.github.com>
This commit is contained in:
parent
981267b215
commit
4bbfc023b8
4 changed files with 26 additions and 96 deletions
30
README.md
30
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`
|
||||
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
10
action.yml
10
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"
|
||||
|
|
|
|||
|
|
@ -50,11 +50,8 @@ export async function getBody(): Promise<string> {
|
|||
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<string> {
|
|||
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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue