| 2989 | } |
| 2990 | |
| 2991 | func taskStatusFromPolicySnapshot( |
| 2992 | currentStatus Status, |
| 2993 | unresolvedDependencies bool, |
| 2994 | approvalBlocked bool, |
| 2995 | pausedBlocked bool, |
| 2996 | openBlocks bool, |
| 2997 | needsAttention bool, |
| 2998 | attemptsExhausted bool, |
| 2999 | runs []Run, |
| 3000 | ) Status { |
| 3001 | status := currentStatus.Normalize() |
| 3002 | if status == TaskStatusCanceled || status == TaskStatusDraft { |
| 3003 | return status |
| 3004 | } |
| 3005 | |
| 3006 | runnableBlocked := unresolvedDependencies || approvalBlocked || pausedBlocked || openBlocks |
| 3007 | runState := taskRunPolicyState(runs) |
| 3008 | if runState.hasActive { |
| 3009 | return TaskStatusInProgress |
| 3010 | } |
| 3011 | if runState.hasLatestTerminal && !runState.hasQueuedOrClaimed { |
| 3012 | if terminalStatus, ok := taskStatusFromTerminalRun(runState.latestTerminal, attemptsExhausted); ok { |
| 3013 | return terminalStatus |
| 3014 | } |
| 3015 | } |
| 3016 | |
| 3017 | if isTerminalTaskStatus(status) && !runState.hasQueuedOrClaimed { |
| 3018 | return status |
| 3019 | } |
| 3020 | if needsAttention { |
| 3021 | return TaskStatusNeedsAttention |
| 3022 | } |
| 3023 | if runState.hasQueuedOrClaimed { |
| 3024 | if runnableBlocked { |
| 3025 | return TaskStatusBlocked |
| 3026 | } |
| 3027 | return TaskStatusReady |
| 3028 | } |
| 3029 | if runnableBlocked { |
| 3030 | return TaskStatusBlocked |
| 3031 | } |
| 3032 | return TaskStatusReady |
| 3033 | } |
| 3034 | |
| 3035 | type taskRunPolicySnapshot struct { |
| 3036 | hasActive bool |