Skip to content

Commit

Permalink
feat: Add Commits To Unreleased Even When No Tags
Browse files Browse the repository at this point in the history
When there are commits but no tags, then insert those commits under
the unreleased section of the change log output. This requires get
an updated CHANGELOG.md.tpl file. Includig the template footer to
account for the unreleased line there that used .Versions.

resolves git-chglog#76

BREAKING CHANGE:

* No longer throw the error "no tags" when:
   * No tag query entered
   * There are commits to tag
* Requires an update to the changelog template
  • Loading branch information
b01 committed Jun 29, 2023
1 parent 03f0a44 commit 175b6f3
Show file tree
Hide file tree
Showing 7 changed files with 303 additions and 22 deletions.
27 changes: 19 additions & 8 deletions chglog.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ type Info struct {

// RenderData is the data passed to the template
type RenderData struct {
Info *Info
Unreleased *Unreleased
Versions []*Version
Info *Info
Unreleased *Unreleased
Versions []*Version
UnreleasedHash *Hash
}

// Config for generating CHANGELOG
Expand Down Expand Up @@ -162,7 +163,7 @@ func (gen *Generator) Generate(w io.Writer, query string) error {
return err
}

if len(versions) == 0 {
if len(versions) == 0 && query != "" {
return fmt.Errorf("commits corresponding to \"%s\" was not found", query)
}

Expand Down Expand Up @@ -284,7 +285,8 @@ func (gen *Generator) getTags(query string) ([]*Tag, string, error) {
}, tags...)
}

