fix status hanging by walking files/ instead of target dir
This commit is contained in:
@@ -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
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user