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 }