orca/src/shared/github-pr-auto-merge-availa...

55 lines
2.0 KiB
TypeScript

import type { PRMergeableState, PRReviewDecision, PRState } from './types'
export type GitHubPRAutoMergeAvailabilityInput = {
state: PRState | 'open' | 'closed' | 'merged' | 'draft'
mergeable?: PRMergeableState
mergeStateStatus?: string | null
reviewDecision?: PRReviewDecision | null
autoMergeEnabled?: boolean
autoMergeAllowed?: boolean | null
mergeQueueRequired?: boolean | null
}
function isOpenPR(item: GitHubPRAutoMergeAvailabilityInput): boolean {
return item.state === 'open'
}
function isConflicting(item: GitHubPRAutoMergeAvailabilityInput): boolean {
return item.mergeable === 'CONFLICTING' || item.mergeStateStatus === 'DIRTY'
}
function hasReviewRequirement(item: GitHubPRAutoMergeAvailabilityInput): boolean {
return item.reviewDecision === 'REVIEW_REQUIRED' || item.reviewDecision === 'CHANGES_REQUESTED'
}
function canMergeImmediately(item: GitHubPRAutoMergeAvailabilityInput): boolean {
if (item.mergeStateStatus === 'BLOCKED' || item.mergeStateStatus === 'BEHIND') {
return false
}
return item.mergeable === 'MERGEABLE' || item.mergeStateStatus === 'CLEAN'
}
function canRequestWhenReady(item: GitHubPRAutoMergeAvailabilityInput): boolean {
if (!isOpenPR(item) || isConflicting(item)) {
return false
}
if (item.mergeQueueRequired === true) {
return true
}
return (
item.autoMergeAllowed !== false && (hasReviewRequirement(item) || !canMergeImmediately(item))
)
}
export function canEnableGitHubPRAutoMerge(item: GitHubPRAutoMergeAvailabilityInput): boolean {
return (
item.autoMergeEnabled !== true && item.mergeQueueRequired !== true && canRequestWhenReady(item)
)
}
export function canShowGitHubPRAutoMergeControl(item: GitHubPRAutoMergeAvailabilityInput): boolean {
// Why: GitHub auto-merge waits for branch requirements, not arbitrary optional CI.
// Keep already-enabled PRs visible so users can disable the setting.
return isOpenPR(item) && (item.autoMergeEnabled === true || canRequestWhenReady(item))
}