Detect stale symlinks by scanning target

This commit is contained in:
2026-02-19 16:46:34 +00:00
parent 3b9af4f0a1
commit 2169958c61

55
main.go
View File

@@ -471,45 +471,48 @@ func moveDirContents(srcDir, destDir string) error {
} }
func findStaleLinks(filesDir, targetRoot string) ([]string, error) { func findStaleLinks(filesDir, targetRoot string) ([]string, error) {
known := make(map[string]struct{}) filesAbs, err := filepath.Abs(filesDir)
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
})
if err != nil { if err != nil {
return nil, err return nil, err
} }
var stale []string var stale []string
for targetPath := range known { walkErr := filepath.WalkDir(targetRoot, func(path string, entry fs.DirEntry, err error) error {
info, err := os.Lstat(targetPath)
if errors.Is(err, os.ErrNotExist) {
continue
}
if err != nil { 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 { if info.Mode()&os.ModeSymlink == 0 {
continue return nil
} }
src, err := os.Readlink(targetPath)
src, err := os.Readlink(path)
if err != nil { 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) { 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 return stale, nil