Browse Source

fix symlink issue on windows for goctl (#1034)

* fix symlink issue on windows for goctl

* move readlink into separate file
Kevin Wan 3 years ago
parent
commit
71c0288023

+ 1 - 0
core/proc/goroutines.go

@@ -1,3 +1,4 @@
+//go:build linux || darwin
 // +build linux darwin
 
 package proc

+ 1 - 0
core/proc/profile.go

@@ -1,3 +1,4 @@
+//go:build linux || darwin
 // +build linux darwin
 
 package proc

+ 0 - 47
tools/goctl/util/path.go

@@ -113,53 +113,6 @@ func FindProjectPath(loc string) (string, bool) {
 	return "", false
 }
 
-// ReadLink returns the destination of the named symbolic link recursively.
-func ReadLink(name string) (string, error) {
-	name, err := filepath.Abs(name)
-	if err != nil {
-		return "", err
-	}
-
-	if _, err := os.Lstat(name); err != nil {
-		return name, nil
-	}
-
-	// uncheck condition: ignore file path /var, maybe be temporary file path
-	if name == "/" || name == "/var" {
-		return name, nil
-	}
-
-	isLink, err := isLink(name)
-	if err != nil {
-		return "", err
-	}
-
-	if !isLink {
-		dir, base := filepath.Split(name)
-		dir = filepath.Clean(dir)
-		dir, err := ReadLink(dir)
-		if err != nil {
-			return "", err
-		}
-
-		return filepath.Join(dir, base), nil
-	}
-
-	link, err := os.Readlink(name)
-	if err != nil {
-		return "", err
-	}
-
-	dir, base := filepath.Split(link)
-	dir = filepath.Dir(dir)
-	dir, err = ReadLink(dir)
-	if err != nil {
-		return "", err
-	}
-
-	return filepath.Join(dir, base), nil
-}
-
 func isLink(name string) (bool, error) {
 	fi, err := os.Lstat(name)
 	if err != nil {

+ 8 - 0
tools/goctl/util/readlink+polyfill.go

@@ -0,0 +1,8 @@
+//go:build windows
+// +build windows
+
+package util
+
+func ReadLink(name string) (string, error) {
+	return name, nil
+}

+ 56 - 0
tools/goctl/util/readlink.go

@@ -0,0 +1,56 @@
+//go:build linux || darwin
+// +build linux darwin
+
+package util
+
+import (
+	"os"
+	"path/filepath"
+)
+
+// ReadLink returns the destination of the named symbolic link recursively.
+func ReadLink(name string) (string, error) {
+	name, err := filepath.Abs(name)
+	if err != nil {
+		return "", err
+	}
+
+	if _, err := os.Lstat(name); err != nil {
+		return name, nil
+	}
+
+	// uncheck condition: ignore file path /var, maybe be temporary file path
+	if name == "/" || name == "/var" {
+		return name, nil
+	}
+
+	isLink, err := isLink(name)
+	if err != nil {
+		return "", err
+	}
+
+	if !isLink {
+		dir, base := filepath.Split(name)
+		dir = filepath.Clean(dir)
+		dir, err := ReadLink(dir)
+		if err != nil {
+			return "", err
+		}
+
+		return filepath.Join(dir, base), nil
+	}
+
+	link, err := os.Readlink(name)
+	if err != nil {
+		return "", err
+	}
+
+	dir, base := filepath.Split(link)
+	dir = filepath.Dir(dir)
+	dir, err = ReadLink(dir)
+	if err != nil {
+		return "", err
+	}
+
+	return filepath.Join(dir, base), nil
+}