92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
|
package runner
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/nektos/act/pkg/common"
|
||
|
)
|
||
|
|
||
|
var commandPattern *regexp.Regexp
|
||
|
|
||
|
func init() {
|
||
|
commandPattern = regexp.MustCompile("^::([^ ]+)( (.+))?::([^\r\n]*)[\r\n]+$")
|
||
|
}
|
||
|
|
||
|
func (rc *RunContext) commandHandler(ctx context.Context) common.LineHandler {
|
||
|
logger := common.Logger(ctx)
|
||
|
resumeCommand := ""
|
||
|
return func(line string) {
|
||
|
if m := commandPattern.FindStringSubmatch(line); m != nil {
|
||
|
command := m[1]
|
||
|
kvPairs := parseKeyValuePairs(m[3])
|
||
|
arg := m[4]
|
||
|
|
||
|
if resumeCommand != "" && command != resumeCommand {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
switch command {
|
||
|
case "set-env":
|
||
|
rc.setEnv(ctx, kvPairs, arg)
|
||
|
case "set-output":
|
||
|
rc.setOutput(ctx, kvPairs, arg)
|
||
|
case "add-path":
|
||
|
rc.addPath(ctx, arg)
|
||
|
case "debug":
|
||
|
logger.Infof(" \U0001F4AC %s", line)
|
||
|
case "warning":
|
||
|
logger.Infof(" \U0001F6A7 %s", line)
|
||
|
case "error":
|
||
|
logger.Infof(" \U00002757 %s", line)
|
||
|
case "add-mask":
|
||
|
logger.Infof(" \U00002699 %s", line)
|
||
|
case "stop-commands":
|
||
|
resumeCommand = arg
|
||
|
logger.Infof(" \U00002699 %s", line)
|
||
|
case resumeCommand:
|
||
|
resumeCommand = ""
|
||
|
logger.Infof(" \U00002699 %s", line)
|
||
|
default:
|
||
|
logger.Infof(" \U00002753 %s", line)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (rc *RunContext) setEnv(ctx context.Context, kvPairs map[string]string, arg string) {
|
||
|
common.Logger(ctx).Infof(" \U00002699 ::set-env:: %s=%s", kvPairs["name"], arg)
|
||
|
if rc.Env == nil {
|
||
|
rc.Env = make(map[string]string)
|
||
|
}
|
||
|
rc.Env[kvPairs["name"]] = arg
|
||
|
}
|
||
|
func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string, arg string) {
|
||
|
common.Logger(ctx).Infof(" \U00002699 ::set-output:: %s=%s", kvPairs["name"], arg)
|
||
|
if rc.Outputs == nil {
|
||
|
rc.Outputs = make(map[string]string)
|
||
|
}
|
||
|
rc.Outputs[kvPairs["name"]] = arg
|
||
|
}
|
||
|
func (rc *RunContext) addPath(ctx context.Context, arg string) {
|
||
|
common.Logger(ctx).Infof(" \U00002699 ::add-path:: %s", arg)
|
||
|
if rc.Env == nil {
|
||
|
rc.Env = make(map[string]string)
|
||
|
}
|
||
|
rc.Env["PATH"] = fmt.Sprintf("%s:%s", arg, rc.Env["PATH"])
|
||
|
}
|
||
|
|
||
|
func parseKeyValuePairs(kvPairs string) map[string]string {
|
||
|
rtn := make(map[string]string)
|
||
|
kvPairList := strings.Split(kvPairs, ",")
|
||
|
for _, kvPair := range kvPairList {
|
||
|
kv := strings.Split(kvPair, "=")
|
||
|
if len(kv) == 2 {
|
||
|
rtn[kv[0]] = kv[1]
|
||
|
}
|
||
|
}
|
||
|
return rtn
|
||
|
}
|