github.com/nektos/act@v0.2.63/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  }