"compress/gzip"
"crypto/sha1"
"encoding/hex"
- "encoding/json"
"encoding/xml"
"errors"
"fmt"
"hash"
"html"
"io"
- "io/ioutil"
"log"
"net/url"
"os"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
- "github.com/hjson/hjson-go"
"go.stargrave.org/sgblog"
"go.stargrave.org/sgblog/cmd/sgblog/atom"
"golang.org/x/crypto/blake2b"
var (
renderableSchemes = map[string]struct{}{
- "ftp": struct{}{},
- "gopher": struct{}{},
- "http": struct{}{},
- "https": struct{}{},
- "telnet": struct{}{},
+ "finger": {},
+ "ftp": {},
+ "gemini": {},
+ "gopher": {},
+ "http": {},
+ "https": {},
+ "telnet": {},
}
)
func makeErr(err error) {
fmt.Print("Content-Type: text/plain; charset=UTF-8\n\n")
fmt.Println(err)
- panic(err)
+ log.Fatalln(err)
}
func checkETag(etag hash.Hash) {
if cfgPath == "" {
log.Fatalln("SGBLOG_CFG is not set")
}
- cfgRaw, err := ioutil.ReadFile(cfgPath)
+ cfg, err := readCfg(cfgPath)
if err != nil {
- makeErr(err)
- }
- var cfgGeneral map[string]interface{}
- if err = hjson.Unmarshal(cfgRaw, &cfgGeneral); err != nil {
- makeErr(err)
- }
- cfgRaw, err = json.Marshal(cfgGeneral)
- if err != nil {
- makeErr(err)
- }
- var cfg *Cfg
- if err = json.Unmarshal(cfgRaw, &cfg); err != nil {
- makeErr(err)
+ log.Fatalln(err)
}
+
pathInfo, exists := os.LookupEnv("PATH_INFO")
if !exists {
pathInfo = "/"
break
}
etagHash.Write(commit.Hash[:])
- commentsRaw := getNote(commentsTree, commit.Hash)
+ commentsRaw := sgblog.GetNote(repo, commentsTree, commit.Hash)
etagHash.Write(commentsRaw)
- topicsRaw := getNote(topicsTree, commit.Hash)
+ topicsRaw := sgblog.GetNote(repo, topicsTree, commit.Hash)
etagHash.Write(topicsRaw)
entries = append(entries, TableEntry{
Commit: commit,
}
entry.DomainURLs = append(entry.DomainURLs, makeA(line, u.Host))
}
- entry.CommentsNum = len(parseComments(entry.CommentsRaw))
- entry.Topics = parseTopics(entry.TopicsRaw)
+ entry.CommentsNum = len(sgblog.ParseComments(entry.CommentsRaw))
+ entry.Topics = sgblog.ParseTopics(entry.TopicsRaw)
entries[i] = entry
}
offsetPrev := offset - PageEntries
}
lines := msgSplit(commit.Message)
var categories []atom.Category
- for _, topic := range parseTopics(getNote(topicsTree, commit.Hash)) {
+ for _, topic := range sgblog.ParseTopics(sgblog.GetNote(repo, topicsTree, commit.Hash)) {
categories = append(categories, atom.Category{Term: topic})
}
htmlized := make([]string, 0, len(lines))
))
commit, err = repo.CommitObject(commentedHash)
if err != nil {
- makeErr(err)
+ continue
}
- comments := parseComments(getNote(t, commentedHash))
+ comments := sgblog.ParseComments(sgblog.GetNote(repo, t, commentedHash))
if len(comments) == 0 {
continue
}
commit.Hash.String(), "#comment", commentN,
}, ""),
}},
- Published: atom.TimeStr(date),
- Updated: atom.TimeStr(date),
+ Published: atom.TimeStr(strings.Replace(date, " ", "T", -1)),
+ Updated: atom.TimeStr(strings.Replace(date, " ", "T", -1)),
Content: &atom.Text{
Type: "html",
Body: strings.Join(htmlized, "\n"),
cfg.AtomBaseURL, cfg.URLPrefix, "/",
commit.Hash.String(), "/", AtomCommentsFeed,
}, "")
- commentsRaw := getNote(commentsTree, commit.Hash)
+ commentsRaw := sgblog.GetNote(repo, commentsTree, commit.Hash)
etagHash.Write(commentsRaw)
- topicsRaw := getNote(topicsTree, commit.Hash)
+ topicsRaw := sgblog.GetNote(repo, topicsTree, commit.Hash)
etagHash.Write(topicsRaw)
if strings.HasSuffix(pathInfo, AtomCommentsFeed) {
etagHash.Write([]byte("ATOM COMMENTS"))
date string
body []string
}
- commentsRaw := parseComments(commentsRaw)
+ commentsRaw := sgblog.ParseComments(commentsRaw)
var toSkip int
if len(commentsRaw) > PageEntries {
toSkip = len(commentsRaw) - PageEntries
"#comment", comment.n,
}, ""),
}},
- Published: atom.TimeStr(comment.date),
- Updated: atom.TimeStr(comment.date),
+ Published: atom.TimeStr(
+ strings.Replace(comment.date, " ", "T", -1),
+ ),
+ Updated: atom.TimeStr(
+ strings.Replace(comment.date, " ", "T", -1),
+ ),
Content: &atom.Text{
Type: "html",
Body: strings.Join(htmlized, "\n"),
out.Write(data)
goto AtomFinish
}
- notesRaw := getNote(notesTree, commit.Hash)
+ notesRaw := sgblog.GetNote(repo, notesTree, commit.Hash)
etagHash.Write(notesRaw)
checkETag(etagHash)
if len(commit.ParentHashes) > 0 {
parent = commit.ParentHashes[0].String()
}
- commentsParsed := parseComments(commentsRaw)
+ commentsParsed := sgblog.ParseComments(commentsRaw)
comments := make([]CommentEntry, 0, len(commentsParsed))
for _, comment := range commentsParsed {
lines := strings.Split(comment, "\n")
Lines: lines[2:],
NoteLines: notesLines,
Comments: comments,
- Topics: parseTopics(topicsRaw),
+ Topics: sgblog.ParseTopics(topicsRaw),
})
if err != nil {
makeErr(err)