mirror of
https://github.com/go-task/task.git
synced 2025-05-13 22:16:31 +02:00
92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
package experiments
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
"github.com/go-task/task/v3/taskrc"
|
|
)
|
|
|
|
const envPrefix = "TASK_X_"
|
|
|
|
// Active experiments.
|
|
var (
|
|
GentleForce Experiment
|
|
RemoteTaskfiles Experiment
|
|
EnvPrecedence Experiment
|
|
)
|
|
|
|
// Inactive experiments. These are experiments that cannot be enabled, but are
|
|
// preserved for error handling.
|
|
var (
|
|
AnyVariables Experiment
|
|
MapVariables Experiment
|
|
)
|
|
|
|
// An internal list of all the initialized experiments used for iterating.
|
|
var xList []Experiment
|
|
|
|
func Parse(dir string) {
|
|
// Read any .env files
|
|
readDotEnv(dir)
|
|
|
|
// Create a node for the Task config reader
|
|
node, _ := taskrc.NewNode("", dir)
|
|
|
|
// Read the Task config file
|
|
reader := taskrc.NewReader()
|
|
config, _ := reader.Read(node)
|
|
|
|
// Initialize the experiments
|
|
GentleForce = New("GENTLE_FORCE", config, 1)
|
|
RemoteTaskfiles = New("REMOTE_TASKFILES", config, 1)
|
|
EnvPrecedence = New("ENV_PRECEDENCE", config, 1)
|
|
AnyVariables = New("ANY_VARIABLES", config)
|
|
MapVariables = New("MAP_VARIABLES", config)
|
|
}
|
|
|
|
// Validate checks if any experiments have been enabled while being inactive.
|
|
// If one is found, the function returns an error.
|
|
func Validate() error {
|
|
for _, x := range List() {
|
|
if err := x.Valid(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func List() []Experiment {
|
|
return xList
|
|
}
|
|
|
|
func getEnv(xName string) string {
|
|
envName := fmt.Sprintf("%s%s", envPrefix, xName)
|
|
return os.Getenv(envName)
|
|
}
|
|
|
|
func getFilePath(filename, dir string) string {
|
|
if dir != "" {
|
|
return filepath.Join(dir, filename)
|
|
}
|
|
return filename
|
|
}
|
|
|
|
func readDotEnv(dir string) {
|
|
env, err := godotenv.Read(getFilePath(".env", dir))
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// If the env var is an experiment, set it.
|
|
for key, value := range env {
|
|
if strings.HasPrefix(key, envPrefix) {
|
|
os.Setenv(key, value)
|
|
}
|
|
}
|
|
}
|