From 015bf993bcfe475b3803fd27d2156d8ac199fb9b Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Sun, 18 Sep 2022 17:43:45 +0200
Subject: [PATCH] chore makefile and changelog

Signed-off-by: Volker Schukai <volker.schukai@schukai.com>
---
 .chglog/CHANGELOG.tpl.md | 27 +++++++++++++++++++
 .chglog/config.yml       | 57 ++++++++++++++++++++++++++++++++++++++++
 Makefile                 | 16 ++++++++---
 README.md                | 32 +++++++++++++++-------
 4 files changed, 120 insertions(+), 12 deletions(-)
 create mode 100755 .chglog/CHANGELOG.tpl.md
 create mode 100755 .chglog/config.yml

diff --git a/.chglog/CHANGELOG.tpl.md b/.chglog/CHANGELOG.tpl.md
new file mode 100755
index 0000000..8e98c0b
--- /dev/null
+++ b/.chglog/CHANGELOG.tpl.md
@@ -0,0 +1,27 @@
+{{ 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 .NoteGroups -}}
+{{ range .NoteGroups -}}
+### {{ .Title }}
+{{ range .Notes }}
+{{ .Body }}
+{{ end }}
+{{ end -}}
+{{ end -}}
+{{ end -}}
+
+{{- if .Versions }}
+{{ range .Versions -}}
+{{ if .Tag.Previous -}}
+[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
+{{ end -}}
+{{ end -}}
+{{ end -}}
\ No newline at end of file
diff --git a/.chglog/config.yml b/.chglog/config.yml
new file mode 100755
index 0000000..9b9b87e
--- /dev/null
+++ b/.chglog/config.yml
@@ -0,0 +1,57 @@
+style: gitlab
+template: CHANGELOG.tpl.md
+info:
+  title: CHANGELOG
+  repository_url: https://gitlab.schukai.com/oss/libraries/go/application/configuration
+options:
+  commits:
+    filters:
+      Type:
+        - feat
+        - fix
+        - doc
+        - refactor
+        - perf
+        - test
+        - chore
+        ## deprecated types and typos  
+        - docs
+        - documentation
+        - feat
+        - added
+        - add
+        - bugfix
+        - revert
+        - update
+        - updates
+        - change
+        - changed
+  commit_groups:
+    title_maps:
+      feat: Add Features
+      fix: Bug Fixes
+      doc: Documentation
+      refactor: Code Refactoring
+      perf: Performance Improvements
+      test: Tests
+      ## Chore is used for all other changes that don't fit in the other categories
+      chore: Changes
+      ## deprecated types and typos  
+      docs: Documentation
+      documentation: Documentation
+      added: Add Features
+      add: Add Features
+      bugfix: Bug Fixes
+      revert: Reverts
+      update: Changes
+      updates: Changes
+      change: Changes
+      changed: Changes
+  header:
+    pattern: "^((\\w+)\\s.*)$"
+    pattern_maps:
+      - Subject
+      - Type
+  notes:
+    keywords:
+      - BREAKING CHANGE
diff --git a/Makefile b/Makefile
index 0e828da..e4f9d61 100644
--- a/Makefile
+++ b/Makefile
@@ -61,8 +61,15 @@ ifndef VERSION_BIN
     $(shell curl -o $(VERSION_BIN_PATH) http://download.schukai.com/tools/version/version-$(shell uname -s | tr [:upper:] [:lower:])-$(shell echo `uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/`))
     $(shell chmod +x $(VERSION_BIN_PATH))
 endif
+
+GIT_CHGLOG_BIN := $(shell command -v git-chglog 2> /dev/null)
+
+ifeq ($(GIT_CHGLOG_BIN),)
+    $(shell go install github.com/git-chglog/git-chglog/cmd/git-chglog@latest)
+endif     
      
 RELEASE_FILE ?= $(PROJECT_ROOT)release.json
+CHANGELOG_FILE ?= $(PROJECT_ROOT)CHANGELOG.md
  
 ifeq ("$(wildcard $(RELEASE_FILE))","")
   $(shell echo '{"version":"0.1.0"}' > $(RELEASE_FILE))
@@ -72,21 +79,18 @@ PROJECT_VERSION ?= $(shell cat $(RELEASE_FILE) | jq -r .version)
 PROJECT_BUILD_DATE ?= $(shell $(VERSION_BIN) date)
 
 .PHONY: next-patch-version
-## create next patch version
 next-patch-version: check-clean-repo
 	echo "Creating next version"
 	$(VERSION_BIN) patch --path $(RELEASE_FILE) --selector "version"
 	git add $(RELEASE_FILE) && git commit -m "Bump version to $$(cat $(RELEASE_FILE) | jq -r .version)"
 
 .PHONY: next-minor-version
-## create next minor version
 next-minor-version: check-clean-repo
 	echo  "Creating next minor version"
 	$(VERSION_BIN) minor --path $(RELEASE_FILE) --selector "version"
 	git add $(RELEASE_FILE) && git commit -m "Bump version to $$( cat $(RELEASE_FILE) | jq -r .version)"
 
 .PHONY: next-major-version
-## create next major version
 next-major-version: check-clean-repo
 	echo "Creating next minor version"
 	$(VERSION_BIN) major --path $(RELEASE_FILE) --selector "version"
@@ -100,18 +104,24 @@ check-clean-repo:
 tag-patch-version: next-patch-version 
 	echo "Tagging patch version"
 	$(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
+	git-chglog --next-tag v$(PROJECT_VERSION) -o $(CHANGELOG_FILE)
+	git add $(CHANGELOG_FILE) && git commit -m "Update changelog"
 	git tag -a v$(PROJECT_VERSION) -m "Version $(PROJECT_VERSION)"
 
 ## tag repository with next minor version
 tag-minor-version: next-minor-version 
 	echo "Tagging minor version"
 	$(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
+	git-chglog --next-tag v$(PROJECT_VERSION) -o $(CHANGELOG_FILE)
+	git add $(CHANGELOG_FILE) && git commit -m "Update changelog"
 	git tag -a v$(PROJECT_VERSION) -m "Version $(PROJECT_VERSION)"
 
 ## tag repository with next major version
 tag-major-version: next-major-version 
 	echo "Tagging major version"
 	$(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
+	git-chglog --next-tag v$(PROJECT_VERSION) -o $(CHANGELOG_FILE)
+	git add $(CHANGELOG_FILE) && git commit -m "Update changelog"
 	git tag -a v$(PROJECT_VERSION) -m "Version $(PROJECT_VERSION)"
 
 GO_MOD_FILE := $(SOURCE_PATH)go.mod
diff --git a/README.md b/README.md
index e839769..b45923d 100644
--- a/README.md
+++ b/README.md
@@ -136,22 +136,36 @@ func handleRequest(w http.ResponseWriter, r *http.Request) {
 
 ```
 
-## Change Log
+## Contributing
 
-### 1.1.0
+Merge requests are welcome. For major changes, please open an issue first to discuss what
+you would like to change. **Please make sure to update tests as appropriate.**
 
-* Add `ContentType` function
+Versioning is done with [SemVer](https://semver.org/).
+Changelog is generated with [git-chglog](https://github.com/git-chglog/git-chglog#git-chglog)
 
-### 1.0.0   
+Commit messages should follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.
+Messages are started with a type, which is one of the following:
 
-* Initial release
+- **feat**: A new feature
+- **fix**: A bug fix
+- **doc**: Documentation only changes
+- **refactor**: A code change that neither fixes a bug nor adds a feature
+- **perf**: A code change that improves performance
+- **test**: Adding missing or correcting existing tests
+- **chore**: Other changes that don't modify src or test files
 
-## Contributing
+The footer would be used for a reference to an issue or a breaking change.
 
-Merge requests are welcome. For major changes, please open an issue first to discuss what
-you would like to change.
+A commit that has a footer `BREAKING CHANGE:`, or appends a ! after the type/scope,
+introduces a breaking API change (correlating with MAJOR in semantic versioning).
+A BREAKING CHANGE can be part of commits of any type.
+
+the following is an example of a commit message:
 
-Please make sure to update tests as appropriate.
+```text
+feat: add 'extras' field
+```
 
 ## License
 
-- 
GitLab