denote-acme/internal/disk/backlinks.go

75 lines
1.4 KiB
Go

package disk
import (
"bytes"
"denote/pkg/metadata"
"os/exec"
"path/filepath"
"strings"
)
func FindBacklinks(targetID, denoteDir string, allNotes metadata.Results) metadata.Results {
searchPattern := "denote:" + targetID
duCmd := exec.Command("9", "du", "-a")
duCmd.Dir = denoteDir
awkCmd := exec.Command("9", "awk", "$2 ~ /\\.(md|org|txt)$/ {print $2}")
xargsCmd := exec.Command("9", "xargs", "9", "grep", "-l", searchPattern)
xargsCmd.Dir = denoteDir
duOut, err := duCmd.StdoutPipe()
if err != nil {
return nil
}
awkCmd.Stdin = duOut
awkOut, err := awkCmd.StdoutPipe()
if err != nil {
return nil
}
xargsCmd.Stdin = awkOut
var output bytes.Buffer
xargsCmd.Stdout = &output
if err := duCmd.Start(); err != nil {
return nil
}
if err := awkCmd.Start(); err != nil {
return nil
}
if err := xargsCmd.Start(); err != nil {
return nil
}
duCmd.Wait()
awkCmd.Wait()
xargsCmd.Wait()
result := strings.TrimSpace(output.String())
if result == "" {
return nil
}
var results metadata.Results
lines := strings.Split(result, "\n")
for _, line := range lines {
line = strings.TrimPrefix(line, "./")
m := metadata.ParseFilename(filepath.Join(denoteDir, line))
if m.Identifier == "" {
continue
}
for _, note := range allNotes {
if note.Identifier == m.Identifier {
results = append(results, note)
break
}
}
}
return results
}