diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md index f812ee23f..ca3aed21b 100644 --- a/plugins/git-commit/README.md +++ b/plugins/git-commit/README.md @@ -1,7 +1,6 @@ # 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 +The git-commit plugin adds several git subcommands 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: @@ -31,15 +30,13 @@ Where `type` is one of the following: - `test` - `wip` -> 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: ` - -> ⚠️ Enabling this plugin will (potentially) overwrite all `alias.` that you manually set. Use with -> care! +> NOTE: the subcommand 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: ` ## Examples -| Git alias | Command | +| Git subcommand | Command | | --------------------------------------------- | ---------------------------------------------------- | | `git style "remove trailing whitespace"` | `git commit -m "style: remove trailing whitespace"` | | `git wip "work in progress"` | `git commit -m "work in progress"` | diff --git a/plugins/git-commit/git-commands/git-build b/plugins/git-commit/git-commands/git-build new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-build @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-chore b/plugins/git-commit/git-commands/git-chore new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-chore @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-ci b/plugins/git-commit/git-commands/git-ci new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-ci @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-docs b/plugins/git-commit/git-commands/git-docs new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-docs @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-feat b/plugins/git-commit/git-commands/git-feat new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-feat @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-fix b/plugins/git-commit/git-commands/git-fix new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-fix @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-perf b/plugins/git-commit/git-commands/git-perf new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-perf @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-refactor b/plugins/git-commit/git-commands/git-refactor new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-refactor @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-rev b/plugins/git-commit/git-commands/git-rev new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-rev @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-style b/plugins/git-commit/git-commands/git-style new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-style @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-test b/plugins/git-commit/git-commands/git-test new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-test @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/git-wip b/plugins/git-commit/git-commands/git-wip new file mode 120000 index 000000000..4c054957e --- /dev/null +++ b/plugins/git-commit/git-commands/git-wip @@ -0,0 +1 @@ +./omz_git_commit \ No newline at end of file diff --git a/plugins/git-commit/git-commands/omz_git_commit b/plugins/git-commit/git-commands/omz_git_commit new file mode 100755 index 000000000..45f0b0c4e --- /dev/null +++ b/plugins/git-commit/git-commands/omz_git_commit @@ -0,0 +1,34 @@ +#!/usr/bin/env zsh + +_omz_git_commit() { + 0=${(%):-%x} + if [[ "$0" != */git-* ]]; then + echo >&2 "Expecting command named git-foo. Got '$0'." + return 1 + fi + + local _type="${0##*/git-}" + local _scope _attention _message + while [ $# -ne 0 ]; do + case $1 in + -s | --scope ) + if [ -z $2 ]; then + echo >&2 "Missing scope!" + return 1 + fi + _scope="$2" + shift 2 + ;; + -a | --attention ) + _attention="!" + shift 1 + ;; + * ) + _message="${_message} $1" + shift 1 + ;; + esac + done + git commit -m "${_type}${_scope:+(${_scope})}${_attention}:${_message}" +} +_omz_git_commit "$@" diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index c4df77c80..688200bb4 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -1,58 +1,48 @@ -local _rev="$(git -C $ZSH rev-parse HEAD 2> /dev/null)" -if [[ $_rev == $(git config --global --get oh-my-zsh.git-commit-alias 2> /dev/null) ]]; then - return -fi -git config --global oh-my-zsh.git-commit-alias "$_rev" +# Add git-commit commands directory to path +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" +0="${${(M)0:#/*}:-$PWD/$0}" +path=("${0:a:h}/git-commands" $path) -local -a _git_commit_aliases -_git_commit_aliases=( - 'build' - 'chore' - 'ci' - 'docs' - 'feat' - 'fix' - 'perf' - 'refactor' - 'revert' - 'style' - 'test' - 'wip' -) +# Append completions for custom git commands +() { + local -a git_user_commands + zstyle -a ':completion:*:*:git:*' user-commands 'git_user_commands' \ + || git_user_commands=() + git_user_commands+=( + build:'Commit with a message indicating a build' \ + chore:'Commit with a message indicating a chore' \ + ci:'Commit with a message indicating a CI change' \ + docs:'Commit with a message indicating an update to the documentation' \ + feat:'Commit with a message indicating a feature' \ + fix:'Commit with a message indicating a fix' \ + perf:'Commit with a message indicating a performance enhancement' \ + refactor:'Commit with a message indicating a refactor' \ + revert:'Commit with a message indicating a revert' \ + style:'Commit with a message indicating a style change' \ + test:'Commit with a message indicating updates to tests' \ + wip:'Commit with a message indicating a work in progress' + ) + zstyle ':completion:*:*:git:*' user-commands "${git_user_commands[@]}" +} -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() { -local _scope _attention _message -while [ $# -ne 0 ]; do -case $1 in - -s | --scope ) - if [ -z $2 ]; then - echo "Missing scope!" - return 1 +######################################################################################## +### Remove below after Jan 2025: +######################################################################################## +# Clean up aliases from the prior implementation of git-commit. Can be safely removed +# once everyone's .gitconfig has been restored. +() { + git config --global --get oh-my-zsh.git-commit-alias &> /dev/null || return 0 + local -a old_git_aliases=( + 'build' 'chore' 'ci' + 'docs' 'feat' 'fix' + 'perf' 'refactor' 'rev' + 'style' 'test' 'wip' + ) + local git_alias + for git_alias in $old_git_aliases; do + if [[ "$(git config --global --get alias.$git_alias | tr '\n' ' ')" == "!a() { local _scope _attention _message"* ]]; then + git config --global --unset alias.$git_alias fi - _scope="$2" - shift 2 - ;; - -a | --attention ) - _attention="!" - shift 1 - ;; - * ) - _message="${_message} $1" - shift 1 - ;; -esac -done -git commit -m "'$_type'${_scope:+(${_scope})}${_attention}:${_message}" -}; a' - - git config --global alias.$_alias "$_func" -done + done + git config --global --unset oh-my-zsh.git-commit-alias +}