From 15c432b49be7c1f2b81ab393be8a90a68442f6d8 Mon Sep 17 00:00:00 2001
From: Sergey Matveev <stargrave@stargrave.org>
Date: Mon, 1 Jun 2020 12:06:49 +0300
Subject: [PATCH] Yet another duplicate lines removing

---
 cmd/sgblog-comment-add/main.go | 49 ++++++++++++++++++++++------------
 common.go                      |  2 +-
 2 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/cmd/sgblog-comment-add/main.go b/cmd/sgblog-comment-add/main.go
index 31b3d01..837666c 100644
--- a/cmd/sgblog-comment-add/main.go
+++ b/cmd/sgblog-comment-add/main.go
@@ -39,6 +39,37 @@ import (
 	"go.stargrave.org/sgblog"
 )
 
+// 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 {
+	lines := strings.Split(string(body), "\n")
+	for i, line := range lines {
+		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]
+	}
+	withoutDups := make([]string, 0, len(lines))
+	emptyMet := false
+	for _, line := range lines {
+		if line == "" {
+			if emptyMet {
+				continue
+			}
+			emptyMet = true
+		} else {
+			emptyMet = false
+		}
+		withoutDups = append(withoutDups, line)
+	}
+	return strings.Join(withoutDups, "\n")
+}
+
 func main() {
 	gitCmd := flag.String("git-cmd", "/usr/local/bin/git", "Path to git executable")
 	gitDir := flag.String("git-dir", "", "Path to .git repository")
@@ -105,29 +136,13 @@ func main() {
 	note, _ := cmd.Output()
 	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. Also convert
-	// all tabs into spaces
-	lines := strings.Split(string(body), "\n")
-	for i, line := range lines {
-		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]
-	}
-
 	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),
-		strings.Join(lines, "\n"),
+		cleanupBody(string(body)),
 	)))
 
 	if *dryRun {
diff --git a/common.go b/common.go
index 57419d0..db523a6 100644
--- a/common.go
+++ b/common.go
@@ -2,6 +2,6 @@
 package sgblog
 
 const (
-	Version = "0.6.3"
+	Version = "0.6.4"
 	WhenFmt = "2006-01-02 15:04:05Z07:00"
 )
-- 
2.51.0