]> Sergey Matveev's repositories - sgblog.git/blobdiff - cmd/sgblog-comment-add/main.go
Use an updated recfile library writer capability
[sgblog.git] / cmd / sgblog-comment-add / main.go
index 837666c3b8dd12a1f71b713dbefbc36c29666da4..ec8910eef9362d1eb89eb5d66583ece99a7ea9bc 100644 (file)
@@ -30,18 +30,21 @@ import (
        "net/mail"
        "os"
        "os/exec"
+       "regexp"
        "strconv"
        "strings"
        "syscall"
        "time"
 
-       "go.cypherpunks.ru/netstring/v2"
+       "go.cypherpunks.ru/recfile"
        "go.stargrave.org/sgblog"
 )
 
+var hashFinder = regexp.MustCompile("([0-9a-f]{40})")
+
 // Remove various whitespaces and excess lines, because git-notes-add
 // will remove and we have to know exact bytes count
-func cleanupBody(body string) string {
+func cleanupBody(body string) []string {
        lines := strings.Split(string(body), "\n")
        for i, line := range lines {
                line = strings.ReplaceAll(line, "       ", "    ")
@@ -67,7 +70,7 @@ func cleanupBody(body string) string {
                }
                withoutDups = append(withoutDups, line)
        }
-       return strings.Join(withoutDups, "\n")
+       return withoutDups
 }
 
 func main() {
@@ -116,7 +119,10 @@ func main() {
                log.Fatal(err)
        }
 
-       subj = strings.TrimPrefix(subj, "Re: ")
+       subj = hashFinder.FindString(subj)
+       if subj == "" {
+               log.Fatal("no commit hash found in subject")
+       }
        if h, err := hex.DecodeString(subj); err != nil || len(h) != sha1.Size {
                os.Exit(0)
        }
@@ -137,13 +143,25 @@ func main() {
        note = bytes.TrimRight(note, "\r\n")
 
        buf := bytes.NewBuffer(note)
-       w := netstring.NewWriter(buf)
-       w.WriteChunk([]byte(fmt.Sprintf(
-               "From: %s\nDate: %s\n\n%s",
-               from,
-               time.Now().UTC().Format(sgblog.WhenFmt),
-               cleanupBody(string(body)),
-       )))
+       recfileW := recfile.NewWriter(buf)
+       if _, err = recfileW.RecordStart(); err != nil {
+               log.Fatal(err)
+       }
+       // We trimmed newline, so have to start record twice
+       if _, err = recfileW.RecordStart(); err != nil {
+               log.Fatal(err)
+       }
+       if _, err = recfileW.WriteFields(
+               recfile.Field{"From", from},
+               recfile.Field{"Date", time.Now().UTC().Format(sgblog.WhenFmt)},
+       ); err != nil {
+               log.Fatal(err)
+       }
+       if _, err = recfileW.WriteFieldMultiline(
+               "Body", append([]string{""}, cleanupBody(string(body))...),
+       ); err != nil {
+               log.Fatal(err)
+       }
 
        if *dryRun {
                fmt.Print(buf.String())