]> Sergey Matveev's repositories - sgblog.git/blobdiff - cmd/sgblog-comment-add/main.go
Remove leading empty lines
[sgblog.git] / cmd / sgblog-comment-add / main.go
index b52e68a4347b230f67c9846cb66fce4e2062560f..31b3d01a377781cc3e8e4383a3057c943fdb432b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-SGBlog -- Git-based CGI blogging engine
+SGBlog -- Git-backed CGI/inetd blogging/phlogging engine
 Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
@@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-// Git-based CGI blogging engine email to comments adder
+// Git-backed CGI/inetd blogging/phlogging engine
 package main
 
 import (
@@ -26,6 +26,7 @@ import (
        "fmt"
        "io/ioutil"
        "log"
+       "mime"
        "net/mail"
        "os"
        "os/exec"
@@ -35,15 +36,20 @@ import (
        "time"
 
        "go.cypherpunks.ru/netstring/v2"
+       "go.stargrave.org/sgblog"
 )
 
-const WhenFmt = "2006-01-02 15:04:05Z07:00"
-
 func main() {
        gitCmd := flag.String("git-cmd", "/usr/local/bin/git", "Path to git executable")
        gitDir := flag.String("git-dir", "", "Path to .git repository")
        notesRef := flag.String("ref", "comments", "notes reference name")
        umask := flag.String("umask", "027", "umask value")
+       dryRun := flag.Bool("dryrun", false, "Show comment, do not add")
+       committerEmail := flag.String(
+               "committer-email",
+               "comment@blog.example.com",
+               "Git committer's email",
+       )
        flag.Parse()
        uid := syscall.Geteuid()
        if err := syscall.Setuid(uid); err != nil {
@@ -74,25 +80,42 @@ func main() {
        if len(body) == 0 {
                log.Fatal("no body")
        }
+       from, err = new(mime.WordDecoder).DecodeHeader(from)
+       if err != nil {
+               log.Fatal(err)
+       }
 
+       subj = strings.TrimPrefix(subj, "Re: ")
        if h, err := hex.DecodeString(subj); err != nil || len(h) != sha1.Size {
                os.Exit(0)
        }
        fromCols := strings.Fields(from)
-       from = strings.Join(fromCols[:len(fromCols)-1], " ")
+       if len(fromCols) == 1 {
+               if idx := strings.Index(from, "@"); idx != -1 {
+                       from = strings.Trim(from[:idx], "<>")
+               }
+       } else {
+               from = strings.Join(fromCols[:len(fromCols)-1], " ")
+       }
 
        cmd := exec.Command(
                *gitCmd, "--git-dir", *gitDir,
                "notes", "--ref", *notesRef, "show", subj,
        )
        note, _ := cmd.Output()
-       note = bytes.TrimSuffix(note, []byte{'\n'})
+       note = bytes.TrimRight(note, "\r\n")
 
        // Remove trailing whitespaces, because git-notes-add will remove
-       // them anyway, and we have to know exact bytes count
+       // them anyway, and we have to know exact bytes count. Also convert
+       // all tabs into spaces
        lines := strings.Split(string(body), "\n")
        for i, line := range lines {
-               lines[i] = strings.TrimRight(line, " ")
+               line = strings.ReplaceAll(line, "       ", "    ")
+               line = strings.TrimRight(line, " \r")
+               lines[i] = line
+       }
+       for lines[0] == "" {
+               lines = lines[1:]
        }
        for lines[len(lines)-1] == "" {
                lines = lines[:len(lines)-1]
@@ -103,15 +126,27 @@ func main() {
        w.WriteChunk([]byte(fmt.Sprintf(
                "From: %s\nDate: %s\n\n%s",
                from,
-               time.Now().Format(WhenFmt),
+               time.Now().UTC().Format(sgblog.WhenFmt),
                strings.Join(lines, "\n"),
        )))
 
+       if *dryRun {
+               fmt.Print(buf.String())
+               os.Exit(0)
+       }
+
        cmd = exec.Command(
                *gitCmd, "--git-dir", *gitDir,
                "notes", "--ref", *notesRef, "add",
                "-F", "-", "-f", subj,
        )
+       cmd.Env = append(
+               cmd.Env,
+               "GIT_AUTHOR_NAME=SGBlog "+sgblog.Version,
+               "GIT_AUTHOR_EMAIL="+*committerEmail,
+               "GIT_COMMITTER_NAME=SGBlog "+sgblog.Version,
+               "GIT_COMMITTER_EMAIL="+*committerEmail,
+       )
        cmd.Stdin = buf
        if err = cmd.Run(); err != nil {
                log.Fatal(err)