55 lines
2.0 KiB
TypeScript
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))
|
|
}
|