diff --git a/pkg/os/process/process_environment/process_environment.go b/pkg/os/process/process_environment/process_environment.go new file mode 100644 index 0000000..e1e2021 --- /dev/null +++ b/pkg/os/process/process_environment/process_environment.go @@ -0,0 +1,82 @@ +package process_environment + +import ( + "log" + "os" + "os/exec" + "slices" + "strings" + + "git.tswf.io/incredible-go/incredible-go-core/pkg/collections/array_list" +) + +var PathEnvironmentVariableName = "PATH" + +func AppendPath(cmd *exec.Cmd, newElements ...string) { + pathEntries := GetPath(cmd) + for _, newPathEntry := range newElements { + if !pathEntries.Contains(newPathEntry) { + pathEntries.Add(newPathEntry) + } + } + + SetPath(cmd, pathEntries.ToSliceUnsafe()...) +} + +func SetPath(cmd *exec.Cmd, entries ...string) { + pathEntries := GetPath(cmd) + for _, entry := range entries { + if !pathEntries.Contains(entry) { + pathEntries.Add(entry) + } + } + + newPathEnvValue := strings.Join(pathEntries.ToSliceUnsafe(), string(os.PathListSeparator)) + SetEnvironmentVariable(cmd, PathEnvironmentVariableName, newPathEnvValue) +} + +func GetPath(cmd *exec.Cmd) *array_list.ArrayList[string] { + oldPathEnvValue := GetEnvironmentVariable(cmd, PathEnvironmentVariableName) + pathListSeparatorString := string(os.PathListSeparator) + + oldPathEnvEntries := array_list.NewArrayListWithContent(strings.Split(oldPathEnvValue, pathListSeparatorString)...) + + oldPathEnvEntries.RemoveIf(func(s string) bool { + return s == "" + }) + + return oldPathEnvEntries +} + +func SetEnvironmentVariable(cmd *exec.Cmd, envName string, envValue string) *exec.Cmd { + envPrefix := getEnvironmentVariablePrefix(envName) + cmd.Env = slices.DeleteFunc(cmd.Env, func(s string) bool { + return strings.HasPrefix(strings.ToLower(s), envPrefix) + }) + + cmd.Env = append(cmd.Env, envPrefix+envValue) + + return cmd +} + +func GetEnvironmentVariable(cmd *exec.Cmd, envName string) string { + envPrefix := getEnvironmentVariablePrefix(envName) + for _, env := range cmd.Env { + if strings.HasPrefix(strings.ToLower(env), envPrefix) { + split := strings.SplitN(env, "=", 2) + if len(split) < 2 { + log.Printf("%v is not valid split for env '%s'", cmd.Env, env) + } + } + } + + return "" +} + +func IsEnvironmentVariablePresent(cmd *exec.Cmd, envName string) bool { + return GetEnvironmentVariable(cmd, envName) != "" +} + +func getEnvironmentVariablePrefix(envName string) string { + return strings.ToLower(envName + "=") +}