Last active
December 11, 2024 17:14
-
-
Save valmat/cd64141685f2655c4a02d59902962ca3 to your computer and use it in GitHub Desktop.
Automatically creates a new tag and AI generated description for it
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env bash | |
set -e | |
model="gpt-4o" | |
temperature=0.8 | |
prompt="Below is the output of \`git log <latest_tag>..HEAD\`."` | |
`"\nPlease provide a perfect tag message."` | |
`"\nUse emojis in the message text when appropriate. Use past tense."` | |
`"\nProvide a message ready for direct substitution "` | |
`"(don't use \`\`\` and provide multiline message)." | |
# the hash of the commit that was marked with the last tag | |
latest_tag_hash=$(git rev-list --tags --max-count=1) | |
# the name of the last tag, using its hash | |
latest_tag=$(git describe --tags --abbrev=0 $latest_tag_hash) | |
# Output the commit log from the previous tag to the HEAD (current state) | |
# use the found name of the previous tag to start the story | |
message=`git log $latest_tag..HEAD` | |
minor_ver="${latest_tag##*.}" | |
base_ver="${latest_tag%.*}" | |
((minor_ver+=1)) | |
new_tag="${base_ver}.${minor_ver}" | |
echo "$latest_tag -> $new_tag" | |
if [ -z "$message" ]; then | |
echo "Nothing to commit, working tree clean" >&2 | |
exit 1 | |
fi | |
json_payload=$(jq -n \ | |
--arg model "$model" \ | |
--arg temperature "$temperature" \ | |
--arg prompt "$prompt" \ | |
--arg message "$message" \ | |
'{ | |
model: $model, | |
temperature: ($temperature | tonumber), | |
messages: [ | |
{ | |
role: "system", | |
content: $prompt | |
}, | |
{ | |
role: "user", | |
content: $message | |
} | |
] | |
}') | |
response=$(curl -s https://api.openai.com/v1/chat/completions \ | |
-H "Content-Type: application/json" \ | |
-H "Authorization: Bearer $OPENAI_API_KEY" \ | |
-d "$json_payload") | |
# Checking if the "error" key is in the response | |
if echo "$response" | jq -e '.error' > /dev/null; then | |
echo "Error: $(echo "$response" | jq -r '.error.message')" >&2 | |
exit 2 | |
else | |
# If there is no error, trying to extract the desired message | |
content=$(echo "$response" | jq -e -r '.choices[0].message.content') | |
# Checking if the message was extracted | |
if ! [[ $? -eq 0 ]]; then | |
# If the message could not be extracted, | |
# output the original text of the response to stderr | |
echo "Failed to extract the message. Response was:" >&2 | |
echo "$response" >&2 | |
exit 3 | |
fi | |
fi | |
description_file=$(mktemp) | |
echo "$content" > "$description_file" | |
nano "$description_file" | |
git tag -a "$new_tag" -m "$content" | |
cat "$description_file" | |
rm "$description_file" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment