]> Sergey Matveev's repositories - sgblog.git/blob - common.go
9c4843b7ea81a18811f61b6b9b8e273f523867b3
[sgblog.git] / common.go
1 // SGBlog -- Git-backed CGI/UCSPI blogging/phlogging/gemlogging engine
2 package sgblog
3
4 import (
5         "bytes"
6         "fmt"
7         "io"
8         "sort"
9         "text/scanner"
10
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"
15 )
16
17 const (
18         Version = "0.27.3"
19         WhenFmt = "2006-01-02 15:04:05Z07:00"
20 )
21
22 func ParseComments(data []byte) []string {
23         comments := []string{}
24         r := recfile.NewReader(bytes.NewReader(data))
25         for {
26                 fields, err := r.Next()
27                 if err != nil {
28                         break
29                 }
30                 if len(fields) != 3 ||
31                         fields[0].Name != "From" ||
32                         fields[1].Name != "Date" ||
33                         fields[2].Name != "Body" {
34                         continue
35                 }
36                 comments = append(comments, fmt.Sprintf(
37                         "%s: %s\n%s: %s\n%s",
38                         fields[0].Name, fields[0].Value,
39                         fields[1].Name, fields[1].Value,
40                         fields[2].Value,
41                 ))
42         }
43         return comments
44 }
45
46 func ParseTopics(data []byte) []string {
47         var s scanner.Scanner
48         s.Init(bytes.NewBuffer(data))
49         topics := []string{}
50         for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
51                 topics = append(topics, s.TokenText())
52         }
53         sort.Strings(topics)
54         return topics
55 }
56
57 func GetNote(repo *git.Repository, tree *object.Tree, what plumbing.Hash) []byte {
58         if tree == nil {
59                 return nil
60         }
61         var entry *object.TreeEntry
62         var err error
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)
69                 if err == nil {
70                         break
71                 }
72         }
73         if entry == nil {
74                 return nil
75         }
76         blob, err := repo.BlobObject(entry.Hash)
77         if err != nil {
78                 return nil
79         }
80         r, err := blob.Reader()
81         if err != nil {
82                 return nil
83         }
84         data, err := io.ReadAll(r)
85         if err != nil {
86                 return nil
87         }
88         return bytes.TrimSuffix(data, []byte{'\n'})
89 }