| | |
| | import { graphql } from '@octokit/graphql' |
| |
|
| | import { |
| | addItemToProject, |
| | isDocsTeamMember, |
| | isGitHubOrgMember, |
| | findFieldID, |
| | findSingleSelectID, |
| | generateUpdateProjectV2ItemFieldMutation, |
| | getFeature, |
| | getSize, |
| | } from './projects' |
| |
|
| | |
| | |
| | |
| | |
| | |
| | function getCopilotAuthorInfo(data: Record<string, any>): { |
| | isCopilotAuthor: boolean |
| | copilotAssignee: string |
| | } { |
| | |
| | const isCopilotAuthor = |
| | data.item.__typename === 'PullRequest' && |
| | data.item.author && |
| | data.item.author.login === 'copilot-swe-agent' |
| |
|
| | |
| | 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') |
| |
|
| | |
| | copilotAssignee = assignees.length > 0 ? assignees[0] : '' |
| | } |
| |
|
| | return { isCopilotAuthor, copilotAssignee } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | 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() { |
| | |
| | const data: Record<string, any> = await graphql( |
| | ` |
| | query ($organization: String!, $projectNumber: Int!, $id: ID!) { |
| | organization(login: $organization) { |
| | projectV2(number: $projectNumber) { |
| | id |
| | fields(first: 100) { |
| | nodes { |
| | ... on ProjectV2Field { |
| | id |
| | name |
| | } |
| | ... on ProjectV2SingleSelectField { |
| | id |
| | name |
| | options { |
| | id |
| | name |
| | } |
| | } |
| | } |
| | } |
| | } |
| | } |
| | item: node(id: $id) { |
| | __typename |
| | ... on PullRequest { |
| | files(first: 100) { |
| | nodes { |
| | additions |
| | deletions |
| | path |
| | } |
| | } |
| | author { |
| | login |
| | } |
| | assignees(first: 10) { |
| | nodes { |
| | login |
| | } |
| | } |
| | } |
| | } |
| | } |
| | `, |
| | { |
| | id: process.env.ITEM_NODE_ID, |
| | organization: process.env.ORGANIZATION, |
| | projectNumber: parseInt(process.env.PROJECT_NUMBER || ''), |
| | headers: { |
| | authorization: `token ${process.env.TOKEN}`, |
| | }, |
| | }, |
| | ) |
| |
|
| | |
| | const projectID = data.organization.projectV2.id |
| |
|
| | |
| | const datePostedID = findFieldID('Date posted', data) |
| | const reviewDueDateID = findFieldID('Review due date', data) |
| | const statusID = findFieldID('Status', data) |
| | const featureID = findFieldID('Feature', data) |
| | const contributorTypeID = findFieldID('Contributor type', data) |
| | const sizeTypeID = findFieldID('Size', data) |
| | const authorID = findFieldID('Contributor', data) |
| |
|
| | |
| | const readyForReviewID = findSingleSelectID('Ready for review', 'Status', data) |
| | const hubberTypeID = findSingleSelectID('Hubber or partner', 'Contributor type', data) |
| | const docsMemberTypeID = findSingleSelectID('Docs team', 'Contributor type', data) |
| | const osContributorTypeID = findSingleSelectID('OS contributor', 'Contributor type', data) |
| |
|
| | |
| | const newItemID = await addItemToProject(process.env.ITEM_NODE_ID || '', projectID) |
| |
|
| | |
| | const feature = getFeature(data) |
| | const size = getSize(data) |
| | const sizeType = findSingleSelectID(size, 'Size', data) |
| |
|
| | |
| | |
| | let firstTimeContributor |
| | if (process.env.REPO === 'github/docs') { |
| | const contributorData: Record<string, any> = await graphql( |
| | ` |
| | query ($author: String!) { |
| | user(login: $author) { |
| | contributionsCollection { |
| | pullRequestContributionsByRepository { |
| | contributions { |
| | totalCount |
| | } |
| | repository { |
| | nameWithOwner |
| | } |
| | } |
| | issueContributionsByRepository { |
| | contributions { |
| | totalCount |
| | } |
| | repository { |
| | nameWithOwner |
| | } |
| | } |
| | } |
| | } |
| | } |
| | `, |
| | { |
| | author: process.env.AUTHOR_LOGIN, |
| | headers: { |
| | authorization: `token ${process.env.TOKEN}`, |
| | }, |
| | }, |
| | ) |
| | const docsPRData = |
| | contributorData.user.contributionsCollection.pullRequestContributionsByRepository.filter( |
| | (item: Record<string, any>) => item.repository.nameWithOwner === 'github/docs', |
| | )[0] |
| | const prCount = docsPRData ? docsPRData.contributions.totalCount : 0 |
| |
|
| | const docsIssueData = |
| | contributorData.user.contributionsCollection.issueContributionsByRepository.filter( |
| | (item: Record<string, any>) => item.repository.nameWithOwner === 'github/docs', |
| | )[0] |
| | const issueCount = docsIssueData ? docsIssueData.contributions.totalCount : 0 |
| |
|
| | if (prCount + issueCount <= 1) { |
| | firstTimeContributor = true |
| | } |
| | } |
| | const turnaround = process.env.REPO === 'github/docs' ? 3 : 2 |
| |
|
| | |
| | const { isCopilotAuthor, copilotAssignee } = getCopilotAuthorInfo(data) |
| |
|
| | |
| | const authorFieldValue = getAuthorFieldValue( |
| | isCopilotAuthor, |
| | copilotAssignee, |
| | firstTimeContributor, |
| | ) |
| |
|
| | |
| | const updateProjectV2ItemMutation = generateUpdateProjectV2ItemFieldMutation({ |
| | item: newItemID, |
| | author: authorFieldValue, |
| | turnaround, |
| | feature, |
| | }) |
| |
|
| | |
| | let contributorType |
| | if (isCopilotAuthor) { |
| | |
| | contributorType = docsMemberTypeID |
| | } else if (await isDocsTeamMember(process.env.AUTHOR_LOGIN || '')) { |
| | contributorType = docsMemberTypeID |
| | } else if (await isGitHubOrgMember(process.env.AUTHOR_LOGIN || '')) { |
| | contributorType = hubberTypeID |
| | } else if (process.env.REPO === 'github/docs') { |
| | contributorType = osContributorTypeID |
| | } else { |
| | |
| | contributorType = hubberTypeID |
| | } |
| |
|
| | console.log(`Populating fields for item: ${newItemID}`) |
| |
|
| | await graphql(updateProjectV2ItemMutation, { |
| | project: projectID, |
| | statusID, |
| | statusValueID: readyForReviewID, |
| | datePostedID, |
| | reviewDueDateID, |
| | contributorTypeID, |
| | contributorType, |
| | sizeTypeID, |
| | sizeType, |
| | featureID, |
| | authorID, |
| | headers: { |
| | authorization: `token ${process.env.TOKEN}`, |
| | }, |
| | }) |
| | console.log('Done populating fields for item') |
| |
|
| | return newItemID |
| | } |
| |
|
| | export { run } |
| |
|
| | try { |
| | await run() |
| | } catch (error) { |
| | console.log(`#ERROR# ${error}`) |
| | process.exit(1) |
| | } |
| |
|