#!/bin/bash #BASEDIR=$(dirname "$0") #cd "$BASEDIR" # 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" # Function to translate text using translate-shell translate() { text="$1" lang="$2" translation=$(trans -b :"$lang" "$text") echo "$translation" } # 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 new_version=$(echo "$current_version + 0.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 new_version=$(echo "$current_version + 1.1" | bc) 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 echo "building project..." echo "" . ${IDF_PATH}/export.sh >/dev/null 2>&1 # Clean the build directory #check if passing --clean to script if [ "$1" = "--clean" ]; then echo "cleaning project..." echo "" "$IDF_PATH/tools/idf.py" fullclean fi "$IDF_PATH/tools/idf.py" build # Check if the build was successful if [ $? -eq 0 ]; then # get project name in cmake file but the file contains multiple project texts project_name=$(grep -oP '(?<=project\().*(?=\))' CMakeLists.txt) 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 # git get current branch name branch_name=$(git rev-parse --abbrev-ref HEAD) # check if folder firmware_server_path exists and create if not exists if [ ! -d "$firmware_server_path" ]; then # promt user to create folder otherwise exit 1 echo "" echo "###############################################" echo "" echo "Folder $firmware_server_path does not exist!" exit 1 fi # check if folder exists and create if not exist in firmware_server_path / project_name if [ ! -d "$firmware_server_path/$project_name" ]; then # promt user to create folder otherwise exit 1 echo "" echo "###############################################" echo "" read -p "Device $project_name does not exist! Create it? (y/n) " create_folder if [ "$create_folder" = "y" ]; then mkdir -p "$firmware_server_path/$project_name" else echo "Cancelling script." exit 1 fi fi # check if folder exists and create if not exist in firmware_server_path / project_name / branch_name if [ ! -d "$firmware_server_path/$project_name/$branch_name" ]; then # promt user to create folder otherwise exit 1 echo "" echo "###############################################" echo "" read -p "Branch $branch_name does not exist! Create it? (y/n) " create_folder if [ "$create_folder" = "y" ]; then mkdir -p "$firmware_server_path/$project_name/$branch_name" else echo "Cancelling script." exit 1 fi fi # copy firmware file to firmware_server_path / project_name / branch_name cp "./build/$project_name.bin" "$firmware_server_path/$project_name/$branch_name/firmware$new_version.bin" # check if file exists and create one firmware_server_path / project_name / branch_name / info.json if [ ! -f "$firmware_server_path/$project_name/$branch_name/info.json" ]; then # promt user to create folder otherwise exit 1 echo "" echo "###############################################" echo "" read -p "File info.json does not exist! Create it? (y/n) " create_file if [ "$create_file" = "y" ]; then echo "creating file..." echo "" echo "{" >"$firmware_server_path/$project_name/$branch_name/info.json" echo " \"version\": \"$new_version\"," >>"$firmware_server_path/$project_name/$branch_name/info.json" echo " \"date\": \"$(date)\"" >>"$firmware_server_path/$project_name/$branch_name/info.json" echo "}" >>"$firmware_server_path/$project_name/$branch_name/info.json" else echo "Cancelling script." exit 1 fi 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 # 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) " agree_changes fi if [ "$changesFromFile" = "true" ] || [ "$agree_changes" = "y" ]; 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') # check if file exists and create one firmware_server_path / project_name / branch_name / changelog.json if [ ! -f "$firmware_server_path/$project_name/$branch_name/changelog.json" ]; then # create file with content {} echo "{}" >"$firmware_server_path/$project_name/$branch_name/changelog.json" fi # update version in changelog.json: add {version:{"de": "changes", "en": "changes"}} to the root {} echo "updating changelog.json..." new_entry="{\"de\": \"$changes_de_escaped\", \"en\": \"$changes_en_escaped\"}" jq --arg new_version "$new_version" --argjson new_entry "$new_entry" \ '. * {($new_version): $new_entry}' \ "$firmware_server_path/$project_name/$branch_name/changelog.json" >output.json if [ $? -eq 0 ]; then mv output.json "$firmware_server_path/$project_name/$branch_name/changelog.json" #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 else rm output.json echo "" echo "" echo "Error updating changelog.json!!!!" fi # translate changes_en to changes_de else echo "Cancelling script." exit 1 fi fi # update version in info.json echo "updating info.json..." sed -i "s/\"version\": \".*\"/\"version\": \"$new_version\"/g" "$firmware_server_path/$project_name/$branch_name/info.json" sed -i "s/\"date\": \".*\"/\"date\": \"$(date)\"/g" "$firmware_server_path/$project_name/$branch_name/info.json" #remove old version file rm "$version_file.backup" echo "" echo "" echo "###############################################" echo "" echo "Build successful :-) Firmware published!" 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