diff --git a/pipeline/git/git.go b/pipeline/git/git.go index be02e7677..663ee85eb 100644 --- a/pipeline/git/git.go +++ b/pipeline/git/git.go @@ -93,11 +93,20 @@ func getChangelog(tag string) (string, error) { if err != nil { return "", err } - return git("log", "--pretty=oneline", "--abbrev-commit", prev+".."+tag) + if !prev.Tag { + return gitLog(prev.SHA, tag) + } + return gitLog(fmt.Sprintf("%v..%v", prev.SHA, tag)) +} + +func gitLog(refs ...string) (string, error) { + var args = []string{"log", "--pretty=oneline", "--abbrev-commit"} + args = append(args, refs...) + return git(args...) } func getInfo() (tag, commit string, err error) { - tag, err = cleanGit("describe", "--tags", "--abbrev=0", "--always") + tag, err = cleanGit("describe", "--tags", "--abbrev=0") if err != nil { return } @@ -105,10 +114,17 @@ func getInfo() (tag, commit string, err error) { return } -func previous(tag string) (previous string, err error) { - previous, err = cleanGit("describe", "--tags", "--abbrev=0", "--always", tag+"^") +func previous(tag string) (result ref, err error) { + result.Tag = true + result.SHA, err = cleanGit("describe", "--tags", "--abbrev=0", tag+"^") if err != nil { - previous, err = cleanGit("rev-list", "--max-parents=0", "HEAD") + result.Tag = false + result.SHA, err = cleanGit("rev-list", "--max-parents=0", "HEAD") } return } + +type ref struct { + Tag bool + SHA string +} diff --git a/pipeline/git/git_test.go b/pipeline/git/git_test.go index 6a0f1dca7..35e8da3ab 100644 --- a/pipeline/git/git_test.go +++ b/pipeline/git/git_test.go @@ -150,10 +150,37 @@ func TestChangelog(t *testing.T) { assert.NoError(Pipe{}.Run(ctx)) assert.Equal("v0.0.2", ctx.Git.CurrentTag) assert.Contains(ctx.ReleaseNotes, "## Changelog") + assert.NotContains(ctx.ReleaseNotes, "first") assert.Contains(ctx.ReleaseNotes, "added feature 1") assert.Contains(ctx.ReleaseNotes, "fixed bug 2") } +func TestChangelogOfFirstRelease(t *testing.T) { + var assert = assert.New(t) + _, back := createAndChdir(t) + defer back() + gitInit(t) + var msgs = []string{ + "initial commit", + "another one", + "one more", + "and finally this one", + } + for _, msg := range msgs { + gitCommit(t, msg) + } + gitTag(t, "v0.0.1") + var ctx = &context.Context{ + Config: config.Project{}, + } + assert.NoError(Pipe{}.Run(ctx)) + assert.Equal("v0.0.1", ctx.Git.CurrentTag) + assert.Contains(ctx.ReleaseNotes, "## Changelog") + for _, msg := range msgs { + assert.Contains(ctx.ReleaseNotes, msg) + } +} + func TestCustomReleaseNotes(t *testing.T) { var assert = assert.New(t) _, back := createAndChdir(t)