import os import shutil import subprocess import sys import platform import subprocess import os import shutil import subprocess import sys import platform import re import configparser from time import sleep as delay # Get the current directory current_dir = os.path.dirname(os.path.abspath(__file__)) # Define the path to the firmware folder firmware_folder = os.path.join(current_dir, 'firmware') # Define the path to the release folder release_folder = os.path.join(current_dir, 'release') # Add the path to the PlatformIO executable to the system PATH platformio_path = os.path.expanduser('~/.platformio/penv/Scripts') if os.path.exists(release_folder): # If the release folder exists, delete it shutil.rmtree(release_folder) os.makedirs(release_folder) # Get the current Git branch name git_branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode().strip() commit_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD']).decode().strip()[:10] # If arguments are supplied, build the environments that match the arguments if len(sys.argv) > 1: environments = sys.argv[1:] # If no argument are supplied, build all environments listed in platformio.ini else: environments = [] with open(os.path.join(current_dir, 'platformio.ini')) as f: # Iterate over the lines in platformio.ini for line in f.readlines(): # Check if the line contains the string "env:" if '[env:' in line: # Extract the environment using regular expressions environment = re.search(r'\[env:(.*?)\]', line).group(1) # Add the environment to the list of environments environments.append(environment) # Remove old platformio.ini file from firmware folder if it exists if os.path.isfile(os.path.join(firmware_folder, 'platformio.ini')): os.remove(os.path.join(firmware_folder, 'platformio.ini')) # Copy the platformio.ini file to the firmware folder shutil.copyfile(os.path.join(current_dir, 'platformio.ini'), os.path.join(firmware_folder, 'platformio.ini')) # Check that the file is copied correctly if not os.path.isfile(os.path.join(firmware_folder, 'platformio.ini')): raise Exception('platformio.ini file not copied correctly') # Read the platformio.ini file config = configparser.ConfigParser() config.read(os.path.join(firmware_folder, 'platformio.ini')) # Add firmware version to build_flags in platformio.ini for environment in environments: if 'build_flags' not in config[f'env:{environment}']: config[f'env:{environment}']['build_flags'] = f'-DFW_VERSION=\\"{git_branch}_{environment}_{commit_hash}\\"' else: config[f'env:{environment}']['build_flags'] = config[f'env:{environment}']['build_flags'] + f' -DFW_VERSION=\\"{git_branch}_{environment}_{commit_hash}\\"' # if argument is not supplied, build all environments listed in platformio.ini if len(sys.argv) == 1: subprocess.run([f'{platformio_path}/platformio.exe', 'run','-c',f'{firmware_folder}/platformio.ini'], cwd=current_dir) for environment in environments: if(len(sys.argv) > 1): subprocess.run([f'{platformio_path}/platformio.exe', 'run', '-e', environment,'-c',f'{firmware_folder}/platformio.ini'], cwd=current_dir) # Iterate over the subfolders in the firmware folder for subfolder in os.listdir(firmware_folder): subfolder_path = os.path.join(firmware_folder, subfolder) # Check if the subfolder matches the environment argument if subfolder == environment: # Check if the subfolder contains a firmware.bin file firmware_file = os.path.join(subfolder_path, 'firmware.bin') if os.path.isfile(firmware_file): # Move the firmware.bin file to the release folder with the Git branch name and commit hash appended new_file_name = os.path.join(release_folder, f"{git_branch}_{subfolder}_{commit_hash}.bin") shutil.move(firmware_file, new_file_name)