Detect stale symlinks by scanning target
This commit is contained in:
55
main.go
55
main.go
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user