feat(scripts): changelog script
This commit is contained in:
parent
02dacd5e70
commit
b583fa54a6
138
scripts/changelog.sh
Executable file
138
scripts/changelog.sh
Executable file
@ -0,0 +1,138 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
config_file=.version.json
|
||||||
|
|
||||||
|
reverse() {
|
||||||
|
if which tac >/dev/null 2>&1; then
|
||||||
|
tac
|
||||||
|
else
|
||||||
|
tail -r
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_config() {
|
||||||
|
sha="$(git rev-parse --short HEAD)"
|
||||||
|
(
|
||||||
|
echo '{'
|
||||||
|
echo '"version": "0.0.0",'
|
||||||
|
echo '"sha": "'"$sha"'"'
|
||||||
|
echo '}'
|
||||||
|
) | jq . > $config_file
|
||||||
|
}
|
||||||
|
|
||||||
|
get_git_commits() {
|
||||||
|
since_hash="$(jq '.sha' < $config_file | tr -d '"')"
|
||||||
|
git rev-list "$since_hash..HEAD"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_git_commit_subject() {
|
||||||
|
git show -s --format=%s "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_git_commit_body() {
|
||||||
|
git show -s --format=%b "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_commit_type() {
|
||||||
|
echo "$1" | sed -r -n 's/([a-z]+)(\(?|:?).*/\1/p'
|
||||||
|
}
|
||||||
|
|
||||||
|
get_commit_scope() {
|
||||||
|
echo "$1" | sed -r -n 's/[a-z]+\(([^)]+)\).*/\1/p'
|
||||||
|
}
|
||||||
|
|
||||||
|
get_commit_description() {
|
||||||
|
echo "$1" | sed -r -n 's/.*:[ ]+(.*)/\1/p'
|
||||||
|
}
|
||||||
|
|
||||||
|
get_commit_footer() {
|
||||||
|
with_colon=$(echo "$1" | sed -n '/^[A-Za-z-]\{1,\}: /,//{p;}')
|
||||||
|
with_hash=$(echo "$1" | sed -n '/^[A-Za-z-]\{1,\} #/,//{p;}')
|
||||||
|
|
||||||
|
if [ ${#with_colon} -gt ${#with_hash} ]; then
|
||||||
|
echo "$with_colon"
|
||||||
|
else
|
||||||
|
echo "$with_hash"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_commit_body() {
|
||||||
|
pattern=$(get_commit_footer "$1" | head -n 1)
|
||||||
|
if [ -n "$pattern" ]; then
|
||||||
|
echo "$1" | sed -e "/$pattern/,\$d"
|
||||||
|
else
|
||||||
|
echo "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_breaking_change() {
|
||||||
|
if echo "$1" | grep -q '!' || echo "$2" | grep -q 'BREAKING[ -]CHANGE: '; then
|
||||||
|
echo "yes"
|
||||||
|
else
|
||||||
|
echo "no"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_breaking_change() {
|
||||||
|
with_colon=$(echo "$1" | sed -n '/^BREAKING[ -]CHANGE: /,/^[A-Za-z-]\{1,\}: /{ s/BREAKING[ -]CHANGE: \(.*\)/\1/; /^[A-Za-z-]\{1,\}: /!p;}')
|
||||||
|
with_hash=$(echo "$1" | sed -n '/^BREAKING[ -]CHANGE: /,/^[A-Za-z-]\{1,\} #/{ s/BREAKING[ -]CHANGE: \(.*\)/\1/; /^[A-Za-z-]\{1,\} #/!p;}')
|
||||||
|
if [ -n "$with_colon" ] && ! echo "$with_colon" | grep -q '[A-Za-z-]\{1,\} #'; then
|
||||||
|
echo "$with_colon"
|
||||||
|
else
|
||||||
|
echo "$with_hash"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_changelog_entry() {
|
||||||
|
is_patch=0
|
||||||
|
is_minor=0
|
||||||
|
is_major=0
|
||||||
|
for commit in $(get_git_commits); do
|
||||||
|
git_subject=$(get_git_commit_subject "$commit")
|
||||||
|
git_body=$(get_git_commit_body "$commit")
|
||||||
|
|
||||||
|
type=$(get_commit_type "$git_subject")
|
||||||
|
scope=$(get_commit_scope "$git_subject")
|
||||||
|
description=$(get_commit_description "$git_subject")
|
||||||
|
body=$(get_commit_body "$git_body")
|
||||||
|
footer=$(get_commit_footer "$git_body")
|
||||||
|
breakingchange=$(get_breaking_change "$footer")
|
||||||
|
isbreaking=$(is_breaking_change "$git_subject" "$footer")
|
||||||
|
if [ "$isbreaking" = "yes" ] && [ -z "$breakingchange" ]; then
|
||||||
|
breakingchange="$body"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--------------------------------"
|
||||||
|
echo "Subject : $git_subject"
|
||||||
|
echo "Body: $git_body"
|
||||||
|
echo
|
||||||
|
echo "********************************"
|
||||||
|
echo
|
||||||
|
echo " - type : $type"
|
||||||
|
echo " - scope : $scope"
|
||||||
|
echo " - description : $description"
|
||||||
|
echo " - body : $body"
|
||||||
|
echo " - footer : $footer"
|
||||||
|
echo " - breakingchange : $breakingchange"
|
||||||
|
echo " - isbreaking : $isbreaking"
|
||||||
|
echo
|
||||||
|
echo "--------------------------------"
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init() {
|
||||||
|
if [ ! -f "$config_file" ]; then
|
||||||
|
echo "Generating a config ... "
|
||||||
|
generate_config
|
||||||
|
echo "Done"
|
||||||
|
else
|
||||||
|
echo "Using existing config"
|
||||||
|
fi
|
||||||
|
|
||||||
|
generate_changelog_entry
|
||||||
|
}
|
||||||
|
|
||||||
|
init
|
||||||
Loading…
Reference in New Issue
Block a user