diff --git a/main.go b/main.go index b2bc0a7..cdd8bdd 100644 --- a/main.go +++ b/main.go @@ -471,45 +471,48 @@ func moveDirContents(srcDir, destDir string) error { } func findStaleLinks(filesDir, targetRoot string) ([]string, error) { - known := make(map[string]struct{}) - - err := filepath.WalkDir(filesDir, func(path string, entry fs.DirEntry, err error) error { - if err != nil { - return err - } - if path == filesDir || entry.IsDir() { - return nil - } - rel, err := filepath.Rel(filesDir, path) - if err != nil { - return err - } - known[filepath.Join(targetRoot, rel)] = struct{}{} - return nil - }) + filesAbs, err := filepath.Abs(filesDir) if err != nil { return nil, err } var stale []string - for targetPath := range known { - info, err := os.Lstat(targetPath) - if errors.Is(err, os.ErrNotExist) { - continue - } + walkErr := filepath.WalkDir(targetRoot, func(path string, entry fs.DirEntry, err error) error { if err != nil { - return nil, err + return err + } + if entry.IsDir() { + return nil + } + info, err := entry.Info() + if err != nil { + return err } if info.Mode()&os.ModeSymlink == 0 { - continue + return nil } - src, err := os.Readlink(targetPath) + + src, err := os.Readlink(path) if err != nil { - return nil, err + return err } + if !filepath.IsAbs(src) { + src = filepath.Join(filepath.Dir(path), src) + } + src = filepath.Clean(src) + + if !strings.HasPrefix(src, filesAbs+string(os.PathSeparator)) && src != filesAbs { + return nil + } + if _, err := os.Stat(src); errors.Is(err, os.ErrNotExist) { - stale = append(stale, targetPath) + stale = append(stale, path) } + return nil + }) + + if walkErr != nil { + return nil, walkErr } return stale, nil