fix symlink issue on windows for goctl (#1034)
* fix symlink issue on windows for goctl * move readlink into separate filemaster v1.2.0
parent
9e2f07a842
commit
71c0288023
@ -0,0 +1,8 @@
|
||||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package util
|
||||
|
||||
func ReadLink(name string) (string, error) {
|
||||
return name, nil
|
||||
}
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue