summaryrefslogtreecommitdiff
path: root/plugins/git-commit
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/git-commit')
-rw-r--r--plugins/git-commit/README.md42
-rw-r--r--plugins/git-commit/git-commit.plugin.zsh31
2 files changed, 73 insertions, 0 deletions
diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md
new file mode 100644
index 000000000..91cc73b44
--- /dev/null
+++ b/plugins/git-commit/README.md
@@ -0,0 +1,42 @@
+# git-commit plugin
+
+The git-commit plugin adds several [git aliases](https://www.git-scm.com/docs/git-config#Documentation/git-config.txt-alias) for [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/#summary) messages.
+
+To use it, add `git-commit` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... git-commit)
+```
+
+## Syntax
+
+```zsh
+git <type> [(-s, --scope) "<scope>"] "<message>"
+```
+
+> ⚠️ Single/Double quotes around the scope and message are required
+
+Where `type` is one of the following:
+
+- `build`
+- `chore`
+- `ci`
+- `docs`
+- `feat`
+- `fix`
+- `perf`
+- `refactor`
+- `rev`
+- `style`
+- `test`
+
+> NOTE: the alias for `revert` type is `rev`, as otherwise it conflicts with the git command of the same name.
+> It will still generate a commit message in the format `revert: <message>`
+
+## Examples
+
+| Git alias | Command |
+| --------------------------------------------- | ---------------------------------------------------- |
+| `git style "remove trailing whitespace"` | `git commit -m "style: remove trailing whitespace"` |
+| `git fix -s "router" "correct redirect link"` | `git commit -m "fix(router): correct redirect link"` |
+| `git rev -s "api" "rollback v2"` | `git commit -m "revert(api): rollback v2"` |
diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh
new file mode 100644
index 000000000..72cecb1d6
--- /dev/null
+++ b/plugins/git-commit/git-commit.plugin.zsh
@@ -0,0 +1,31 @@
+local -a _git_commit_aliases
+_git_commit_aliases=(
+ 'build'
+ 'chore'
+ 'ci'
+ 'docs'
+ 'feat'
+ 'fix'
+ 'perf'
+ 'refactor'
+ 'revert'
+ 'style'
+ 'test'
+)
+
+local alias type
+for type in "${_git_commit_aliases[@]}"; do
+ # an alias can't be named "revert" because the git command takes precedence
+ # https://stackoverflow.com/a/3538791
+ case "$type" in
+ revert) alias=rev ;;
+ *) alias=$type ;;
+ esac
+
+ local func='!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$type'(${scope}): ${@}"; else git commit -m "'$type': ${@}"; fi }; a'
+ if ! git config --global --get-all alias.${alias} >/dev/null 2>&1; then
+ git config --global alias.${alias} "$func"
+ fi
+done
+
+unset _git_commit_aliases alias type func