shithub: hugo

Download patch

ref: 4d1989d59c5abc9712b66c628c6742e58f7daf99
parent: a59525b05b071de020ecc457c94ad0a987040d93
author: Bjørn Erik Pedersen <[email protected]>
date: Sat May 20 06:58:08 EDT 2017

releaser: Fix tag detection for changelog when doing a main release 

Also improve the changelog slightly.

Fixes #3482

--- a/releaser/git.go
+++ b/releaser/git.go
@@ -25,6 +25,7 @@
 var issueRe = regexp.MustCompile(`(?i)[Updates?|Closes?|Fix.*|See] #(\d+)`)
 
 const (
+	notesChanges    = "notesChanges"
 	templateChanges = "templateChanges"
 	coreChanges     = "coreChanges"
 	outChanges      = "outChanges"
@@ -36,6 +37,7 @@
 	Version      string
 	Enhancements map[string]gitInfos
 	Fixes        map[string]gitInfos
+	Notes        gitInfos
 	All          gitInfos
 
 	// Overall stats
@@ -44,8 +46,8 @@
 	ThemeCount       int
 }
 
-func newChangeLog(infos gitInfos) changeLog {
-	return changeLog{
+func newChangeLog(infos gitInfos) *changeLog {
+	return &changeLog{
 		Enhancements: make(map[string]gitInfos),
 		Fixes:        make(map[string]gitInfos),
 		All:          infos,
@@ -52,7 +54,7 @@
 	}
 }
 
-func (l changeLog) addGitInfo(isFix bool, info gitInfo, category string) {
+func (l *changeLog) addGitInfo(isFix bool, info gitInfo, category string) {
 	var (
 		infos   gitInfos
 		found   bool
@@ -59,7 +61,10 @@
 		segment map[string]gitInfos
 	)
 
-	if isFix {
+	if category == notesChanges {
+		l.Notes = append(l.Notes, info)
+		return
+	} else if isFix {
 		segment = l.Fixes
 	} else {
 		segment = l.Enhancements
@@ -74,7 +79,7 @@
 	segment[category] = infos
 }
 
-func gitInfosToChangeLog(infos gitInfos) changeLog {
+func gitInfosToChangeLog(infos gitInfos) *changeLog {
 	log := newChangeLog(infos)
 	for _, info := range infos {
 		los := strings.ToLower(info.Subject)
@@ -82,7 +87,9 @@
 		var category = otherChanges
 
 		// TODO(bep) improve
-		if regexp.MustCompile("(?i)tpl:|tplimpl:|layout").MatchString(los) {
+		if regexp.MustCompile("(?i)deprecate").MatchString(los) {
+			category = notesChanges
+		} else if regexp.MustCompile("(?i)tpl|tplimpl:|layout").MatchString(los) {
 			category = templateChanges
 		} else if regexp.MustCompile("(?i)docs?:|documentation:").MatchString(los) {
 			category = docsChanges
@@ -150,8 +157,8 @@
 	return string(out), nil
 }
 
-func getGitInfos(remote bool) (gitInfos, error) {
-	return getGitInfosBefore("HEAD", remote)
+func getGitInfos(tag string, remote bool) (gitInfos, error) {
+	return getGitInfosBefore("HEAD", tag, remote)
 }
 
 type countribCount struct {
@@ -207,11 +214,11 @@
 	return c
 }
 
-func getGitInfosBefore(ref string, remote bool) (gitInfos, error) {
+func getGitInfosBefore(ref, tag string, remote bool) (gitInfos, error) {
 
 	var g gitInfos
 
-	log, err := gitLogBefore(ref)
+	log, err := gitLogBefore(ref, tag)
 	if err != nil {
 		return g, err
 	}
@@ -242,10 +249,16 @@
 // Ignore autogenerated commits etc. in change log. This is a regexp.
 const ignoredCommits = "release:|vendor:|snapcraft:"
 
-func gitLogBefore(ref string) (string, error) {
-	prevTag, err := gitShort("describe", "--tags", "--abbrev=0", "--always", ref+"^")
-	if err != nil {
-		return "", err
+func gitLogBefore(ref, tag string) (string, error) {
+	var prevTag string
+	var err error
+	if tag != "" {
+		prevTag = tag
+	} else {
+		prevTag, err = gitVersionTagBefore(ref)
+		if err != nil {
+			return "", err
+		}
 	}
 	log, err := git("log", "-E", fmt.Sprintf("--grep=%s", ignoredCommits), "--invert-grep", "--pretty=format:%x1e%h%x1f%aE%x1f%s%x1f%b", "--abbrev-commit", prevTag+".."+ref)
 	if err != nil {
@@ -255,11 +268,29 @@
 	return log, err
 }
 
+func gitVersionTagBefore(ref string) (string, error) {
+	return gitShort("describe", "--tags", "--abbrev=0", "--always", "--match", "v[0-9]*", ref+"^")
+}
+
 func gitLog() (string, error) {
-	return gitLogBefore("HEAD")
+	return gitLogBefore("HEAD", "")
 }
 
 func gitShort(args ...string) (output string, err error) {
 	output, err = git(args...)
 	return strings.Replace(strings.Split(output, "\n")[0], "'", "", -1), err
+}
+
+func tagExists(tag string) (bool, error) {
+	out, err := git("tag", "-l", tag)
+
+	if err != nil {
+		return false, err
+	}
+
+	if strings.Contains(out, tag) {
+		return true, nil
+	}
+
+	return false, nil
 }
--- a/releaser/git_test.go
+++ b/releaser/git_test.go
@@ -14,19 +14,15 @@
 package releaser
 
 import (
+	"os"
 	"testing"
 
-	"runtime"
-
 	"github.com/stretchr/testify/require"
 )
 
 func TestGitInfos(t *testing.T) {
-	if runtime.GOOS == "linux" {
-		// Travis has an ancient git with no --invert-grep: https://github.com/travis-ci/travis-ci/issues/6328
-		t.Skip("Skip git test on Linux to make Travis happy.")
-	}
-	infos, err := getGitInfos(false)
+	skipIfCI(t)
+	infos, err := getGitInfos("v0.20", false)
 
 	require.NoError(t, err)
 	require.True(t, len(infos) > 0)
@@ -50,4 +46,31 @@
 	require.Equal(t, 123, issues[0])
 	require.Equal(t, 543, issues[2])
 
+}
+
+func TestGitVersionTagBefore(t *testing.T) {
+	skipIfCI(t)
+	v1, err := gitVersionTagBefore("v0.18")
+	require.NoError(t, err)
+	require.Equal(t, "v0.17", v1)
+}
+
+func TestTagExists(t *testing.T) {
+	skipIfCI(t)
+	b1, err := tagExists("v0.18")
+	require.NoError(t, err)
+	require.True(t, b1)
+
+	b2, err := tagExists("adfagdsfg")
+	require.NoError(t, err)
+	require.False(t, b2)
+
+}
+
+func skipIfCI(t *testing.T) {
+	if os.Getenv("CI") != "" {
+		// Travis has an ancient git with no --invert-grep: https://github.com/travis-ci/travis-ci/issues/6328
+		// Also Travis clones very shallowly, making some of the tests above shaky.
+		t.Skip("Skip git test on Linux to make Travis happy.")
+	}
 }
--- a/releaser/releasenotes_writer.go
+++ b/releaser/releasenotes_writer.go
@@ -62,7 +62,10 @@
 {{ with .ThemeCount }}
 * 156+ [themes](http://themes.gohugo.io/)
 {{- end }}
-
+{{ with .Notes }}
+## Notes
+{{ template "change-section" . }}
+{{- end -}}
 ## Enhancements
 {{ template "change-headers"  .Enhancements -}}
 ## Fixes
@@ -80,7 +83,7 @@
 {{- end -}}
 {{- with $outChanges -}}
 ### Output
-{{- template "change-section"  . }}
+{{ template "change-section"  . }}
 {{- end -}}
 {{- with $coreChanges -}}
 ### Core
@@ -88,7 +91,7 @@
 {{- end -}}
 {{- with $docsChanges -}}
 ### Docs
-{{- template "change-section"  . }}
+{{ template "change-section"  . }}
 {{- end -}}
 {{- with $otherChanges -}}
 ### Other
--- a/releaser/releasenotes_writer_test.go
+++ b/releaser/releasenotes_writer_test.go
@@ -18,6 +18,7 @@
 
 import (
 	"bytes"
+	"fmt"
 	"os"
 	"testing"
 
@@ -33,9 +34,11 @@
 	var b bytes.Buffer
 
 	// TODO(bep) consider to query GitHub directly for the gitlog with author info, probably faster.
-	infos, err := getGitInfosBefore("v0.20", false)
+	infos, err := getGitInfosBefore("HEAD", "v0.20", false)
 	require.NoError(t, err)
 
-	require.NoError(t, writeReleaseNotes("0.20", infos, &b))
+	require.NoError(t, writeReleaseNotes("0.21", infos, &b))
+
+	fmt.Println(b.String())
 
 }
--- a/releaser/releaser.go
+++ b/releaser/releaser.go
@@ -24,7 +24,6 @@
 	"os/exec"
 	"path/filepath"
 	"regexp"
-	"strings"
 
 	"github.com/spf13/hugo/helpers"
 )
@@ -89,20 +88,31 @@
 	tag := "v" + version
 
 	// Exit early if tag already exists
-	out, err := git("tag", "-l", tag)
-
+	exists, err := tagExists(tag)
 	if err != nil {
 		return err
 	}
 
-	if strings.Contains(out, tag) {
+	if exists {
 		return fmt.Errorf("Tag %q already exists", tag)
 	}
 
+	var changeLogFromTag string
+
+	if newVersion.PatchLevel == 0 {
+		// There may have been patch releases inbetween, so set the tag explicitly.
+		changeLogFromTag = "v" + newVersion.Prev().String()
+		exists, _ := tagExists(changeLogFromTag)
+		if !exists {
+			// fall back to one that exists.
+			changeLogFromTag = ""
+		}
+	}
+
 	var gitCommits gitInfos
 
 	if r.shouldPrepare() || r.shouldRelease() {
-		gitCommits, err = getGitInfos(true)
+		gitCommits, err = getGitInfos(changeLogFromTag, true)
 		if err != nil {
 			return err
 		}