fix(brain): wing indexes and the link check read through brainfs (#157, slice 5a)
BuildWingIndex/BuildAllWingIndexes listed wiki/<wing>/<hall>/ with os.ReadDir and opened each note by path: a symlinked note put the target's title into _index.md (110k leaks in the swap race), a symlinked wing was followed and its _index.md written into the target, and a FIFO hung the build (it runs on every brain_write). - New brainfs.ReadDirDirs: real subdirectories only, every component of the dir a real directory. Wings and halls are listed with it and ReadDirRegular; titles are read with ReadRegular (readTitleAndCreatedIn). A symlinked wing is an error; a symlinked hall is skipped. - linkcheck entryIndex walks with WalkRegular: a symlinked .md name no longer makes a [[link]] resolve. - readTitleAndCreated (path-based) stays for tunnel.DetectTunnels until PR #170 lands; that is slice 5b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -104,6 +104,27 @@ func (b *Brain) ReadDirRegular(relDir string) ([]string, error) {
|
||||
return names, nil
|
||||
}
|
||||
|
||||
// ReadDirDirs lists the real subdirectories directly in a brain-relative
|
||||
// directory, by name. Every component of relDir must be a real directory
|
||||
// (ErrNotRegular otherwise); symlinks to directories are left out.
|
||||
func (b *Brain) ReadDirDirs(relDir string) ([]string, error) {
|
||||
relDir = filepath.ToSlash(relDir)
|
||||
if err := b.realDir(relDir); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ents, err := fs.ReadDir(b.root.FS(), relDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var names []string
|
||||
for _, e := range ents {
|
||||
if e.Type().IsDir() {
|
||||
names = append(names, e.Name())
|
||||
}
|
||||
}
|
||||
return names, nil
|
||||
}
|
||||
|
||||
// ReadRegular reads a brain-relative path, refusing anything that is not a
|
||||
// regular file, both before the open and on the opened handle.
|
||||
func (b *Brain) ReadRegular(rel string) ([]byte, error) {
|
||||
|
||||
Reference in New Issue
Block a user