mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-01-09 09:05:26 +00:00
Rework status constraint logic for successes (#1515)
Since "success" and "failure" are the only two possible values, and "success" is considered to be included by default, the existing code can also be simplified a little. This has the side effect of ignoring the "exclude" part of the constraint completely. I put it in the tests just to make sure the workaround in https://github.com/woodpecker-ci/woodpecker/issues/1181#issuecomment-1347253585 continues to work as expected, but couldn't think of any legitimate use cases for it. Fixes #1181
This commit is contained in:
parent
cde1b3b95d
commit
bc87208a33
3 changed files with 33 additions and 11 deletions
|
@ -134,11 +134,10 @@ func (c *Compiler) createProcess(name string, container *yaml.Container, section
|
||||||
cpuSet = c.reslimit.CPUSet
|
cpuSet = c.reslimit.CPUSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// all constraints must exclude success.
|
// at least one constraint contain status success, or all constraints have no status set
|
||||||
onSuccess := container.When.IsEmpty() ||
|
onSuccess := container.When.IncludesStatusSuccess()
|
||||||
!container.When.ExcludesStatus("success")
|
|
||||||
// at least one constraint must include the status failure.
|
// at least one constraint must include the status failure.
|
||||||
onFailure := container.When.IncludesStatus("failure")
|
onFailure := container.When.IncludesStatusFailure()
|
||||||
|
|
||||||
failure := container.Failure
|
failure := container.Failure
|
||||||
if container.Failure == "" {
|
if container.Failure == "" {
|
||||||
|
|
|
@ -79,9 +79,9 @@ func (when *When) Match(metadata frontend.Metadata, global bool) (bool, error) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (when *When) IncludesStatus(status string) bool {
|
func (when *When) IncludesStatusFailure() bool {
|
||||||
for _, c := range when.Constraints {
|
for _, c := range when.Constraints {
|
||||||
if c.Status.Includes(status) {
|
if c.Status.Includes("failure") {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,14 +89,19 @@ func (when *When) IncludesStatus(status string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (when *When) ExcludesStatus(status string) bool {
|
func (when *When) IncludesStatusSuccess() bool {
|
||||||
|
// "success" acts differently than "failure" in that it's
|
||||||
|
// presumed to be included unless it's specifically not part
|
||||||
|
// of the list
|
||||||
|
if when.IsEmpty() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
for _, c := range when.Constraints {
|
for _, c := range when.Constraints {
|
||||||
if !c.Status.Excludes(status) {
|
if len(c.Status.Include) == 0 || c.Status.Includes("success") {
|
||||||
return false
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
return len(when.Constraints) > 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// False if (any) non local
|
// False if (any) non local
|
||||||
|
|
|
@ -381,6 +381,24 @@ func TestConstraintMap(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConstraintStatusSuccess(t *testing.T) {
|
||||||
|
testdata := []struct {
|
||||||
|
conf string
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{conf: "", want: true},
|
||||||
|
{conf: "{status: [failure]}", want: false},
|
||||||
|
{conf: "{status: [success]}", want: true},
|
||||||
|
{conf: "{status: [failure, success]}", want: true},
|
||||||
|
{conf: "{status: {exclude: [success], include: [failure]}}", want: false},
|
||||||
|
{conf: "{status: {exclude: [failure], include: [success]}}", want: true},
|
||||||
|
}
|
||||||
|
for _, test := range testdata {
|
||||||
|
c := parseConstraints(t, test.conf)
|
||||||
|
assert.Equal(t, test.want, c.IncludesStatusSuccess(), "when: '%s'", test.conf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestConstraints(t *testing.T) {
|
func TestConstraints(t *testing.T) {
|
||||||
testdata := []struct {
|
testdata := []struct {
|
||||||
desc string
|
desc string
|
||||||
|
|
Loading…
Reference in a new issue