github.com/nektos/act@v0.2.63-0.20240520024548-8acde99bfa9c/pkg/container/parse_env_file.go (about) 1 package container 2 3 import ( 4 "archive/tar" 5 "bufio" 6 "context" 7 "fmt" 8 "io" 9 "strings" 10 11 "github.com/nektos/act/pkg/common" 12 ) 13 14 func parseEnvFile(e Container, srcPath string, env *map[string]string) common.Executor { 15 localEnv := *env 16 return func(ctx context.Context) error { 17 envTar, err := e.GetContainerArchive(ctx, srcPath) 18 if err != nil { 19 return nil 20 } 21 defer envTar.Close() 22 reader := tar.NewReader(envTar) 23 _, err = reader.Next() 24 if err != nil && err != io.EOF { 25 return err 26 } 27 s := bufio.NewScanner(reader) 28 for s.Scan() { 29 line := s.Text() 30 singleLineEnv := strings.Index(line, "=") 31 multiLineEnv := strings.Index(line, "<<") 32 if singleLineEnv != -1 && (multiLineEnv == -1 || singleLineEnv < multiLineEnv) { 33 localEnv[line[:singleLineEnv]] = line[singleLineEnv+1:] 34 } else if multiLineEnv != -1 { 35 multiLineEnvContent := "" 36 multiLineEnvDelimiter := line[multiLineEnv+2:] 37 delimiterFound := false 38 for s.Scan() { 39 content := s.Text() 40 if content == multiLineEnvDelimiter { 41 delimiterFound = true 42 break 43 } 44 if multiLineEnvContent != "" { 45 multiLineEnvContent += "\n" 46 } 47 multiLineEnvContent += content 48 } 49 if !delimiterFound { 50 return fmt.Errorf("invalid format delimiter '%v' not found before end of file", multiLineEnvDelimiter) 51 } 52 localEnv[line[:multiLineEnv]] = multiLineEnvContent 53 } else { 54 return fmt.Errorf("invalid format '%v', expected a line with '=' or '<<'", line) 55 } 56 } 57 env = &localEnv 58 return nil 59 } 60 }