From e2f267757ad0e14d5ab114ab3f7d613858403b26 Mon Sep 17 00:00:00 2001 From: William Petit Date: Wed, 23 Aug 2023 11:40:20 -0600 Subject: [PATCH] feat: add mkt-changelog task --- README.md | 3 +- doc/tasks/changelog.md | 26 ++++++++++ tasks/changelog.mk | 110 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 doc/tasks/changelog.md create mode 100644 tasks/changelog.mk diff --git a/README.md b/README.md index ac46e11..85122e1 100644 --- a/README.md +++ b/README.md @@ -36,4 +36,5 @@ Tâches [Make](https://fr.wikipedia.org/wiki/Make) génériques à utiliser de p |Tâches|Description|Documentation| |------|-----------|-------------| |`make mkt-webdav-upload`|Téléverser un fichier dans un répertoire WebDAV (Nextcloud)|[Voir ./doc/tasks/webdav.md](./doc/tasks/webdav.md)| -|`make mkt-gitea-release`|Créer une release sur un projet Gitea et téléverser des fichiers attachés|[Voir ./doc/tasks/gitea.md](./doc/tasks/gitea.md)| \ No newline at end of file +|`make mkt-gitea-release`|Créer une release sur un projet Gitea et téléverser des fichiers attachés|[Voir ./doc/tasks/gitea.md](./doc/tasks/gitea.md)| +|`make mkt-changelog`|Générer un fichier de `CHANGELOG.md` pour votre projet|[Voir ./doc/tasks/changelog.md](./doc/tasks/changelog.md)| \ No newline at end of file diff --git a/doc/tasks/changelog.md b/doc/tasks/changelog.md new file mode 100644 index 0000000..79109b8 --- /dev/null +++ b/doc/tasks/changelog.md @@ -0,0 +1,26 @@ +# Tâches Changelog + +## `make mkt-changelog` + +La tâche `mkt-changelog` permet de générer un fichier `CHANGELOG.md` avec l'outil [`git-chglog`](https://github.com/git-chglog/git-chglog) et de l'historique Git de votre projet. + +L'usage de cette tâche a pour prérequis que vos messages de commit respectent la spécification ["Conventional Commit"](https://www.conventionalcommits.org/fr/v1.0.0/). + +Par défaut voici [les types de commit](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#type) référencés par le fichier généré: + +- `feat` +- `fix` +- `perf` +- `refactor` +- `docs` + +### Usage + +Exemple d'utilisation de la tâche pour la génération du changelog du projet `https://forge.cadoles.com/MyOrg/MyProject` sur la forge: + +```makefile +my-changelog: + $(MAKE) MKT_GIT_CHGLOG_PROJECT_ORG=MyOrg MKT_GIT_CHGLOG_PROJECT_NAME=MyProject mkt-changelog +``` + +> **Note** Assurez vous d'avoir créé un premier tag sur la branche en cours avant d'exécuter la tâche. \ No newline at end of file diff --git a/tasks/changelog.mk b/tasks/changelog.mk new file mode 100644 index 0000000..e49eff5 --- /dev/null +++ b/tasks/changelog.mk @@ -0,0 +1,110 @@ +MKT_GIT_CHGLOG_VERSION ?= 0.15.4 +MKT_GIT_CHGLOG_DOWNLOAD_URL ?= https://github.com/git-chglog/git-chglog/releases/download/v$(MKT_GIT_CHGLOG_VERSION)/git-chglog_$(MKT_GIT_CHGLOG_VERSION)_linux_amd64.tar.gz +MKT_GIT_CHGLOG_ARGS ?= +MKT_GIT_CHGLOG_PROJECT_ORG ?= +export MKT_GIT_CHGLOG_PROJECT_ORG +MKT_GIT_CHGLOG_PROJECT_NAME ?= +export MKT_GIT_CHGLOG_PROJECT_NAME + +define _MKT_GIT_CHGLOG_CONFIG_SCRIPT = +mkdir -p .chglog +cat > .chglog/config.yml << EOF +style: github +template: CHANGELOG.tpl.md +info: + title: CHANGELOG + repository_url: https://forge.cadoles.com/${MKT_GIT_CHGLOG_PROJECT_ORG}/${MKT_GIT_CHGLOG_PROJECT_NAME} +options: + commits: + filters: + Type: + - feat + - fix + - perf + - refactor + - docs + commit_groups: + title_maps: + feat: Features + fix: Bug Fixes + perf: Performance Improvements + refactor: Code Refactoring + docs: Documentation + header: + pattern: "^(\\\\w*)(?:\\\\(([\\\\w\\\\$\\\\.\\\\-\\\\*\\\\s]*)\\\\))?\\\\:\\\\s(.*)$" + pattern_maps: + - Type + - Scope + - Subject + notes: + keywords: + - BREAKING CHANGE + issues: + prefix: + - '#' +EOF +endef +export MKT_GIT_CHGLOG_CONFIG_SCRIPT = $(value _MKT_GIT_CHGLOG_CONFIG_SCRIPT) + +define _MKT_GIT_CHGLOG_TEMPLATE_SCRIPT = +mkdir -p .chglog +cat > .chglog/CHANGELOG.tpl.md << EOF +{{ if .Versions -}} + +## [Unreleased] + +{{ if .Unreleased.CommitGroups -}} +{{ range .Unreleased.CommitGroups -}} +### {{ .Title }} +{{ range .Commits -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} +{{ end }} +{{ end -}} +{{ end -}} +{{ end -}} + +{{ range .Versions }} + +## {{ 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 }} +[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ \$latest := index .Versions 0 }}{{ \$latest.Tag.Name }}...HEAD +{{ range .Versions -}} +{{ if .Tag.Previous -}} +[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }} +{{ end -}} +{{ end -}} +{{ end -}} +EOF +endef +export MKT_GIT_CHGLOG_TEMPLATE_SCRIPT = $(value _MKT_GIT_CHGLOG_TEMPLATE_SCRIPT) + +mkt-changelog: .chglog/config.yml .chglog/CHANGELOG.tpl.md + tools/git-chglog/bin/git-chglog --output CHANGELOG.md $(MKT_GIT_CHGLOG_ARGS) + +.chglog/config.yml: + @eval "$$MKT_GIT_CHGLOG_CONFIG_SCRIPT" + +.chglog/CHANGELOG.tpl.md: + @eval "$$MKT_GIT_CHGLOG_TEMPLATE_SCRIPT" + +tools/git-chglog/bin/git-chglog: + mkdir -p tools/git-chglog/bin + grep -qF -- "tools/" ".gitignore" 2>/dev/null || echo "tools/" >> ".gitignore" + ( cd tools/git-chglog/bin && curl -sL "$(MKT_GIT_CHGLOG_DOWNLOAD_URL)" | tar -xz git-chglog ) \ No newline at end of file