diff --git a/ops.go b/ops.go index 8f232e6..e2d7606 100644 --- a/ops.go +++ b/ops.go @@ -93,8 +93,13 @@ func findStaleLinks(filesDir, targetRoot string) ([]string, error) { return nil, err } + targetAbs, err := filepath.Abs(targetRoot) + if err != nil { + return nil, err + } + var stale []string - walkErr := filepath.WalkDir(targetRoot, func(path string, entry fs.DirEntry, err error) error { + walkErr := filepath.WalkDir(filesDir, func(path string, entry fs.DirEntry, err error) error { if err != nil { return err } @@ -102,29 +107,43 @@ func findStaleLinks(filesDir, targetRoot string) ([]string, error) { return nil } - info, err := os.Lstat(path) + rel, err := filepath.Rel(filesAbs, path) if err != nil { return err } + + targetPath := filepath.Join(targetAbs, rel) + info, err := os.Lstat(targetPath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + // Symlink doesn't exist - not stale, just not applied + return nil + } + return err + } + if info.Mode()&os.ModeSymlink == 0 { + // Not a symlink, skip return nil } - src, err := os.Readlink(path) + src, err := os.Readlink(targetPath) if err != nil { return err } if !filepath.IsAbs(src) { - src = filepath.Join(filepath.Dir(path), src) + src = filepath.Join(filepath.Dir(targetPath), src) } src = filepath.Clean(src) + // Only consider symlinks pointing to our repo if !strings.HasPrefix(src, filesAbs+string(os.PathSeparator)) && src != filesAbs { return nil } + // Check if the source file in repo still exists if _, err := os.Stat(src); errors.Is(err, os.ErrNotExist) { - stale = append(stale, path) + stale = append(stale, targetPath) } return nil })