summaryrefslogtreecommitdiffstats
path: root/pkg/container/linux_container_environment_extensions.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/container/linux_container_environment_extensions.go')
-rw-r--r--pkg/container/linux_container_environment_extensions.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/pkg/container/linux_container_environment_extensions.go b/pkg/container/linux_container_environment_extensions.go
new file mode 100644
index 0000000..54f1920
--- /dev/null
+++ b/pkg/container/linux_container_environment_extensions.go
@@ -0,0 +1,88 @@
+package container
+
+import (
+ "context"
+ "path/filepath"
+ "regexp"
+ "runtime"
+ "strings"
+
+ log "github.com/sirupsen/logrus"
+)
+
+type LinuxContainerEnvironmentExtensions struct{}
+
+// Resolves the equivalent host path inside the container
+// This is required for windows and WSL 2 to translate things like C:\Users\Myproject to /mnt/users/Myproject
+// For use in docker volumes and binds
+func (*LinuxContainerEnvironmentExtensions) ToContainerPath(path string) string {
+ if runtime.GOOS == "windows" && strings.Contains(path, "/") {
+ log.Error("You cannot specify linux style local paths (/mnt/etc) on Windows as it does not understand them.")
+ return ""
+ }
+
+ abspath, err := filepath.Abs(path)
+ if err != nil {
+ log.Error(err)
+ return ""
+ }
+
+ // Test if the path is a windows path
+ windowsPathRegex := regexp.MustCompile(`^([a-zA-Z]):\\(.+)$`)
+ windowsPathComponents := windowsPathRegex.FindStringSubmatch(abspath)
+
+ // Return as-is if no match
+ if windowsPathComponents == nil {
+ return abspath
+ }
+
+ // Convert to WSL2-compatible path if it is a windows path
+ // NOTE: Cannot use filepath because it will use the wrong path separators assuming we want the path to be windows
+ // based if running on Windows, and because we are feeding this to Docker, GoLang auto-path-translate doesn't work.
+ driveLetter := strings.ToLower(windowsPathComponents[1])
+ translatedPath := strings.ReplaceAll(windowsPathComponents[2], `\`, `/`)
+ // Should make something like /mnt/c/Users/person/My Folder/MyActProject
+ result := strings.Join([]string{"/mnt", driveLetter, translatedPath}, `/`)
+ return result
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetName() string {
+ return "NAME"
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetLXC() bool {
+ return false
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetRoot() string {
+ return "/var/run"
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetActPath() string {
+ return "/var/run/act"
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetPathVariableName() string {
+ return "PATH"
+}
+
+func (*LinuxContainerEnvironmentExtensions) DefaultPathVariable() string {
+ return "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+}
+
+func (*LinuxContainerEnvironmentExtensions) JoinPathVariable(paths ...string) string {
+ return strings.Join(paths, ":")
+}
+
+func (*LinuxContainerEnvironmentExtensions) GetRunnerContext(ctx context.Context) map[string]interface{} {
+ return map[string]interface{}{
+ "os": "Linux",
+ "arch": RunnerArch(ctx),
+ "temp": "/tmp",
+ "tool_cache": "/opt/hostedtoolcache",
+ }
+}
+
+func (*LinuxContainerEnvironmentExtensions) IsEnvironmentCaseInsensitive() bool {
+ return false
+}