mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 06:03:51 +03:00
Fix wrong hint when status checking is running on pull request view (#9886)
* Fix wrong hint when status checking is running on pull request view * fix lint * fix test * fix test * fix wrong tmpl * fix import * rename function name
This commit is contained in:
parent
cca13ae2ac
commit
81daf26878
9 changed files with 159 additions and 84 deletions
|
@ -11,7 +11,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -48,20 +47,20 @@ func TestPullCreate_CommitStatus(t *testing.T) {
|
||||||
|
|
||||||
commitID := path.Base(commitURL)
|
commitID := path.Base(commitURL)
|
||||||
|
|
||||||
statusList := []models.CommitStatusState{
|
statusList := []api.CommitStatusState{
|
||||||
models.CommitStatusPending,
|
api.CommitStatusPending,
|
||||||
models.CommitStatusError,
|
api.CommitStatusError,
|
||||||
models.CommitStatusFailure,
|
api.CommitStatusFailure,
|
||||||
models.CommitStatusWarning,
|
api.CommitStatusWarning,
|
||||||
models.CommitStatusSuccess,
|
api.CommitStatusSuccess,
|
||||||
}
|
}
|
||||||
|
|
||||||
statesIcons := map[models.CommitStatusState]string{
|
statesIcons := map[api.CommitStatusState]string{
|
||||||
models.CommitStatusPending: "circle icon yellow",
|
api.CommitStatusPending: "circle icon yellow",
|
||||||
models.CommitStatusSuccess: "check icon green",
|
api.CommitStatusSuccess: "check icon green",
|
||||||
models.CommitStatusError: "warning icon red",
|
api.CommitStatusError: "warning icon red",
|
||||||
models.CommitStatusFailure: "remove icon red",
|
api.CommitStatusFailure: "remove icon red",
|
||||||
models.CommitStatusWarning: "warning sign icon yellow",
|
api.CommitStatusWarning: "warning sign icon yellow",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update commit status, and check if icon is updated as well
|
// Update commit status, and check if icon is updated as well
|
||||||
|
|
|
@ -19,52 +19,19 @@ import (
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CommitStatusState holds the state of a Status
|
|
||||||
// It can be "pending", "success", "error", "failure", and "warning"
|
|
||||||
type CommitStatusState string
|
|
||||||
|
|
||||||
// IsWorseThan returns true if this State is worse than the given State
|
|
||||||
func (css CommitStatusState) IsWorseThan(css2 CommitStatusState) bool {
|
|
||||||
switch css {
|
|
||||||
case CommitStatusError:
|
|
||||||
return true
|
|
||||||
case CommitStatusFailure:
|
|
||||||
return css2 != CommitStatusError
|
|
||||||
case CommitStatusWarning:
|
|
||||||
return css2 != CommitStatusError && css2 != CommitStatusFailure
|
|
||||||
case CommitStatusSuccess:
|
|
||||||
return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning
|
|
||||||
default:
|
|
||||||
return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning && css2 != CommitStatusSuccess
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// CommitStatusPending is for when the Status is Pending
|
|
||||||
CommitStatusPending CommitStatusState = "pending"
|
|
||||||
// CommitStatusSuccess is for when the Status is Success
|
|
||||||
CommitStatusSuccess CommitStatusState = "success"
|
|
||||||
// CommitStatusError is for when the Status is Error
|
|
||||||
CommitStatusError CommitStatusState = "error"
|
|
||||||
// CommitStatusFailure is for when the Status is Failure
|
|
||||||
CommitStatusFailure CommitStatusState = "failure"
|
|
||||||
// CommitStatusWarning is for when the Status is Warning
|
|
||||||
CommitStatusWarning CommitStatusState = "warning"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CommitStatus holds a single Status of a single Commit
|
// CommitStatus holds a single Status of a single Commit
|
||||||
type CommitStatus struct {
|
type CommitStatus struct {
|
||||||
ID int64 `xorm:"pk autoincr"`
|
ID int64 `xorm:"pk autoincr"`
|
||||||
Index int64 `xorm:"INDEX UNIQUE(repo_sha_index)"`
|
Index int64 `xorm:"INDEX UNIQUE(repo_sha_index)"`
|
||||||
RepoID int64 `xorm:"INDEX UNIQUE(repo_sha_index)"`
|
RepoID int64 `xorm:"INDEX UNIQUE(repo_sha_index)"`
|
||||||
Repo *Repository `xorm:"-"`
|
Repo *Repository `xorm:"-"`
|
||||||
State CommitStatusState `xorm:"VARCHAR(7) NOT NULL"`
|
State api.CommitStatusState `xorm:"VARCHAR(7) NOT NULL"`
|
||||||
SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_sha_index)"`
|
SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_sha_index)"`
|
||||||
TargetURL string `xorm:"TEXT"`
|
TargetURL string `xorm:"TEXT"`
|
||||||
Description string `xorm:"TEXT"`
|
Description string `xorm:"TEXT"`
|
||||||
ContextHash string `xorm:"char(40) index"`
|
ContextHash string `xorm:"char(40) index"`
|
||||||
Context string `xorm:"TEXT"`
|
Context string `xorm:"TEXT"`
|
||||||
Creator *User `xorm:"-"`
|
Creator *User `xorm:"-"`
|
||||||
CreatorID int64
|
CreatorID int64
|
||||||
|
|
||||||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
|
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
|
||||||
|
@ -118,9 +85,9 @@ func (status *CommitStatus) APIFormat() *api.Status {
|
||||||
// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
|
// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
|
||||||
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
|
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
|
||||||
var lastStatus *CommitStatus
|
var lastStatus *CommitStatus
|
||||||
var state CommitStatusState
|
var state api.CommitStatusState
|
||||||
for _, status := range statuses {
|
for _, status := range statuses {
|
||||||
if status.State.IsWorseThan(state) {
|
if status.State.NoBetterThan(state) {
|
||||||
state = status.State
|
state = status.State
|
||||||
lastStatus = status
|
lastStatus = status
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ package models
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/structs"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,22 +24,22 @@ func TestGetCommitStatuses(t *testing.T) {
|
||||||
assert.Len(t, statuses, 5)
|
assert.Len(t, statuses, 5)
|
||||||
|
|
||||||
assert.Equal(t, "ci/awesomeness", statuses[0].Context)
|
assert.Equal(t, "ci/awesomeness", statuses[0].Context)
|
||||||
assert.Equal(t, CommitStatusPending, statuses[0].State)
|
assert.Equal(t, structs.CommitStatusPending, statuses[0].State)
|
||||||
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL())
|
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL())
|
||||||
|
|
||||||
assert.Equal(t, "cov/awesomeness", statuses[1].Context)
|
assert.Equal(t, "cov/awesomeness", statuses[1].Context)
|
||||||
assert.Equal(t, CommitStatusWarning, statuses[1].State)
|
assert.Equal(t, structs.CommitStatusWarning, statuses[1].State)
|
||||||
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL())
|
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL())
|
||||||
|
|
||||||
assert.Equal(t, "cov/awesomeness", statuses[2].Context)
|
assert.Equal(t, "cov/awesomeness", statuses[2].Context)
|
||||||
assert.Equal(t, CommitStatusSuccess, statuses[2].State)
|
assert.Equal(t, structs.CommitStatusSuccess, statuses[2].State)
|
||||||
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL())
|
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL())
|
||||||
|
|
||||||
assert.Equal(t, "ci/awesomeness", statuses[3].Context)
|
assert.Equal(t, "ci/awesomeness", statuses[3].Context)
|
||||||
assert.Equal(t, CommitStatusFailure, statuses[3].State)
|
assert.Equal(t, structs.CommitStatusFailure, statuses[3].State)
|
||||||
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL())
|
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL())
|
||||||
|
|
||||||
assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
|
assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
|
||||||
assert.Equal(t, CommitStatusError, statuses[4].State)
|
assert.Equal(t, structs.CommitStatusError, statuses[4].State)
|
||||||
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL())
|
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL())
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package structs // import "code.gitea.io/gitea/modules/structs"
|
package structs // import "code.gitea.io/gitea/modules/structs"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
63
modules/structs/commit_status.go
Normal file
63
modules/structs/commit_status.go
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package structs
|
||||||
|
|
||||||
|
// CommitStatusState holds the state of a Status
|
||||||
|
// It can be "pending", "success", "error", "failure", and "warning"
|
||||||
|
type CommitStatusState string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// CommitStatusPending is for when the Status is Pending
|
||||||
|
CommitStatusPending CommitStatusState = "pending"
|
||||||
|
// CommitStatusSuccess is for when the Status is Success
|
||||||
|
CommitStatusSuccess CommitStatusState = "success"
|
||||||
|
// CommitStatusError is for when the Status is Error
|
||||||
|
CommitStatusError CommitStatusState = "error"
|
||||||
|
// CommitStatusFailure is for when the Status is Failure
|
||||||
|
CommitStatusFailure CommitStatusState = "failure"
|
||||||
|
// CommitStatusWarning is for when the Status is Warning
|
||||||
|
CommitStatusWarning CommitStatusState = "warning"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NoBetterThan returns true if this State is no better than the given State
|
||||||
|
func (css CommitStatusState) NoBetterThan(css2 CommitStatusState) bool {
|
||||||
|
switch css {
|
||||||
|
case CommitStatusError:
|
||||||
|
return true
|
||||||
|
case CommitStatusFailure:
|
||||||
|
return css2 != CommitStatusError
|
||||||
|
case CommitStatusWarning:
|
||||||
|
return css2 != CommitStatusError && css2 != CommitStatusFailure
|
||||||
|
case CommitStatusPending:
|
||||||
|
return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning
|
||||||
|
default:
|
||||||
|
return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning && css2 != CommitStatusPending
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
|
@ -53,7 +53,7 @@ func NewCommitStatus(ctx *context.APIContext, form api.CreateStatusOption) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
status := &models.CommitStatus{
|
status := &models.CommitStatus{
|
||||||
State: models.CommitStatusState(form.State),
|
State: api.CommitStatusState(form.State),
|
||||||
TargetURL: form.TargetURL,
|
TargetURL: form.TargetURL,
|
||||||
Description: form.Description,
|
Description: form.Description,
|
||||||
Context: form.Context,
|
Context: form.Context,
|
||||||
|
@ -220,13 +220,13 @@ func getCommitStatuses(ctx *context.APIContext, sha string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type combinedCommitStatus struct {
|
type combinedCommitStatus struct {
|
||||||
State models.CommitStatusState `json:"state"`
|
State api.CommitStatusState `json:"state"`
|
||||||
SHA string `json:"sha"`
|
SHA string `json:"sha"`
|
||||||
TotalCount int `json:"total_count"`
|
TotalCount int `json:"total_count"`
|
||||||
Statuses []*api.Status `json:"statuses"`
|
Statuses []*api.Status `json:"statuses"`
|
||||||
Repo *api.Repository `json:"repository"`
|
Repo *api.Repository `json:"repository"`
|
||||||
CommitURL string `json:"commit_url"`
|
CommitURL string `json:"commit_url"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCombinedCommitStatusByRef returns the combined status for any given commit hash
|
// GetCombinedCommitStatusByRef returns the combined status for any given commit hash
|
||||||
|
@ -293,7 +293,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
|
||||||
retStatus.Statuses = make([]*api.Status, 0, len(statuses))
|
retStatus.Statuses = make([]*api.Status, 0, len(statuses))
|
||||||
for _, status := range statuses {
|
for _, status := range statuses {
|
||||||
retStatus.Statuses = append(retStatus.Statuses, status.APIFormat())
|
retStatus.Statuses = append(retStatus.Statuses, status.APIFormat())
|
||||||
if status.State.IsWorseThan(retStatus.State) {
|
if status.State.NoBetterThan(retStatus.State) {
|
||||||
retStatus.State = status.State
|
retStatus.State = status.State
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -417,7 +417,9 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
ctx.Data["IsRequiredStatusCheckSuccess"] = pull_service.IsCommitStatusContextSuccess(commitStatuses, pull.ProtectedBranch.StatusCheckContexts)
|
state := pull_service.MergeRequiredContextsCommitStatus(commitStatuses, pull.ProtectedBranch.StatusCheckContexts)
|
||||||
|
ctx.Data["RequiredStatusCheckState"] = state
|
||||||
|
ctx.Data["IsRequiredStatusCheckSuccess"] = state.IsSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Data["HeadBranchMovedOn"] = headBranchSha != sha
|
ctx.Data["HeadBranchMovedOn"] = headBranchSha != sha
|
||||||
|
|
|
@ -8,15 +8,47 @@ package pull
|
||||||
import (
|
import (
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
"code.gitea.io/gitea/modules/structs"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MergeRequiredContextsCommitStatus returns a commit status state for given required contexts
|
||||||
|
func MergeRequiredContextsCommitStatus(commitStatuses []*models.CommitStatus, requiredContexts []string) structs.CommitStatusState {
|
||||||
|
if len(requiredContexts) == 0 {
|
||||||
|
status := models.CalcCommitStatus(commitStatuses)
|
||||||
|
if status != nil {
|
||||||
|
return status.State
|
||||||
|
}
|
||||||
|
return structs.CommitStatusSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
var returnedStatus = structs.CommitStatusPending
|
||||||
|
for _, ctx := range requiredContexts {
|
||||||
|
var targetStatus structs.CommitStatusState
|
||||||
|
for _, commitStatus := range commitStatuses {
|
||||||
|
if commitStatus.Context == ctx {
|
||||||
|
targetStatus = commitStatus.State
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetStatus == "" {
|
||||||
|
targetStatus = structs.CommitStatusPending
|
||||||
|
}
|
||||||
|
if targetStatus.NoBetterThan(returnedStatus) {
|
||||||
|
returnedStatus = targetStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnedStatus
|
||||||
|
}
|
||||||
|
|
||||||
// IsCommitStatusContextSuccess returns true if all required status check contexts succeed.
|
// IsCommitStatusContextSuccess returns true if all required status check contexts succeed.
|
||||||
func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, requiredContexts []string) bool {
|
func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, requiredContexts []string) bool {
|
||||||
// If no specific context is required, require that last commit status is a success
|
// If no specific context is required, require that last commit status is a success
|
||||||
if len(requiredContexts) == 0 {
|
if len(requiredContexts) == 0 {
|
||||||
status := models.CalcCommitStatus(commitStatuses)
|
status := models.CalcCommitStatus(commitStatuses)
|
||||||
if status == nil || status.State != models.CommitStatusSuccess {
|
if status == nil || status.State != structs.CommitStatusSuccess {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
@ -26,7 +58,7 @@ func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, require
|
||||||
var found bool
|
var found bool
|
||||||
for _, commitStatus := range commitStatuses {
|
for _, commitStatus := range commitStatuses {
|
||||||
if commitStatus.Context == ctx {
|
if commitStatus.Context == ctx {
|
||||||
if commitStatus.State != models.CommitStatusSuccess {
|
if commitStatus.State != structs.CommitStatusSuccess {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,30 +82,39 @@ func IsPullCommitStatusPass(pr *models.PullRequest) (bool, error) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state, err := GetPullRequestCommitStatusState(pr)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return state.IsSuccess(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPullRequestCommitStatusState returns pull request merged commit status state
|
||||||
|
func GetPullRequestCommitStatusState(pr *models.PullRequest) (structs.CommitStatusState, error) {
|
||||||
// check if all required status checks are successful
|
// check if all required status checks are successful
|
||||||
headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
|
headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrap(err, "OpenRepository")
|
return "", errors.Wrap(err, "OpenRepository")
|
||||||
}
|
}
|
||||||
defer headGitRepo.Close()
|
defer headGitRepo.Close()
|
||||||
|
|
||||||
if !headGitRepo.IsBranchExist(pr.HeadBranch) {
|
if !headGitRepo.IsBranchExist(pr.HeadBranch) {
|
||||||
return false, errors.New("Head branch does not exist, can not merge")
|
return "", errors.New("Head branch does not exist, can not merge")
|
||||||
}
|
}
|
||||||
|
|
||||||
sha, err := headGitRepo.GetBranchCommitID(pr.HeadBranch)
|
sha, err := headGitRepo.GetBranchCommitID(pr.HeadBranch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrap(err, "GetBranchCommitID")
|
return "", errors.Wrap(err, "GetBranchCommitID")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := pr.LoadBaseRepo(); err != nil {
|
if err := pr.LoadBaseRepo(); err != nil {
|
||||||
return false, errors.Wrap(err, "LoadBaseRepo")
|
return "", errors.Wrap(err, "LoadBaseRepo")
|
||||||
}
|
}
|
||||||
|
|
||||||
commitStatuses, err := models.GetLatestCommitStatus(pr.BaseRepo, sha, 0)
|
commitStatuses, err := models.GetLatestCommitStatus(pr.BaseRepo, sha, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrap(err, "GetLatestCommitStatus")
|
return "", errors.Wrap(err, "GetLatestCommitStatus")
|
||||||
}
|
}
|
||||||
|
|
||||||
return IsCommitStatusContextSuccess(commitStatuses, pr.ProtectedBranch.StatusCheckContexts), nil
|
return MergeRequiredContextsCommitStatus(commitStatuses, pr.ProtectedBranch.StatusCheckContexts), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,8 @@
|
||||||
{{else if .IsPullRequestBroken}}red
|
{{else if .IsPullRequestBroken}}red
|
||||||
{{else if .IsBlockedByApprovals}}red
|
{{else if .IsBlockedByApprovals}}red
|
||||||
{{else if .IsBlockedByRejection}}red
|
{{else if .IsBlockedByRejection}}red
|
||||||
{{else if and .EnableStatusCheck (not .IsRequiredStatusCheckSuccess)}}red
|
{{else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsFailure .RequiredStatusCheckState.IsError)}}red
|
||||||
|
{{else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsPending .RequiredStatusCheckState.IsWarning)}}yellow
|
||||||
{{else if and .RequireSigned (not .WillSign)}}}red
|
{{else if and .RequireSigned (not .WillSign)}}}red
|
||||||
{{else if .Issue.PullRequest.IsChecking}}yellow
|
{{else if .Issue.PullRequest.IsChecking}}yellow
|
||||||
{{else if .Issue.PullRequest.CanAutoMerge}}green
|
{{else if .Issue.PullRequest.CanAutoMerge}}green
|
||||||
|
@ -118,7 +119,7 @@
|
||||||
<i class="icon icon-octicon"><span class="octicon octicon-x"></span></i>
|
<i class="icon icon-octicon"><span class="octicon octicon-x"></span></i>
|
||||||
{{$.i18n.Tr "repo.pulls.blocked_by_rejection"}}
|
{{$.i18n.Tr "repo.pulls.blocked_by_rejection"}}
|
||||||
</div>
|
</div>
|
||||||
{{else if and .EnableStatusCheck (not .IsRequiredStatusCheckSuccess)}}
|
{{else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsError .RequiredStatusCheckState.IsFailure)}}
|
||||||
<div class="item text red">
|
<div class="item text red">
|
||||||
<i class="icon icon-octicon"><span class="octicon octicon-x"></span></i>
|
<i class="icon icon-octicon"><span class="octicon octicon-x"></span></i>
|
||||||
{{$.i18n.Tr "repo.pulls.required_status_check_failed"}}
|
{{$.i18n.Tr "repo.pulls.required_status_check_failed"}}
|
||||||
|
|
Loading…
Reference in a new issue