dotfiles/dot_config/git/hooks/executable_prepare-commit-msg
2024-04-14 18:41:15 -07:00

137 lines
3.9 KiB
Fish

#!/usr/bin/env fish
set -l msg_file $argv[1]
set -l commit_type $(string trim $argv[2])
set -l commit_sha $(string trim $argv[3])
# Rebasing || cherry-picking.
if test "$commit_type" = messageg || test "$commit_type" = message
exit 0
end
if test -n "$commit_sha"
gum confirm "Create a new commit message?" || exit 0
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set -l gitmojis $(curl -s https://gitmoji.dev/api/gitmojis | jello -rl '\
result = []
for entry in _.gitmojis:
item = entry.emoji + " - " + entry.description
if entry.semver is not None:
item += " \033[91;3m(" + entry.semver + ")\033[0m"
result.append(item)
result
')
set -l types \
"build: Changes that affect the build system or external dependencies" \
"ci: Changes to the CI configuration files and scripts" \
"docs: Documentation only changes" \
"feat: A new feature" \
"fix: A bug fix" \
"perf: A code change that improves performance" \
"refactor: A code change that neither fixes a bug nor adds a feature" \
"style: Changes that do not affect the meaning of the code" \
"test: Adding missing tests or correcting existing tests" \
"chore: Update dependencies; bump version numbers; etc"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# HAS to be global so the function has access to it.
set -g gitmoji "$(gum filter --height=10 $gitmojis)"
# Abort if no emoji was selected
if ! test -n "$gitmoji"
exit 1
end
set -l emoji $(string sub --length 1 $gitmoji)
function breaking
string match -rq '\(major\)' "$gitmoji"
end
# function minor
# string match -rq '\(minor\)' "$gitmoji"
# end
#
# function patch
# string match -r '\(patch\)' "$gitmoji"
# end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set -l type $(gum filter --height=10 $types)
set type $(string match --regex '^[a-z]+' $type)
set -l scope $(gum input --placeholder "scope")
test -n "$scope" && set scope "($scope)"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set -l summary "$type$scope: "
breaking && set summary "$type$scope!: "
set summary $(gum input --value "$summary" --placeholder "Summary of this change")
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set -l footer ""
breaking && set footer $(gum input --value "BREAKING CHANGE: " --placeholder "The breaking change being introduced")
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# if breaking && test "$(git_current_branch)" = "$(git_main_branch)"
# set -l msg "You are commiting a breaking change on to the main branch. Continue commit?\n(Selecting no will save your commit message to the clipboard)"
#
# gum confirm $msg || begin
# copyq copy "$emoji $summary\n$description$footer"
# exit
# end
# end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set -l msg "$(cat $msg_file)"
set -l new_msg "$emoji $summary\n\n"
if test ! -z "$footer"
set new_msg "$new_msg$footer\n\n"
end
set new_msg "$new_msg$msg"
echo -e "$new_msg" >"$msg_file"
# function tag
# if breaking || minor || patch
# if test "$(git_current_branch)" = "$(git_main_branch)"
# gum confirm "Bump version number and tag commit?" || return
#
# set -f last $(git describe --tags --abbrev=0 || 'v0.0.0')
# set last $(string replace v '' $last | string split .)
#
# set -f i 0
# if breaking
# set i 1
# else if minor
# set i 2
# else if patch
# set i 3
# end
#
# if test $i -gt 0
# set last[$i] $(math $last[$i] + 1)
# end
#
# set -f new "$last[1].$last[2].$last[3]"
# git tag -a "v$new" -m "Version $new"
# end
# end
# end