From 6186a746e00c9c55b10d036c0f5dfaafccda6c8b Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sun, 22 Mar 2015 16:14:52 +0100 Subject: [PATCH] Rewrite changelog.sh in Go --- changelog.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ changelog.sh | 20 ---------------- 2 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 changelog.go delete mode 100755 changelog.sh diff --git a/changelog.go b/changelog.go new file mode 100644 index 000000000..6eb20fbf9 --- /dev/null +++ b/changelog.go @@ -0,0 +1,64 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "log" + "os/exec" + "regexp" +) + +var ( + subjectIssues = regexp.MustCompile(`^([^(]+)\s+\((?:fixes|ref) ([^)]+)\)$`) + issueNumbers = regexp.MustCompile(`(#\d+)`) +) + +func main() { + flag.Parse() + + // Display changelog since the version given on the command line, or + // figure out the last release if there were no arguments. + var prevRel string + if flag.NArg() > 0 { + prevRel = flag.Arg(0) + } else { + bs, err := runError("git", "describe", "--abbrev=0", "HEAD^") + if err != nil { + log.Fatal(err) + } + prevRel = string(bs) + } + + // Get the git log with subject and author nickname + bs, err := runError("git", "log", "--reverse", "--pretty=format:%s|%aN", prevRel+"..") + if err != nil { + log.Fatal(err) + } + + // Split into lines + for _, line := range bytes.Split(bs, []byte{'\n'}) { + // Split into subject and author + fields := bytes.Split(line, []byte{'|'}) + subj := fields[0] + author := fields[1] + + // Check if subject contains a "(fixes ...)" or "(ref ...)"" + if m := subjectIssues.FindSubmatch(subj); len(m) > 0 { + // Find all issue numbers + issues := issueNumbers.FindAll(m[2], -1) + + // Format a changelog entry + fmt.Printf("* %s (%s, @%s)\n", m[1], bytes.Join(issues, []byte(", ")), author) + } + } +} + +func runError(cmd string, args ...string) ([]byte, error) { + ecmd := exec.Command(cmd, args...) + bs, err := ecmd.CombinedOutput() + if err != nil { + return nil, err + } + return bytes.TrimSpace(bs), nil +} diff --git a/changelog.sh b/changelog.sh deleted file mode 100755 index f6e2e5bc6..000000000 --- a/changelog.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -since="$1" -if [[ -z $since ]] ; then - since="$(git describe --abbrev=0 HEAD^).." -fi - -case $(uname) in - Darwin) - grep="egrep" - ;; - *) - grep="grep -P" - ;; -esac - -git log --reverse --pretty=format:'* %s, @%aN)' "$since" | $grep 'fixes #\d|ref #\d' | sed 's/)[,. ]*,/,/' | sed 's/fixes #/#/g' | sed 's/ref #/#/g' - -git diff "$since" -- AUTHORS -