github.com/quickfeed/quickfeed@v0.0.0-20240507093252-ed8ca812a09c/internal/env/load.go (about)

     1  package env
     2  
     3  import (
     4  	"bufio"
     5  	"log"
     6  	"os"
     7  	"strings"
     8  )
     9  
    10  // Load loads environment variables from the given file, or from $QUICKFEED/.env.
    11  // The variable's values are expanded with existing variables from the environment.
    12  // It will not override a variable that already exists in the environment.
    13  func Load(filename string) error {
    14  	file, err := os.Open(filename)
    15  	if err != nil {
    16  		return err
    17  	}
    18  	defer file.Close() // skipcq: GO-S2307
    19  
    20  	log.Printf("Loading environment variables from %s", filename)
    21  
    22  	scanner := bufio.NewScanner(file)
    23  	for scanner.Scan() {
    24  		line := scanner.Text()
    25  		if ignore(line) {
    26  			continue
    27  		}
    28  		key, val, found := strings.Cut(line, "=")
    29  		if !found {
    30  			continue
    31  		}
    32  		k := strings.TrimSpace(key)
    33  		if os.Getenv(k) != "" {
    34  			// Ignore .env entries already set in the environment.
    35  			continue
    36  		}
    37  		val = os.ExpandEnv(strings.Trim(strings.TrimSpace(val), `"`))
    38  		os.Setenv(k, val)
    39  	}
    40  
    41  	return scanner.Err()
    42  }
    43  
    44  func ignore(line string) bool {
    45  	trimmedLine := strings.TrimSpace(line)
    46  	return trimmedLine == "" || strings.HasPrefix(trimmedLine, "#")
    47  }