Files
.github
.vscode
cmd
pkg
artifactcache
artifacts
common
container
testdata
DOCKER_LICENSE
container_types.go
docker_auth.go
docker_build.go
docker_cli.go
docker_cli_test.go
docker_images.go
docker_images_test.go
docker_logger.go
docker_pull.go
docker_pull_test.go
docker_run.go
docker_run_test.go
docker_stub.go
docker_volume.go
executions_environment.go
file_collector.go
file_collector_test.go
host_environment.go
host_environment_test.go
linux_container_environment_extensions.go
linux_container_environment_extensions_test.go
parse_env_file.go
util.go
util_openbsd_mips64.go
util_plan9.go
util_windows.go
exprparser
lookpath
model
runner
workflowpattern
.actrc
.editorconfig
.gitignore
.gitleaksignore
.golangci.yml
.goreleaser.yml
.markdownlint.yml
.mega-linter.yml
.mergify.yml
.prettierignore
.prettierrc.yml
CODEOWNERS
CONTRIBUTING.md
IMAGES.md
LICENSE
Makefile
README.md
VERIFICATION
VERSION
act-cli.nuspec
codecov.yml
go.mod
go.sum
install.sh
main.go
act/pkg/container/parse_env_file.go
ChristopherHX 57bf4d27a2 refactor: share UpdateFromEnv logic ()
* refactor: share UpdateFromEnv logic

* Add test for GITHUB_OUTPUT

Co-authored-by: Ben Randall <veleek@gmail.com>

* Add GITHUB_STATE test

* Add test for the old broken parser

Co-authored-by: Ben Randall <veleek@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2022-12-06 16:19:27 +00:00

61 lines
1.5 KiB
Go

package container
import (
"archive/tar"
"bufio"
"context"
"fmt"
"io"
"strings"
"github.com/nektos/act/pkg/common"
)
func parseEnvFile(e Container, srcPath string, env *map[string]string) common.Executor {
localEnv := *env
return func(ctx context.Context) error {
envTar, err := e.GetContainerArchive(ctx, srcPath)
if err != nil {
return nil
}
defer envTar.Close()
reader := tar.NewReader(envTar)
_, err = reader.Next()
if err != nil && err != io.EOF {
return err
}
s := bufio.NewScanner(reader)
for s.Scan() {
line := s.Text()
singleLineEnv := strings.Index(line, "=")
multiLineEnv := strings.Index(line, "<<")
if singleLineEnv != -1 && (multiLineEnv == -1 || singleLineEnv < multiLineEnv) {
localEnv[line[:singleLineEnv]] = line[singleLineEnv+1:]
} else if multiLineEnv != -1 {
multiLineEnvContent := ""
multiLineEnvDelimiter := line[multiLineEnv+2:]
delimiterFound := false
for s.Scan() {
content := s.Text()
if content == multiLineEnvDelimiter {
delimiterFound = true
break
}
if multiLineEnvContent != "" {
multiLineEnvContent += "\n"
}
multiLineEnvContent += content
}
if !delimiterFound {
return fmt.Errorf("invalid format delimiter '%v' not found before end of file", multiLineEnvDelimiter)
}
localEnv[line[:multiLineEnv]] = multiLineEnvContent
} else {
return fmt.Errorf("invalid format '%v', expected a line with '=' or '<<'", line)
}
}
env = &localEnv
return nil
}
}