if len(tags) == 0 {
// Error only when you explicitly set a query
if len(tags) == 0 && query != "" {
return nil, "", errors.New("git-tag does not exist")
}

Expand Down Expand Up @@ -353,9 +355,18 @@ func (gen *Generator) render(w io.Writer, unreleased *Unreleased, versions []*Ve

t := template.Must(template.New(fname).Funcs(sprig.TxtFuncMap()).Funcs(fmap).ParseFiles(gen.config.Template))

unreleasedHash := &Hash{}

if unreleased.CommitGroups != nil && len(unreleased.CommitGroups) > 0 {
unreleasedHash = unreleased.CommitGroups[0].Commits[0].Hash
} else if unreleased.Commits != nil && len(unreleased.Commits) > 0 {
unreleasedHash = unreleased.Commits[0].Hash
}

return t.Execute(w, &RenderData{
Info: gen.config.Info,
Unreleased: unreleased,
Versions: versions,
Info: gen.config.Info,
Unreleased: unreleased,
Versions: versions,
UnreleasedHash: unreleasedHash,
})
}
111 changes: 107 additions & 4 deletions chglog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func cleanup() {

func TestGeneratorNotFoundTags(t *testing.T) {
assert := assert.New(t)
testName := "not_found"
testName := "no_tags"

setup(testName, func(commit commitFunc, _ tagFunc, _ gitcmd.Client) {
commit("2018-01-01 00:00:00", "feat(*): New feature", "")
Expand All @@ -91,9 +91,8 @@ func TestGeneratorNotFoundTags(t *testing.T) {
err := gen.Generate(buf, "")
expected := strings.TrimSpace(buf.String())

assert.Error(err)
assert.Contains(err.Error(), "git-tag does not exist")
assert.Equal("", expected)
assert.Nil(err)
assert.Contains(expected, "<a name=\"unreleased\"></a>\n## [Unreleased]")
}

func TestGeneratorNotFoundCommits(t *testing.T) {
Expand Down Expand Up @@ -629,3 +628,107 @@ func TestGeneratorWithSprig(t *testing.T) {
[2.0.0]: https://github.com/git-chglog/git-chglog/compare/1.0.0...2.0.0`, expected)

}

var (
styleGitHub = "github"
fmtTypeScopeSubject = "<type>(<scope>): <subject>"
tplKeepAChangelog = "keep-a-changelog"
)

func TestNewRepoUnreleasedCommitsButNoTags(t *testing.T) {
asrt := assert.New(t)
testName := "commits_and_no_tags"

setup(testName, func(commit commitFunc, tag tagFunc, _ gitcmd.Client) {
commit("2023-06-25 00:00:00", "feat: Second Feature", "")
commit("2023-06-24 00:00:00", "feat: First Feature", "")
})

gen := NewGenerator(NewLogger(os.Stdout, os.Stderr, false, true),
&Config{
Bin: "git",
WorkingDir: filepath.Join(testRepoRoot, testName),
Template: filepath.Join(cwd, "testdata", testName+".md"),
Info: &Info{
Title: "CHANGELOG Example",
RepositoryURL: "https://github.com/git-chglog/git-chglog",
},
Options: &Options{
CommitGroupBy: "Type",
CommitGroupTitleMaps: map[string]string{
"feat": "Features",
},
HeaderPattern: "^(\\w*)\\:\\s(.*)$",
HeaderPatternMaps: []string{
"Type",
"Subject",
}},
})

buf := &bytes.Buffer{}
err := gen.Generate(buf, "")
actual := strings.TrimSpace(buf.String())

asrt.NoError(err)
asrt.Contains(actual, `<a name="unreleased"></a>
## [Unreleased]
### Features
- First Feature
- Second Feature
[Unreleased]: https://github.com/git-chglog/git-chglog/compare/`)

}

func TestNewRepoUnreleasedCommitsWithNextTag(t *testing.T) {
asrt := assert.New(t)
testName := "commits_and_next_tag"

setup(testName, func(commit commitFunc, tag tagFunc, _ gitcmd.Client) {
commit("2023-06-25 00:00:00", "feat: Second Feature", "")
commit("2023-06-24 00:00:00", "feat: First Feature", "")
})

gen := NewGenerator(NewLogger(os.Stdout, os.Stderr, false, true),
&Config{
Bin: "git",
WorkingDir: filepath.Join(testRepoRoot, testName),
Template: filepath.Join(cwd, "testdata", testName+".md"),
Info: &Info{
Title: "CHANGELOG Example",
RepositoryURL: "https://github.com/git-chglog/git-chglog",
},
Options: &Options{
NextTag: "0.1.0",
CommitGroupBy: "Type",
CommitGroupTitleMaps: map[string]string{
"feat": "Features",
},
HeaderPattern: "^(\\w*)\\:\\s(.*)$",
HeaderPatternMaps: []string{
"Type",
"Subject",
}},
})

buf := &bytes.Buffer{}
err := gen.Generate(buf, "")
actual := strings.TrimSpace(buf.String())

asrt.NoError(err)
asrt.Equal(`<a name="unreleased"></a>
## [Unreleased]
<a name="0.1.0"></a>
## 0.1.0 - 2023-06-24
### Features
- First Feature
- Second Feature
[Unreleased]: https://github.com/git-chglog/git-chglog/compare/0.1.0...HEAD`, actual)

}
18 changes: 12 additions & 6 deletions cmd/git-chglog/kac_template_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (t *kacTemplateBuilderImpl) unreleased(style, format string) string {
title = fmt.Sprintf("[%s]", title)
}

return fmt.Sprintf(`{{ if .Versions -}}
return fmt.Sprintf(`{{ if .Unreleased -}}
%s## %s
{{ if .Unreleased.CommitGroups -}}
Expand Down Expand Up @@ -156,24 +156,30 @@ func (*kacTemplateBuilderImpl) footer(style string) string {
case styleGitHub, styleGitLab:
return `
{{- if .Versions }}
{{ if .UnreleasedHash.Short -}}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ .UnreleasedHash.Short }}...HEAD
{{ end -}}
{{ if .Versions -}}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ end -}}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
{{ end -}}`
case styleBitbucket:
return `
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/HEAD..{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}
{{ if .UnreleasedHash.Short -}}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ .UnreleasedHash.Short }}...HEAD
{{ end -}}
{{ if .Versions -}}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ end -}}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Name }}..{{ .Tag.Previous.Name }}
{{ end -}}
{{ end -}}
{{ end -}}`
default:
return ""
Expand Down
11 changes: 7 additions & 4 deletions cmd/git-chglog/kac_template_builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func TestKACTemplateBuilderDefault(t *testing.T) {
})

assert.Nil(err)
assert.Equal(`{{ if .Versions -}}
assert.Equal(`{{ if .Unreleased -}}
<a name="unreleased"></a>
## [Unreleased]
Expand Down Expand Up @@ -67,13 +67,16 @@ func TestKACTemplateBuilderDefault(t *testing.T) {
{{ end -}}
{{ end -}}
{{- if .UnreleasedHash.Short }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ .UnreleasedHash.Short }}...HEAD
{{ end -}}
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ end -}}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}

Expand All @@ -90,7 +93,7 @@ func TestKACTemplateBuilderNone(t *testing.T) {
})

assert.Nil(err)
assert.Equal(`{{ if .Versions -}}
assert.Equal(`{{ if .Unreleased -}}
## Unreleased
{{ if .Unreleased.CommitGroups -}}
Expand Down Expand Up @@ -150,7 +153,7 @@ func TestKACTemplateBuilderSubject(t *testing.T) {
})

assert.Nil(err)
assert.Equal(`{{ if .Versions -}}
assert.Equal(`{{ if .Unreleased -}}
## Unreleased
{{ if .Unreleased.CommitGroups -}}
Expand Down
52 changes: 52 additions & 0 deletions testdata/commits_and_next_tag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{{ if .Unreleased -}}
<a name="unreleased"></a>
## [Unreleased]

{{ if .Unreleased.CommitGroups -}}
{{ range .Unreleased.CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}

{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
- {{ .Revert.Header }}
{{ end }}
{{ end -}}

{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

{{- if .UnreleasedHash.Short }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ .UnreleasedHash.Short }}...HEAD
{{ end -}}
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ end -}}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
52 changes: 52 additions & 0 deletions testdata/commits_and_no_tags.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{{ if .Unreleased -}}
<a name="unreleased"></a>
## [Unreleased]

{{ if .Unreleased.CommitGroups -}}
{{ range .Unreleased.CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}

{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
- {{ .Revert.Header }}
{{ end }}
{{ end -}}

{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

{{- if .UnreleasedHash.Short }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ .UnreleasedHash.Short }}...HEAD
{{ end -}}
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ end -}}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
Loading

0 comments on commit 175b6f3

Please sign in to comment.