mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 07:00:12 +01:00
🎨 macOS 端对工作空间放置在 iCloud 路径下做检查 https://github.com/siyuan-note/siyuan/issues/7747
This commit is contained in:
parent
932ebc1ad9
commit
4d51ca3ad1
2 changed files with 53 additions and 21 deletions
|
|
@ -231,3 +231,55 @@ func CeilSize(size int64) int64 {
|
||||||
func IsReservedFilename(baseName string) bool {
|
func IsReservedFilename(baseName string) bool {
|
||||||
return "assets" == baseName || "templates" == baseName || "widgets" == baseName || "emojis" == baseName || ".siyuan" == baseName || strings.HasPrefix(baseName, ".")
|
return "assets" == baseName || "templates" == baseName || "widgets" == baseName || "emojis" == baseName || ".siyuan" == baseName || strings.HasPrefix(baseName, ".")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WalkWithSymlinks(root string, fn filepath.WalkFunc) error {
|
||||||
|
// 感谢 https://github.com/edwardrf/symwalk/blob/main/symwalk.go
|
||||||
|
|
||||||
|
rr, err := filepath.EvalSymlinks(root) // Find real base if there is any symlinks in the path
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
visitedDirs := make(map[string]struct{})
|
||||||
|
return filepath.Walk(rr, getWalkFn(visitedDirs, fn))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWalkFn(visitedDirs map[string]struct{}, fn filepath.WalkFunc) filepath.WalkFunc {
|
||||||
|
return func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return fn(path, info, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.IsDir() {
|
||||||
|
if _, ok := visitedDirs[path]; ok {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
visitedDirs[path] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := fn(path, info, err); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.Mode()&os.ModeSymlink == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// path is a symlink
|
||||||
|
rp, err := filepath.EvalSymlinks(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ri, err := os.Stat(rp)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if ri.IsDir() {
|
||||||
|
return filepath.Walk(rp, getWalkFn(visitedDirs, fn))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -262,31 +262,11 @@ func isICloudPath(absPath string) bool {
|
||||||
// macOS 端对工作空间放置在 iCloud 路径下做检查 https://github.com/siyuan-note/siyuan/issues/7747
|
// macOS 端对工作空间放置在 iCloud 路径下做检查 https://github.com/siyuan-note/siyuan/issues/7747
|
||||||
|
|
||||||
iCloudRoot := filepath.Join(HomeDir, "Library", "Mobile Documents")
|
iCloudRoot := filepath.Join(HomeDir, "Library", "Mobile Documents")
|
||||||
err := filepath.Walk(iCloudRoot, func(path string, info os.FileInfo, err error) error {
|
err := WalkWithSymlinks(iCloudRoot, func(path string, info os.FileInfo, err error) error {
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if 0 != info.Mode()&os.ModeSymlink && 0 != info.Mode()&os.ModeDir {
|
|
||||||
resolved, symErr := filepath.EvalSymlinks(path)
|
|
||||||
if nil != symErr {
|
|
||||||
logging.LogErrorf("resolve symlink [%s] failed: %s", path, symErr)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
filepath.Walk(resolved, func(path string, info os.FileInfo, err error) error {
|
|
||||||
if nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if absPath == strings.ToLower(path) {
|
|
||||||
logging.LogInfof("under symlink path: %s", path)
|
|
||||||
return fmt.Errorf("found")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
logging.LogInfof("path: %s", path)
|
logging.LogInfof("path: %s", path)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue