mirror of
https://github.com/x-motemen/ghq.git
synced 2026-09-10 07:26:27 -04:00
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
//go:build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"syscall"
|
|
)
|
|
|
|
func toFullPath(s string) (string, error) {
|
|
p := syscall.StringToUTF16(s)
|
|
b := p
|
|
n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
|
if err != nil {
|
|
return s, err
|
|
}
|
|
if n > uint32(len(b)) {
|
|
b = make([]uint16, n)
|
|
n, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
|
|
if err != nil {
|
|
return s, err
|
|
}
|
|
}
|
|
b = b[:n]
|
|
return syscall.UTF16ToString(b), nil
|
|
}
|
|
|
|
func evalSymlinks(path string) (string, error) {
|
|
_, err := os.Stat(path)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
list := filepathSplitAll(path)
|
|
evaled := list[0]
|
|
for i := 1; i < len(list); i++ {
|
|
evaled = filepath.Join(evaled, list[i])
|
|
|
|
linkSrc, err := os.Readlink(evaled)
|
|
if err != nil {
|
|
// not symlink
|
|
continue
|
|
} else {
|
|
if filepath.IsAbs(linkSrc) {
|
|
evaled = linkSrc
|
|
} else {
|
|
evaled = filepath.Join(filepath.Dir(evaled), linkSrc)
|
|
}
|
|
}
|
|
}
|
|
|
|
return evaled, nil
|
|
}
|
|
|
|
func filepathSplitAll(path string) []string {
|
|
path = filepath.Clean(path)
|
|
path = filepath.ToSlash(path)
|
|
|
|
vol := filepath.VolumeName(path)
|
|
|
|
path = path[len(vol):]
|
|
list := strings.Split(path, "/")
|
|
list[0] = vol + string(filepath.Separator) + list[0]
|
|
return list
|
|
}
|