import os import argparse import shutil GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07" GIT_HASH_BIN = bytes.fromhex(GIT_HASH) INITIAL_DIR = os.path.dirname(os.path.abspath(__file__)) APP_VER_ADDRESS = 0xFE000 GOLDEN_ADDRESS = 0x006E000 def get_git_hash(): # Проверяем текущую директорию. Если не initial_dir, то переходим в нее print(f"Текущая директория: {os.getcwd()}") print(f"Исходная директория: {INITIAL_DIR}") if os.getcwd() != INITIAL_DIR: os.chdir(INITIAL_DIR) # Переходим в директорию с git репозиторием git_dir = find_git_repository() if git_dir is None: print("Не удалось найти git репозиторий.") return None os.chdir(git_dir) # Получаем git hash --short try: git_hash = os.popen('git rev-parse --short HEAD').read().strip() except Exception as e: print(f"Ошибка при получении git hash: {e}") git_hash = None # Возвращаемся в исходную директорию os.chdir(os.path.dirname(INITIAL_DIR)) return git_hash def get_git_tag(): # Проверяем текущую директорию. Если не initial_dir, то переходим в нее if os.getcwd() != INITIAL_DIR: os.chdir(INITIAL_DIR) # Переходим в директорию с git репозиторием git_dir = find_git_repository() if git_dir is None: print("Не удалось найти git репозиторий.") return None os.chdir(git_dir) # Получаем git tag try: git_tag = os.popen('git describe --tags').read().strip() except Exception as e: print(f"Ошибка при получении git tag: {e}") git_tag = None # Возвращаемся в исходную директорию os.chdir(os.path.dirname(INITIAL_DIR)) return git_tag def find_git_repository(): current_dir = INITIAL_DIR try: # Выходим выше по дереву каталогов, пока не найдем .git while True: if os.path.isdir(os.path.join(current_dir, '.git')): git_dir = os.path.abspath(os.path.join(current_dir, '.git')) print(f"Найден git репозиторий: {git_dir}") return git_dir parent_dir = os.path.dirname(current_dir) if parent_dir == current_dir: # Достигли корня файловой системы print("Не удалось найти git репозиторий.") return None current_dir = parent_dir print(f"Проверяем директорию: {current_dir}") except Exception as e: print(f"Ошибка при поиске git репозитория: {e}") return None finally: # Возвращаемся в исходную директорию os.chdir(INITIAL_DIR) def find_golden_tag(tag_pattern): # Проверяем текущую директорию. Если не initial_dir, то переходим в нее if os.getcwd() != INITIAL_DIR: os.chdir(INITIAL_DIR) # Переходим в директорию с git репозиторием git_dir = find_git_repository() if git_dir is None: print("Не удалось найти git репозиторий.") return None os.chdir(git_dir) # Получаем все теги в git репозитории all_tags = os.popen('git tag').read().strip().split('\n') if not all_tags: print("Не найдено ни одного тега в git репозитории.") return None # Фильтруем теги по заданному шаблону matching_tags = [tag for tag in all_tags if tag_pattern in tag] if not matching_tags: print(f"Не найдено тегов, соответствующих шаблону: {tag_pattern}") return None # Получаем последний тег из списка совпадений latest_tag = matching_tags[-1] print(f"Найден тег: {latest_tag}") # Получаем git tag --short try: git_tag = os.popen(f'git rev-parse --short {latest_tag}').read().strip() except Exception as e: print(f"Ошибка при получении git tag: {e}") git_tag = None # Возвращаемся в исходную директорию os.chdir(os.path.dirname(INITIAL_DIR)) return git_tag def merge_bins (): # Пути к файлам os.chdir(INITIAL_DIR) pwd = os.getcwd() file_path_working = os.path.join(INITIAL_DIR, "SB_TMSG44V1_WORKING_FPGA.bin") file_path_golden = os.path.join(INITIAL_DIR, "SB_TMSG44V1_GOLD_FPGA.bin") file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_MERGE_FPGA.bin") # Размеры файлов file_size_working = os.path.getsize(file_path_working) file_size_golden = os.path.getsize(file_path_golden) # Размер выходного файла - 8 Мбит file_size_output = 0x1000000 # Записываем первый файл with open(file_path_output,'wb') as outfile: with open(file_path_working, 'rb') as f1: shutil.copyfileobj(f1, outfile) # Перемещаемся к адресу для второго файла outfile.seek(GOLDEN_ADDRESS) with open(file_path_golden, 'rb') as f2: shutil.copyfileobj(f2, outfile) # Перемещаемся к адресу для пользовательских данных outfile.seek(APP_VER_ADDRESS) current_git_tag=get_git_tag() print(f"Текущий git tag: {current_git_tag}") outfile.write(current_git_tag.encode('utf-8')+b'\0') final_size = os.path.getsize(file_path_output) # Проверка итогового размера if final_size > file_size_output: os.remove(file_path_output) # Удаляем некорректный файл raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)") print(f"Размер файла 1: {file_size_working} байт") print(f"Размер файла 2: {file_size_golden} байт") print(f"Итоговый размер: {final_size} байт") return final_size def main(): merge_bins() if __name__ == '__main__': main()