Skip to content

Instantly share code, notes, and snippets.

@valmat
Last active February 29, 2024 13:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save valmat/44822e1b7c6884bebb25b3ff005117fe to your computer and use it in GitHub Desktop.
Save valmat/44822e1b7c6884bebb25b3ff005117fe to your computer and use it in GitHub Desktop.
AI git commit filler
#!/bin/env bash
set -e
model="gpt-4-turbo-preview";
temperature=0.8;
prompt="Here is the output of \`git diff HEAD\`. Please provide the perfect commit message."`
`" Use emjoi if it is possible. Use past tense in the title. "`
`"(# If there is an error in the code, report it in the comments to the commit please)."
# checking whether the argument was passed to the script
if ! [[ $# -eq 0 ]]; then
prompt="${prompt} Use the following hint to generate a message for the commit: \`$1\`."`
`"The the commit message language is strictly English."
fi
git add . --all
massege=$(git diff HEAD)
if [ -z "$massege" ]; 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 massege "$massege" \
'{
model: $model,
temperature: ($temperature | tonumber),
messages: [
{
role: "system",
content: $prompt
},
{
role: "user",
content: $massege
}
]
}')
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"
cat "$description_file"
cat "$description_file" | sed '/^#/d' > "${description_file}.tmp"
mv "${description_file}.tmp" "$description_file"
git commit -a --file "$description_file"
rm "$description_file"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment