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) {
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