diff options
Diffstat (limited to 'modules/commitstatus/commit_status.go')
-rw-r--r-- | modules/commitstatus/commit_status.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/modules/commitstatus/commit_status.go b/modules/commitstatus/commit_status.go new file mode 100644 index 0000000000..12004474ed --- /dev/null +++ b/modules/commitstatus/commit_status.go @@ -0,0 +1,81 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package commitstatus + +// CommitStatusState holds the state of a CommitStatus +// swagger:enum CommitStatusState +type CommitStatusState string //nolint + +const ( + // CommitStatusPending is for when the CommitStatus is Pending + CommitStatusPending CommitStatusState = "pending" + // CommitStatusSuccess is for when the CommitStatus is Success + CommitStatusSuccess CommitStatusState = "success" + // CommitStatusError is for when the CommitStatus is Error + CommitStatusError CommitStatusState = "error" + // CommitStatusFailure is for when the CommitStatus is Failure + CommitStatusFailure CommitStatusState = "failure" + // CommitStatusWarning is for when the CommitStatus is Warning + CommitStatusWarning CommitStatusState = "warning" + // CommitStatusSkipped is for when CommitStatus is Skipped + CommitStatusSkipped CommitStatusState = "skipped" +) + +func (css CommitStatusState) String() string { + return string(css) +} + +// IsPending represents if commit status state is pending +func (css CommitStatusState) IsPending() bool { + return css == CommitStatusPending +} + +// IsSuccess represents if commit status state is success +func (css CommitStatusState) IsSuccess() bool { + return css == CommitStatusSuccess +} + +// IsError represents if commit status state is error +func (css CommitStatusState) IsError() bool { + return css == CommitStatusError +} + +// IsFailure represents if commit status state is failure +func (css CommitStatusState) IsFailure() bool { + return css == CommitStatusFailure +} + +// IsWarning represents if commit status state is warning +func (css CommitStatusState) IsWarning() bool { + return css == CommitStatusWarning +} + +// IsSkipped represents if commit status state is skipped +func (css CommitStatusState) IsSkipped() bool { + return css == CommitStatusSkipped +} + +type CommitStatusStates []CommitStatusState //nolint + +// According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference +// > Additionally, a combined state is returned. The state is one of: +// > failure if any of the contexts report as error or failure +// > pending if there are no statuses or a context is pending +// > success if the latest status for all contexts is success +func (css CommitStatusStates) Combine() CommitStatusState { + successCnt := 0 + for _, state := range css { + switch { + case state.IsError() || state.IsFailure(): + return CommitStatusFailure + case state.IsPending(): + case state.IsSuccess() || state.IsWarning() || state.IsSkipped(): + successCnt++ + } + } + if successCnt > 0 && successCnt == len(css) { + return CommitStatusSuccess + } + return CommitStatusPending +} |