fix status hanging by walking files/ instead of target dir

This commit is contained in:
2026-03-04 21:26:04 +00:00
parent bd5517ea5d
commit 71ff667963
+24 -5
View File
@@ -93,8 +93,13 @@ func findStaleLinks(filesDir, targetRoot string) ([]string, error) {
return nil, err return nil, err
} }
targetAbs, err := filepath.Abs(targetRoot)
if err != nil {
return nil, err
}
var stale []string 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 { if err != nil {
return err return err
} }
@@ -102,29 +107,43 @@ func findStaleLinks(filesDir, targetRoot string) ([]string, error) {
return nil return nil
} }
info, err := os.Lstat(path) rel, err := filepath.Rel(filesAbs, path)
if err != nil { if err != nil {
return err 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 { if info.Mode()&os.ModeSymlink == 0 {
// Not a symlink, skip
return nil return nil
} }
src, err := os.Readlink(path) src, err := os.Readlink(targetPath)
if err != nil { if err != nil {
return err return err
} }
if !filepath.IsAbs(src) { if !filepath.IsAbs(src) {
src = filepath.Join(filepath.Dir(path), src) src = filepath.Join(filepath.Dir(targetPath), src)
} }
src = filepath.Clean(src) src = filepath.Clean(src)
// Only consider symlinks pointing to our repo
if !strings.HasPrefix(src, filesAbs+string(os.PathSeparator)) && src != filesAbs { if !strings.HasPrefix(src, filesAbs+string(os.PathSeparator)) && src != filesAbs {
return nil return nil
} }
// Check if the source file in repo still exists
if _, err := os.Stat(src); errors.Is(err, os.ErrNotExist) { if _, err := os.Stat(src); errors.Is(err, os.ErrNotExist) {
stale = append(stale, path) stale = append(stale, targetPath)
} }
return nil return nil
}) })