aboutsummaryrefslogtreecommitdiffstats
path: root/modules/commitstatus/commit_status.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/commitstatus/commit_status.go')
-rw-r--r--modules/commitstatus/commit_status.go81
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
+}