X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=common.go;h=d6357fc984e9ba37c1850c05e2f9403135618b7c;hb=a4e509fa3e93e999c4d878303be799d07b5a73ae;hp=ebb5a9d1b7d0f0f93e33af16f09db0c43b475925;hpb=0bcc06cc15038729af1c09a42ac4f22a56b35100;p=sgblog.git diff --git a/common.go b/common.go index ebb5a9d..d6357fc 100644 --- a/common.go +++ b/common.go @@ -1,7 +1,89 @@ // SGBlog -- Git-backed CGI/inetd blogging/phlogging engine package sgblog +import ( + "bytes" + "fmt" + "io/ioutil" + "sort" + "text/scanner" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "go.cypherpunks.ru/recfile" +) + const ( Version = "0.17.0" WhenFmt = "2006-01-02 15:04:05Z07:00" ) + +func ParseComments(data []byte) []string { + comments := []string{} + r := recfile.NewReader(bytes.NewReader(data)) + for { + fields, err := r.Next() + if err != nil { + break + } + if len(fields) != 3 || + fields[0].Name != "From" || + fields[1].Name != "Date" || + fields[2].Name != "Body" { + continue + } + comments = append(comments, fmt.Sprintf( + "%s: %s\n%s: %s\n%s", + fields[0].Name, fields[0].Value, + fields[1].Name, fields[1].Value, + fields[2].Value, + )) + } + return comments +} + +func ParseTopics(data []byte) []string { + var s scanner.Scanner + s.Init(bytes.NewBuffer(data)) + topics := []string{} + for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { + topics = append(topics, s.TokenText()) + } + sort.Strings(topics) + return topics +} + +func GetNote(repo *git.Repository, tree *object.Tree, what plumbing.Hash) []byte { + if tree == nil { + return nil + } + var entry *object.TreeEntry + var err error + paths := make([]string, 3) + paths[0] = what.String() + paths[1] = paths[0][:2] + "/" + paths[0][2:] + paths[2] = paths[1][:4+1] + "/" + paths[1][4+1:] + for _, p := range paths { + entry, err = tree.FindEntry(p) + if err == nil { + break + } + } + if entry == nil { + return nil + } + blob, err := repo.BlobObject(entry.Hash) + if err != nil { + return nil + } + r, err := blob.Reader() + if err != nil { + return nil + } + data, err := ioutil.ReadAll(r) + if err != nil { + return nil + } + return bytes.TrimSuffix(data, []byte{'\n'}) +}