ci: fixed stale pr workflow (#11310)

This commit is contained in:
Goni Zahavy
2026-02-01 05:16:34 +02:00
committed by GitHub
parent d4c90b2dfb
commit 9e45313b0a

View File

@@ -28,40 +28,98 @@ jobs:
const cutoff = new Date(Date.now() - DAYS_INACTIVE * 24 * 60 * 60 * 1000) const cutoff = new Date(Date.now() - DAYS_INACTIVE * 24 * 60 * 60 * 1000)
const { owner, repo } = context.repo const { owner, repo } = context.repo
const dryRun = context.payload.inputs?.dryRun === "true" const dryRun = context.payload.inputs?.dryRun === "true"
const stalePrs = []
core.info(`Dry run mode: ${dryRun}`) core.info(`Dry run mode: ${dryRun}`)
core.info(`Cutoff date: ${cutoff.toISOString()}`)
const prs = await github.paginate(github.rest.pulls.list, { const query = `
owner, query($owner: String!, $repo: String!, $cursor: String) {
repo, repository(owner: $owner, name: $repo) {
state: "open", pullRequests(first: 100, states: OPEN, after: $cursor) {
per_page: 100, pageInfo {
sort: "updated", hasNextPage
direction: "asc", endCursor
}) }
nodes {
number
title
author {
login
}
createdAt
commits(last: 1) {
nodes {
commit {
committedDate
}
}
}
comments(last: 1) {
nodes {
createdAt
}
}
reviews(last: 1) {
nodes {
createdAt
}
}
}
}
}
}
`
for (const pr of prs) { const allPrs = []
const lastUpdated = new Date(pr.updated_at) let cursor = null
if (lastUpdated > cutoff) { let hasNextPage = true
core.info(`PR ${pr.number} is fresh`)
continue while (hasNextPage) {
const result = await github.graphql(query, {
owner,
repo,
cursor,
})
allPrs.push(...result.repository.pullRequests.nodes)
hasNextPage = result.repository.pullRequests.pageInfo.hasNextPage
cursor = result.repository.pullRequests.pageInfo.endCursor
}
core.info(`Found ${allPrs.length} open pull requests`)
const stalePrs = allPrs.filter((pr) => {
const dates = [
new Date(pr.createdAt),
pr.commits.nodes[0] ? new Date(pr.commits.nodes[0].commit.committedDate) : null,
pr.comments.nodes[0] ? new Date(pr.comments.nodes[0].createdAt) : null,
pr.reviews.nodes[0] ? new Date(pr.reviews.nodes[0].createdAt) : null,
].filter((d) => d !== null)
const lastActivity = dates.sort((a, b) => b.getTime() - a.getTime())[0]
if (!lastActivity || lastActivity > cutoff) {
core.info(`PR #${pr.number} is fresh (last activity: ${lastActivity?.toISOString() || "unknown"})`)
return false
} }
stalePrs.push(pr) core.info(`PR #${pr.number} is STALE (last activity: ${lastActivity.toISOString()})`)
} return true
})
if (!stalePrs.length) { if (!stalePrs.length) {
core.info("No stale pull requests found.") core.info("No stale pull requests found.")
return return
} }
core.info(`Found ${stalePrs.length} stale pull requests`)
for (const pr of stalePrs) { for (const pr of stalePrs) {
const issue_number = pr.number const issue_number = pr.number
const closeComment = `Closing this pull request because it has had no updates for more than ${DAYS_INACTIVE} days. If you plan to continue working on it, feel free to reopen or open a new PR.` const closeComment = `Closing this pull request because it has had no updates for more than ${DAYS_INACTIVE} days. If you plan to continue working on it, feel free to reopen or open a new PR.`
if (dryRun) { if (dryRun) {
core.info(`[dry-run] Would close PR #${issue_number} from ${pr.user.login}`) core.info(`[dry-run] Would close PR #${issue_number} from ${pr.author.login}: ${pr.title}`)
continue continue
} }
@@ -79,5 +137,5 @@ jobs:
state: "closed", state: "closed",
}) })
core.info(`Closed PR #${issue_number} from ${pr.user.login}`) core.info(`Closed PR #${issue_number} from ${pr.author.login}: ${pr.title}`)
} }