diff --git a/internal/changelog/const.go b/internal/changelog/const.go index 0cc0a84..3fa0b60 100644 --- a/internal/changelog/const.go +++ b/internal/changelog/const.go @@ -3,5 +3,5 @@ package changelog const ( title = "CHANGELOG" - defaultNodesLen = 10 + defaultLen = 10 ) diff --git a/internal/changelog/filter.go b/internal/changelog/filter.go new file mode 100644 index 0000000..5404985 --- /dev/null +++ b/internal/changelog/filter.go @@ -0,0 +1,40 @@ +package changelog + +import ( + "github.com/haunt98/changeloguru/internal/convention" +) + +func filter(commits []convention.Commit, scopes map[string]struct{}) map[string][]convention.Commit { + if len(commits) == 0 { + return nil + } + + filteredCommits := make(map[string][]convention.Commit) + filteredCommits[addedType] = make([]convention.Commit, 0, defaultLen) + filteredCommits[fixedType] = make([]convention.Commit, 0, defaultLen) + filteredCommits[othersType] = make([]convention.Commit, 0, defaultLen) + + for _, commit := range commits { + // If scopes is empty or commit scope is empty, pass all commits + if len(scopes) != 0 && commit.Scope != "" { + // Skip commit outside scopes + if _, ok := scopes[commit.Scope]; !ok { + continue + } + } + + t := getType(commit.Type) + switch t { + case addedType: + filteredCommits[addedType] = append(filteredCommits[addedType], commit) + case fixedType: + filteredCommits[fixedType] = append(filteredCommits[fixedType], commit) + case othersType: + filteredCommits[othersType] = append(filteredCommits[othersType], commit) + default: + continue + } + } + + return filteredCommits +} diff --git a/internal/changelog/generate.go b/internal/changelog/generate.go new file mode 100644 index 0000000..aa104c0 --- /dev/null +++ b/internal/changelog/generate.go @@ -0,0 +1,12 @@ +package changelog + +import ( + "fmt" + "time" + + "github.com/haunt98/clock" +) + +func generateVersionHeaderValue(version string, when time.Time) string { + return fmt.Sprintf("%s (%s)", version, clock.FormatDate(when)) +} diff --git a/internal/changelog/markdown.go b/internal/changelog/markdown.go index 8b3fe8e..9e037f6 100644 --- a/internal/changelog/markdown.go +++ b/internal/changelog/markdown.go @@ -1,12 +1,10 @@ package changelog import ( - "fmt" "strings" "time" "github.com/haunt98/changeloguru/internal/convention" - "github.com/haunt98/clock" "github.com/haunt98/markdown-go" ) @@ -17,57 +15,37 @@ const ( ) func GenerateMarkdown(commits []convention.Commit, scopes map[string]struct{}, version string, when time.Time) []markdown.Node { - if len(commits) == 0 { + filteredCommits := filter(commits, scopes) + if filteredCommits == nil { return nil } - commitBases := make(map[string][]markdown.Node) - commitBases[addedType] = make([]markdown.Node, 0, defaultNodesLen) - commitBases[fixedType] = make([]markdown.Node, 0, defaultNodesLen) - commitBases[othersType] = make([]markdown.Node, 0, defaultNodesLen) + addedNodes := convertToListMarkdownNodes(filteredCommits[addedType]) + fixedNodes := convertToListMarkdownNodes(filteredCommits[fixedType]) + othersNodes := convertToListMarkdownNodes(filteredCommits[othersType]) - for _, commit := range commits { - // If scopes is empty or commit scope is empty, pass all commits - if len(scopes) != 0 && commit.Scope != "" { - // Skip commit outside scopes - if _, ok := scopes[commit.Scope]; !ok { - continue - } - } + // 4 = 3 type header + 1 version header + nodes := make([]markdown.Node, 0, len(addedNodes)+len(fixedNodes)+len(othersNodes)+4) - t := getType(commit.Type) - switch t { - case addedType: - commitBases[addedType] = append(commitBases[addedType], markdown.NewListItem(commit.String())) - case fixedType: - commitBases[fixedType] = append(commitBases[fixedType], markdown.NewListItem(commit.String())) - case othersType: - commitBases[othersType] = append(commitBases[othersType], markdown.NewListItem(commit.String())) - default: - continue - } - } + // Adding each type - // Adding each type and header to nodes - nodes := make([]markdown.Node, 0, len(commitBases[addedType])+len(commitBases[fixedType])+len(commitBases[othersType])) - - if len(commitBases[addedType]) != 0 { + if len(addedNodes) != 0 { nodes = append(nodes, markdown.NewHeader(thirdLevel, addedType)) - nodes = append(nodes, commitBases[addedType]...) + nodes = append(nodes, addedNodes...) } - if len(commitBases[fixedType]) != 0 { + if len(fixedNodes) != 0 { nodes = append(nodes, markdown.NewHeader(thirdLevel, fixedType)) - nodes = append(nodes, commitBases[fixedType]...) + nodes = append(nodes, fixedNodes...) } - if len(commitBases[othersType]) != 0 { + if len(othersNodes) != 0 { nodes = append(nodes, markdown.NewHeader(thirdLevel, othersType)) - nodes = append(nodes, commitBases[othersType]...) + nodes = append(nodes, othersNodes...) } - // Adding title, version to nodes - versionHeader := fmt.Sprintf("%s (%s)", version, clock.FormatDate(when)) + // Adding title + versionHeader := generateVersionHeaderValue(version, when) nodes = append([]markdown.Node{ markdown.NewHeader(firstLevel, title), markdown.NewHeader(secondLevel, versionHeader), @@ -87,3 +65,13 @@ func ParseMarkdown(data string) []markdown.Node { return nodes } + +func convertToListMarkdownNodes(commits []convention.Commit) []markdown.Node { + result := make([]markdown.Node, 0, len(commits)) + + for _, commit := range commits { + result = append(result, markdown.NewListItem(commit.String())) + } + + return result +} diff --git a/internal/changelog/rst.go b/internal/changelog/rst.go index 38d23a2..8472549 100644 --- a/internal/changelog/rst.go +++ b/internal/changelog/rst.go @@ -1,67 +1,42 @@ package changelog import ( - "fmt" "strings" "time" "github.com/haunt98/changeloguru/internal/convention" - "github.com/haunt98/clock" "github.com/haunt98/rst-go" ) +// GenerateRST base on GenerateMarkdown func GenerateRST(commits []convention.Commit, scopes map[string]struct{}, version string, when time.Time) []rst.Node { - if len(commits) == 0 { + filteredCommits := filter(commits, scopes) + if filteredCommits == nil { return nil } - commitBases := make(map[string][]rst.Node) - commitBases[addedType] = make([]rst.Node, 0, defaultNodesLen) - commitBases[fixedType] = make([]rst.Node, 0, defaultNodesLen) - commitBases[othersType] = make([]rst.Node, 0, defaultNodesLen) + addedNodes := convertToListRSTNodes(filteredCommits[addedType]) + fixedNodes := convertToListRSTNodes(filteredCommits[fixedType]) + othersNodes := convertToListRSTNodes(filteredCommits[othersType]) - for _, commit := range commits { - // If scopes is empty or commit scope is empty, pass all commits - if len(scopes) != 0 && commit.Scope != "" { - // Skip commit outside scopes - if _, ok := scopes[commit.Scope]; !ok { - continue - } - } + nodes := make([]rst.Node, 0, len(addedNodes)+len(fixedNodes)+len(othersNodes)+4) - t := getType(commit.Type) - switch t { - case addedType: - commitBases[addedType] = append(commitBases[addedType], rst.NewListItem(commit.String())) - case fixedType: - commitBases[fixedType] = append(commitBases[fixedType], rst.NewListItem(commit.String())) - case othersType: - commitBases[othersType] = append(commitBases[othersType], rst.NewListItem(commit.String())) - default: - continue - } - } - - // Adding each type and header to nodes - nodes := make([]rst.Node, 0, len(commitBases[addedType])+len(commitBases[fixedType])+len(commitBases[othersType])) - - if len(commitBases[addedType]) != 0 { + if len(addedNodes) != 0 { nodes = append(nodes, rst.NewSubSection(addedType)) - nodes = append(nodes, commitBases[addedType]...) + nodes = append(nodes, addedNodes...) } - if len(commitBases[fixedType]) != 0 { + if len(fixedNodes) != 0 { nodes = append(nodes, rst.NewSubSection(fixedType)) - nodes = append(nodes, commitBases[fixedType]...) + nodes = append(nodes, fixedNodes...) } - if len(commitBases[othersType]) != 0 { + if len(othersNodes) != 0 { nodes = append(nodes, rst.NewSubSection(othersType)) - nodes = append(nodes, commitBases[othersType]...) + nodes = append(nodes, othersNodes...) } - // Adding title, version to nodes - versionHeader := fmt.Sprintf("%s (%s)", version, clock.FormatDate(when)) + versionHeader := generateVersionHeaderValue(version, when) nodes = append([]rst.Node{ rst.NewTitle(title), rst.NewSection(versionHeader), @@ -81,3 +56,13 @@ func ParseRST(data string) []rst.Node { return nodes } + +func convertToListRSTNodes(commits []convention.Commit) []rst.Node { + result := make([]rst.Node, 0, len(commits)) + + for _, commit := range commits { + result = append(result, rst.NewListItem(commit.String())) + } + + return result +}