1 // SGBlog -- Git-backed CGI/UCSPI blogging/phlogging/gemlogging engine
11 "github.com/go-git/go-git/v5"
12 "github.com/go-git/go-git/v5/plumbing"
13 "github.com/go-git/go-git/v5/plumbing/object"
14 "go.cypherpunks.ru/recfile"
19 WhenFmt = "2006-01-02 15:04:05Z07:00"
22 func ParseComments(data []byte) []string {
23 comments := []string{}
24 r := recfile.NewReader(bytes.NewReader(data))
26 fields, err := r.Next()
30 if len(fields) != 3 ||
31 fields[0].Name != "From" ||
32 fields[1].Name != "Date" ||
33 fields[2].Name != "Body" {
36 comments = append(comments, fmt.Sprintf(
38 fields[0].Name, fields[0].Value,
39 fields[1].Name, fields[1].Value,
46 func ParseTopics(data []byte) []string {
48 s.Init(bytes.NewBuffer(data))
50 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
51 topics = append(topics, s.TokenText())
57 func GetNote(repo *git.Repository, tree *object.Tree, what plumbing.Hash) []byte {
61 var entry *object.TreeEntry
63 paths := make([]string, 3)
64 paths[0] = what.String()
65 paths[1] = paths[0][:2] + "/" + paths[0][2:]
66 paths[2] = paths[1][:4+1] + "/" + paths[1][4+1:]
67 for _, p := range paths {
68 entry, err = tree.FindEntry(p)
76 blob, err := repo.BlobObject(entry.Hash)
80 r, err := blob.Reader()
84 data, err := io.ReadAll(r)
88 return bytes.TrimSuffix(data, []byte{'\n'})