346 lines
9.9 KiB
Bash
346 lines
9.9 KiB
Bash
#!/bin/bash
|
|
|
|
cd "../../"
|
|
|
|
# echo Project path
|
|
echo "Project Path: $(pwd)"
|
|
|
|
# Set the IDF_PATH environment variable to point to the ESP-IDF installation
|
|
export IDF_PATH=~/esp/esp-idf
|
|
|
|
version_file="version.txt"
|
|
initial_version="1.0"
|
|
initProject="false"
|
|
|
|
firmware_server_path="./firmwareserver"
|
|
|
|
upload_server="$2"
|
|
firmware_server="$3"
|
|
|
|
|
|
# Function to translate text using translate-shell
|
|
translate() {
|
|
text="$1"
|
|
lang="$2"
|
|
translation=$(trans -b :"$lang" "$text")
|
|
echo "$translation"
|
|
}
|
|
|
|
urlencode() {
|
|
# Usage: urlencode "string"
|
|
local data
|
|
data="$(curl -Go /dev/null --data-urlencode "$1" "")"
|
|
data=${data#?} # remove leading "?"
|
|
echo "$data"
|
|
}
|
|
|
|
# check if backup file exists and restore it
|
|
if [ -f "$version_file.backup" ]; then
|
|
mv "$version_file.backup" "$version_file"
|
|
fi
|
|
|
|
# Check if version file exists
|
|
if [ -f "$version_file" ]; then
|
|
current_version=$(cat "$version_file")
|
|
else
|
|
echo ""
|
|
echo ""
|
|
read -p "Version file not found. Create version.txt with initial version $initial_version? (y/n) " create_new
|
|
if [ "$create_new" = "y" ]; then
|
|
echo "$initial_version" >"$version_file"
|
|
current_version="$initial_version"
|
|
initProject="true"
|
|
else
|
|
echo "Cancelling script."
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
|
|
# check if project is initialized
|
|
if [ "$initProject" = "true" ]; then
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "Project initialized with version $initial_version"
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
|
|
else
|
|
|
|
# create backup file from version.txt
|
|
cp "$version_file" "$version_file.backup"
|
|
|
|
# Ask user for input
|
|
|
|
echo ""
|
|
echo ""
|
|
read -p "Is this a bugfix update (y/n)? [y]" bug_fixes
|
|
|
|
if [ "$bug_fixes" = "y" ] || [ "$bug_fixes" = "" ]; then
|
|
# current version string are two numbers separated by a dot (e.g. 1.0) so split to two variables
|
|
major_version=$(echo "$current_version" | cut -d. -f1)
|
|
minor_version=$(echo "$current_version" | cut -d. -f2)
|
|
|
|
# increment minor version
|
|
new_version="$major_version.$(echo "$minor_version + 1" | bc)"
|
|
else
|
|
echo ""
|
|
echo ""
|
|
read -p "Are there major changes (y/n)? [n]" major_changes
|
|
|
|
# Determine the version increment based on user input
|
|
if [ "$major_changes" = "y" ]; then
|
|
# current version string are two numbers separated by a dot (e.g. 1.0) so split to two variables
|
|
major_version=$(echo "$current_version" | cut -d. -f1)
|
|
minor_version=$(echo "$current_version" | cut -d. -f2)
|
|
|
|
# increment major version
|
|
new_version="$(echo "$major_version + 1" | bc).0"
|
|
else
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "No version change needed."
|
|
echo ""
|
|
echo "###############################################"
|
|
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Update version in the file
|
|
echo "$new_version" >"$version_file"
|
|
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "Update and publish firmware to version: $new_version ..."
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
fi
|
|
|
|
# get project name in cmake file but the file contains multiple project texts
|
|
project_name=$(grep -oP '(?<=project\().*(?=\))' CMakeLists.txt)
|
|
|
|
# git get current branch name
|
|
branch_name=$(git rev-parse --abbrev-ref HEAD)
|
|
|
|
# make curl get request to $3 url and set response to $response
|
|
response=$(curl -s "$firmware_server/getVersion?device=$project_name&branch=$branch_name")
|
|
|
|
# response is {"error":"Device not found"}
|
|
# response is {"version":"1.0"}
|
|
|
|
# check if response contains error
|
|
if echo "$response" | grep -q "error"; then
|
|
echo ""
|
|
echo "############### WARNING ####################"
|
|
echo ""
|
|
echo "Device '$project_name' on branch '$branch_name' not found in firmware server!"
|
|
echo ""
|
|
read -p "Create device in firmware server? (y/n) " create_device
|
|
if [ "$create_device" = "y" ]; then
|
|
|
|
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "Device '$project_name' on branch '$branch_name' will be created in firmware server."
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
else
|
|
echo "Cancelling script."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
oldversion="none"
|
|
|
|
# check if response contains version
|
|
if echo "$response" | grep -q "version"; then
|
|
# get version from response
|
|
oldversion=$(echo "$response" | grep -oP '(?<="version":").*(?=")')
|
|
#echo ""
|
|
#echo "###############################################"
|
|
#echo ""
|
|
#echo "Device $project_name found in firmware server with version $oldversion"
|
|
#echo ""
|
|
#echo "###############################################"
|
|
#echo ""
|
|
fi
|
|
|
|
|
|
|
|
. ${IDF_PATH}/export.sh >/dev/null 2>&1
|
|
|
|
# Clean the build directory
|
|
|
|
# ask user if clean build directory
|
|
#echo ""
|
|
#echo "###############################################"
|
|
echo ""
|
|
read -p "Clean build directory? (y/n) [n]" clean_build
|
|
|
|
if [ "$clean_build" = "y" ]; then
|
|
echo "cleaning project..."
|
|
echo ""
|
|
"$IDF_PATH/tools/idf.py" fullclean
|
|
fi
|
|
|
|
echo "building project..."
|
|
echo ""
|
|
|
|
"$IDF_PATH/tools/idf.py" build
|
|
|
|
# Check if the build was successful
|
|
if [ $? -eq 0 ]; then
|
|
|
|
echo "project name: $project_name"
|
|
|
|
# check if project_name.bin file in ./build directory exists
|
|
if [ -f "./build/$project_name.bin" ]; then
|
|
echo "firmware file found: $project_name.bin"
|
|
else
|
|
echo "firmware file not found: $project_name.bin"
|
|
exit 1
|
|
fi
|
|
|
|
# check if ./changelog_en.txt exists If not exists create empty file
|
|
if [ ! -f "./changelog_en.txt" ]; then
|
|
echo "creating changelog_en.txt..."
|
|
echo "" >"./changelog_en.txt"
|
|
fi
|
|
|
|
# read changelog_en.txt
|
|
changes_en=$(cat "./changelog_en.txt")
|
|
|
|
# check if changes_en is empty or contains no letters or numbers
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
|
|
if [ -z "$changes_en" ] || [ ! -n "$(echo "$changes_en" | sed -e 's/[[:space:]]//g')" ]; then
|
|
|
|
echo "Enter quick changes:"
|
|
echo ""
|
|
read -p "English: " changes_en
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
else
|
|
changesFromFile="true"
|
|
fi
|
|
|
|
echo "English changes:"
|
|
echo "$changes_en"
|
|
|
|
changes_de=$(translate "$changes_en" de)
|
|
echo ""
|
|
echo "German changes:"
|
|
echo "$changes_de"
|
|
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
|
|
# check if var "changesFromFile" is true
|
|
|
|
if [ "$changesFromFile" = "true" ]; then
|
|
# ask to agree or edit changes
|
|
read -p "Do you agree with the changes? (y/n) [y]" agree_changes
|
|
if [ "$agree_changes" != "y" ] && [ "$agree_changes" != "" ]; then
|
|
echo "Enter changes:"
|
|
echo ""
|
|
read -p "English: " changes_en
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "English changes:"
|
|
echo "$changes_en"
|
|
echo ""
|
|
changes_de=$(translate "$changes_en" de)
|
|
|
|
echo "German changes:"
|
|
echo "$changes_de"
|
|
echo ""
|
|
changesFromFile="false"
|
|
fi
|
|
fi
|
|
|
|
myChangelogs=""
|
|
|
|
# if changes entered ask to agree or discard
|
|
if [ ! -z "$changes_de" ] || [ ! -z "$changes_en" ]; then
|
|
if [ "$changesFromFile" != "true" ]; then
|
|
read -p "Do you agree with the changes? (y/n) [y]" agree_changes
|
|
fi
|
|
|
|
if [ "$changesFromFile" = "true" ] || [ "$agree_changes" = "y" ] || [ "$agree_changes" = "" ]; then
|
|
|
|
# escape to json in $changes_de and $changes_en
|
|
changes_de_escaped=$(echo "$changes_de" | sed ':a;N;$!ba;s/\n/\\n/g')
|
|
changes_en_escaped=$(echo "$changes_en" | sed ':a;N;$!ba;s/\n/\\n/g')
|
|
|
|
myChangelogs="{\"changelog\":{\"de\": \"$changes_de_escaped\", \"en\": \"$changes_en_escaped\"}}"
|
|
|
|
|
|
|
|
#create changelogs folder if not exists
|
|
if [ ! -d "./changelogs" ]; then
|
|
mkdir "./changelogs"
|
|
fi
|
|
|
|
if [ "$changesFromFile" = "true" ]; then
|
|
|
|
mv "changelog_en.txt" "./changelogs/$project_name-$new_version-en.txt"
|
|
touch "changelog_en.txt"
|
|
else
|
|
# write changes_en to "./changelogs/$project_name-$new_version-en.txt"
|
|
echo "$changes_en" >"./changelogs/$project_name-$new_version-en.txt"
|
|
fi
|
|
|
|
echo "sending changelog to firmware server..."
|
|
response=$(curl -s -G "$upload_server/updateChangelog?key=$1&device=$project_name&branch=$branch_name&version=$new_version" --data-urlencode "changelogs=$myChangelogs")
|
|
echo "$response"
|
|
echo ""
|
|
else
|
|
echo "Cancelling script."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# upload firmware file to upload server
|
|
echo "uploading firmware file to firmware server..."
|
|
|
|
|
|
response=$(curl -F "file=@./build/$project_name.bin" "$upload_server/upload?key=$1&device=$project_name&branch=$branch_name&version=$new_version")
|
|
echo "$response"
|
|
|
|
#remove old version file
|
|
rm "$version_file.backup"
|
|
|
|
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "Build successful :-) Firmware published and updated from $oldversion to $new_version !"
|
|
|
|
exit 0
|
|
else
|
|
# Restore the version file from backup
|
|
mv "$version_file.backup" "$version_file"
|
|
|
|
echo ""
|
|
echo ""
|
|
echo "###############################################"
|
|
echo ""
|
|
echo "Build failed. Firmware will NOT be published!"
|
|
echo ""
|
|
echo "###############################################"
|
|
exit 1
|
|
fi
|