Correct label argument parsing in agent code (#1717)

close  #1704
This commit is contained in:
6543 2023-04-28 20:41:05 +02:00 committed by GitHub
parent 5833236b84
commit 2dd1b4f777
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 96 additions and 3 deletions

View file

@ -19,6 +19,7 @@ import (
"context" "context"
"crypto/tls" "crypto/tls"
"errors" "errors"
"fmt"
"net/http" "net/http"
"os" "os"
"runtime" "runtime"
@ -182,9 +183,8 @@ func loop(c *cli.Context) error {
"repo": "*", // allow all repos by default "repo": "*", // allow all repos by default
} }
for _, v := range c.StringSlice("filter") { if err := stringSliceAddToMap(c.StringSlice("filter"), labels); err != nil {
parts := strings.SplitN(v, "=", 2) return err
labels[parts[0]] = parts[1]
} }
filter := rpc.Filter{ filter := rpc.Filter{
@ -245,3 +245,21 @@ func loop(c *cli.Context) error {
wg.Wait() wg.Wait()
return nil return nil
} }
func stringSliceAddToMap(sl []string, m map[string]string) error {
if m == nil {
m = make(map[string]string)
}
for _, v := range sl {
parts := strings.SplitN(v, "=", 2)
switch len(parts) {
case 2:
m[parts[0]] = parts[1]
case 1:
return fmt.Errorf("key '%s' does not have a value assigned", parts[0])
default:
return fmt.Errorf("empty string in slice")
}
}
return nil
}

75
cmd/agent/agent_test.go Normal file
View file

@ -0,0 +1,75 @@
// Copyright 2023 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestStringSliceAddToMap(t *testing.T) {
tests := []struct {
name string
sl []string
m map[string]string
expected map[string]string
err bool
}{
{
name: "add values to map",
sl: []string{"foo=bar", "baz=qux=nux"},
m: make(map[string]string),
expected: map[string]string{
"foo": "bar",
"baz": "qux=nux",
},
err: false,
},
{
name: "empty slice",
sl: []string{},
m: make(map[string]string),
expected: map[string]string{},
err: false,
},
{
name: "missing value",
sl: []string{"foo", "baz=qux"},
m: make(map[string]string),
expected: map[string]string{},
err: true,
},
{
name: "empty string in slice",
sl: []string{"foo=bar", "", "baz=qux"},
m: make(map[string]string),
expected: map[string]string{},
err: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := stringSliceAddToMap(tt.sl, tt.m)
if tt.err {
assert.Error(t, err)
} else {
assert.EqualValues(t, tt.expected, tt.m)
}
})
}
}