1
0
mirror of synced 2025-12-19 18:10:59 -05:00

Revert "Revert "Revert "Revert "Update ready-for-docs-review workflow to handle Copilot-authored PRs"""" (#56024)

This commit is contained in:
Felicity Chapman
2025-06-12 07:39:11 +01:00
committed by GitHub
parent 17b9402508
commit b47a759acd

View File

@@ -12,6 +12,58 @@ import {
getSize, getSize,
} from './projects.js' } from './projects.js'
/**
* Determines if a PR is authored by Copilot and extracts the human assignee
* @param data GraphQL response data containing PR information
* @returns Object with isCopilotAuthor boolean and copilotAssignee string
*/
function getCopilotAuthorInfo(data: Record<string, any>): {
isCopilotAuthor: boolean
copilotAssignee: string
} {
// Check if this is a Copilot-authored PR
const isCopilotAuthor =
data.item.__typename === 'PullRequest' &&
data.item.author &&
data.item.author.login === 'copilot-swe-agent'
// For Copilot PRs, find the appropriate assignee (excluding Copilot itself)
let copilotAssignee = ''
if (isCopilotAuthor && data.item.assignees && data.item.assignees.nodes) {
const assignees = data.item.assignees.nodes
.map((assignee: Record<string, any>) => assignee.login)
.filter((login: string) => login !== 'copilot-swe-agent')
// Use the first non-Copilot assignee
copilotAssignee = assignees.length > 0 ? assignees[0] : ''
}
return { isCopilotAuthor, copilotAssignee }
}
/**
* Determines the appropriate author field value based on contributor type
* @param isCopilotAuthor Whether the PR is authored by Copilot
* @param copilotAssignee The human assignee for Copilot PRs (empty string if none)
* @param firstTimeContributor Whether this is a first-time contributor
* @returns The formatted author field value
*/
function getAuthorFieldValue(
isCopilotAuthor: boolean,
copilotAssignee: string,
firstTimeContributor: boolean | undefined,
): string {
if (isCopilotAuthor) {
return copilotAssignee ? `Copilot + ${copilotAssignee}` : 'Copilot'
}
if (firstTimeContributor) {
return ':star: first time contributor'
}
return process.env.AUTHOR_LOGIN || ''
}
async function run() { async function run() {
// Get info about the docs-content review board project // Get info about the docs-content review board project
const data: Record<string, any> = await graphql( const data: Record<string, any> = await graphql(
@@ -48,6 +100,14 @@ async function run() {
path path
} }
} }
author {
login
}
assignees(first: 10) {
nodes {
login
}
}
} }
} }
} }
@@ -141,17 +201,31 @@ async function run() {
} }
} }
const turnaround = process.env.REPO === 'github/docs' ? 3 : 2 const turnaround = process.env.REPO === 'github/docs' ? 3 : 2
// Check if this is a Copilot-authored PR and get the human assignee
const { isCopilotAuthor, copilotAssignee } = getCopilotAuthorInfo(data)
// Determine the author field value
const authorFieldValue = getAuthorFieldValue(
isCopilotAuthor,
copilotAssignee,
firstTimeContributor,
)
// Generate a mutation to populate fields for the new project item // Generate a mutation to populate fields for the new project item
const updateProjectV2ItemMutation = generateUpdateProjectV2ItemFieldMutation({ const updateProjectV2ItemMutation = generateUpdateProjectV2ItemFieldMutation({
item: newItemID, item: newItemID,
author: firstTimeContributor ? ':star: first time contributor' : process.env.AUTHOR_LOGIN || '', author: authorFieldValue,
turnaround, turnaround,
feature, feature,
}) })
// Determine which variable to use for the contributor type // Determine which variable to use for the contributor type
let contributorType let contributorType
if (await isDocsTeamMember(process.env.AUTHOR_LOGIN || '')) { if (isCopilotAuthor) {
// Treat Copilot PRs as Docs team
contributorType = docsMemberTypeID
} else if (await isDocsTeamMember(process.env.AUTHOR_LOGIN || '')) {
contributorType = docsMemberTypeID contributorType = docsMemberTypeID
} else if (await isGitHubOrgMember(process.env.AUTHOR_LOGIN || '')) { } else if (await isGitHubOrgMember(process.env.AUTHOR_LOGIN || '')) {
contributorType = hubberTypeID contributorType = hubberTypeID
@@ -185,6 +259,8 @@ async function run() {
return newItemID return newItemID
} }
export { run }
run().catch((error) => { run().catch((error) => {
console.log(`#ERROR# ${error}`) console.log(`#ERROR# ${error}`)
process.exit(1) process.exit(1)