mirror of
https://github.com/filamentphp/filament.git
synced 2026-09-19 02:04:55 +08:00
212 lines
7.6 KiB
YAML
212 lines
7.6 KiB
YAML
name: manage-issue
|
|
|
|
on:
|
|
issues:
|
|
types: [opened, edited]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
check-repro:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
issues: write
|
|
steps:
|
|
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
with:
|
|
script: |
|
|
const URL_REGEXP = /### Reproduction repository \(issue will be closed if this is not valid\)[\r\n]+([^#]+)###/m
|
|
const REPRO_STEPS_REGEXP = /### Steps to reproduce[\r\n]+([^#]+)###/m
|
|
const LABEL_NEEDS_MORE_INFORMATION = 'needs more info'
|
|
const LABEL_UNCONFIRMED = 'unconfirmed'
|
|
|
|
function debug(...args) {
|
|
core.info(args.map(JSON.stringify).join(' '))
|
|
}
|
|
|
|
if (context.payload.comment) {
|
|
debug('Ignoring comment update.')
|
|
|
|
return
|
|
}
|
|
|
|
const user = context.payload.sender.login
|
|
const issue = context.payload.issue
|
|
const body = issue.body
|
|
|
|
if (body.includes('filament/minimal-theme')) {
|
|
debug('Ignoring Minimal Theme issue.')
|
|
|
|
return
|
|
}
|
|
|
|
const urlMatch = body.match(URL_REGEXP)
|
|
const reproStepsMatch = body.match(REPRO_STEPS_REGEXP)
|
|
const url = urlMatch !== null ? urlMatch[1].trim() : null
|
|
const reproSteps = reproStepsMatch !== null ? reproStepsMatch[1].trim() : null
|
|
|
|
debug(`Found URL '${url}'`)
|
|
debug(`Found repro steps '${reproSteps}'`)
|
|
|
|
async function createComment(comment) {
|
|
comment = comment
|
|
.split('\n')
|
|
.map((line) => line.trim())
|
|
.join('\n')
|
|
.trim()
|
|
|
|
await github.rest.issues.createComment({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
body: comment,
|
|
})
|
|
}
|
|
|
|
async function getGitHubActionComments() {
|
|
debug(`Loading existing comments...`)
|
|
|
|
const comments = await github.rest.issues.listComments({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
})
|
|
|
|
return comments.data.filter(comment => {
|
|
debug(`comment by user: '${comment.user.login}'`)
|
|
return comment.user.login === 'github-actions[bot]'
|
|
})
|
|
}
|
|
|
|
async function getIssueLabels() {
|
|
const issues = await github.rest.issues.listLabelsOnIssue({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
})
|
|
|
|
return issues.data
|
|
}
|
|
|
|
async function updateIssue(state, state_reason = null) {
|
|
await github.rest.issues.update({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: context.issue.number,
|
|
state,
|
|
state_reason,
|
|
})
|
|
}
|
|
|
|
async function closeWithComment(comment) {
|
|
if (issue.state !== 'open') {
|
|
debug(`Issue is not open`)
|
|
|
|
return
|
|
}
|
|
|
|
const comments = await getGitHubActionComments()
|
|
|
|
if (comments.length > 0) {
|
|
debug(`Already commented on issue won't comment again`)
|
|
|
|
return
|
|
}
|
|
|
|
debug(`Missing required information`)
|
|
|
|
await github.rest.issues.addLabels({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
labels: [LABEL_NEEDS_MORE_INFORMATION],
|
|
})
|
|
|
|
await createComment(comment)
|
|
|
|
await updateIssue('closed', 'not_planned')
|
|
}
|
|
|
|
async function openWithComment(comment) {
|
|
if (issue.state !== 'closed') {
|
|
debug(`Issue is already open`)
|
|
|
|
return
|
|
}
|
|
|
|
const labels = await getIssueLabels()
|
|
const label = labels.find(label => label.name === LABEL_NEEDS_MORE_INFORMATION)
|
|
|
|
if (! label) {
|
|
debug(`Issue was not tagged as needs information`)
|
|
|
|
return
|
|
}
|
|
|
|
const comments = await getGitHubActionComments()
|
|
|
|
if (comments.length === 0) {
|
|
debug(`Issue was closed by someone else, won't reopen`)
|
|
|
|
return
|
|
}
|
|
|
|
debug(`Reopening closed issue`)
|
|
|
|
await github.rest.issues.removeLabel({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
name: LABEL_NEEDS_MORE_INFORMATION,
|
|
})
|
|
|
|
await createComment(comment)
|
|
|
|
await updateIssue('open')
|
|
}
|
|
|
|
const COMMENT_HEADER = `
|
|
Hey @${user}! We're sorry to hear that you've hit this issue. 💛
|
|
`.trim()
|
|
|
|
const NO_REPRO_URL = ((! url) || (! url.includes('https://github.com/')) || (url.includes('https://github.com/filamentphp') && (! url.includes('https://github.com/filamentphp/demo'))))
|
|
const NO_REPRO_STEPS = (! reproSteps) || reproSteps.length < 25
|
|
|
|
if (NO_REPRO_URL || NO_REPRO_STEPS) {
|
|
let comment = `
|
|
${COMMENT_HEADER}
|
|
|
|
`
|
|
|
|
if (NO_REPRO_URL) {
|
|
comment += `
|
|
However, it looks like you forgot to fill in the reproduction repository URL. Can you edit your original post and then we'll look at your issue?
|
|
|
|
We need a public GitHub repository which contains a Laravel app with the minimal amount of Filament code to reproduce the problem. **Please do not link to your actual project**, what we need instead is a _minimal_ reproduction in a fresh project without any unnecessary code. This means it doesn\'t matter if your real project is private / confidential, since we want a link to a separate, isolated reproduction. That would allow us to download it and review your bug much easier, so it can be fixed quicker. Please make sure to include a database seeder with everything we need to set the app up quickly.
|
|
|
|
Need a starting point? Use our [issue reproduction template](https://github.com/filamentphp/issue-reproduction-template) — pick the branch matching your Filament major version.
|
|
`
|
|
}
|
|
|
|
if (NO_REPRO_URL && NO_REPRO_STEPS) {
|
|
comment += `
|
|
|
|
Also, `
|
|
} else if (NO_REPRO_STEPS) {
|
|
comment += `
|
|
|
|
However, `
|
|
}
|
|
|
|
if (NO_REPRO_STEPS) {
|
|
comment += `it doesn't look like you've provided much information on how to replicate the issue. Please edit your original post with clear steps we need to take.`
|
|
}
|
|
|
|
closeWithComment(comment)
|
|
} else {
|
|
openWithComment(`
|
|
Thank you for providing reproduction steps! Reopening the issue now.
|
|
`)
|
|
}
|