🎨 macOS 端对工作空间放置在 iCloud 路径下做检查 https://github.com/siyuan-note/siyuan/issues/7747

This commit is contained in:
Liang Ding 2023-03-23 08:55:19 +08:00
parent 932ebc1ad9
commit 4d51ca3ad1
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
2 changed files with 53 additions and 21 deletions

View file

@ -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
}
}

View file

@ -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
}) })