BinsMerge.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import os
  2. import argparse
  3. import shutil
  4. GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07"
  5. GIT_HASH_BIN = bytes.fromhex(GIT_HASH)
  6. INITIAL_DIR = os.path.dirname(os.path.abspath(__file__))
  7. APP_VER_ADDRESS = 0xFE000
  8. GOLDEN_ADDRESS = 0x006E000
  9. def get_git_hash():
  10. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  11. print(f"Текущая директория: {os.getcwd()}")
  12. print(f"Исходная директория: {INITIAL_DIR}")
  13. if os.getcwd() != INITIAL_DIR:
  14. os.chdir(INITIAL_DIR)
  15. # Переходим в директорию с git репозиторием
  16. git_dir = find_git_repository()
  17. if git_dir is None:
  18. print("Не удалось найти git репозиторий.")
  19. return None
  20. os.chdir(git_dir)
  21. # Получаем git hash --short
  22. try:
  23. git_hash = os.popen('git rev-parse --short HEAD').read().strip()
  24. except Exception as e:
  25. print(f"Ошибка при получении git hash: {e}")
  26. git_hash = None
  27. # Возвращаемся в исходную директорию
  28. os.chdir(os.path.dirname(INITIAL_DIR))
  29. return git_hash
  30. def get_git_tag():
  31. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  32. if os.getcwd() != INITIAL_DIR:
  33. os.chdir(INITIAL_DIR)
  34. # Переходим в директорию с git репозиторием
  35. git_dir = find_git_repository()
  36. if git_dir is None:
  37. print("Не удалось найти git репозиторий.")
  38. return None
  39. os.chdir(git_dir)
  40. # Получаем git tag
  41. try:
  42. git_tag = os.popen('git describe --tags').read().strip()
  43. except Exception as e:
  44. print(f"Ошибка при получении git tag: {e}")
  45. git_tag = None
  46. # Возвращаемся в исходную директорию
  47. os.chdir(os.path.dirname(INITIAL_DIR))
  48. return git_tag
  49. def find_git_repository():
  50. current_dir = INITIAL_DIR
  51. try:
  52. # Выходим выше по дереву каталогов, пока не найдем .git
  53. while True:
  54. if os.path.isdir(os.path.join(current_dir, '.git')):
  55. git_dir = os.path.abspath(os.path.join(current_dir, '.git'))
  56. print(f"Найден git репозиторий: {git_dir}")
  57. return git_dir
  58. parent_dir = os.path.dirname(current_dir)
  59. if parent_dir == current_dir: # Достигли корня файловой системы
  60. print("Не удалось найти git репозиторий.")
  61. return None
  62. current_dir = parent_dir
  63. print(f"Проверяем директорию: {current_dir}")
  64. except Exception as e:
  65. print(f"Ошибка при поиске git репозитория: {e}")
  66. return None
  67. finally:
  68. # Возвращаемся в исходную директорию
  69. os.chdir(INITIAL_DIR)
  70. def find_golden_tag(tag_pattern):
  71. # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
  72. if os.getcwd() != INITIAL_DIR:
  73. os.chdir(INITIAL_DIR)
  74. # Переходим в директорию с git репозиторием
  75. git_dir = find_git_repository()
  76. if git_dir is None:
  77. print("Не удалось найти git репозиторий.")
  78. return None
  79. os.chdir(git_dir)
  80. # Получаем все теги в git репозитории
  81. all_tags = os.popen('git tag').read().strip().split('\n')
  82. if not all_tags:
  83. print("Не найдено ни одного тега в git репозитории.")
  84. return None
  85. # Фильтруем теги по заданному шаблону
  86. matching_tags = [tag for tag in all_tags if tag_pattern in tag]
  87. if not matching_tags:
  88. print(f"Не найдено тегов, соответствующих шаблону: {tag_pattern}")
  89. return None
  90. # Получаем последний тег из списка совпадений
  91. latest_tag = matching_tags[-1]
  92. print(f"Найден тег: {latest_tag}")
  93. # Получаем git tag --short
  94. try:
  95. git_tag = os.popen(f'git rev-parse --short {latest_tag}').read().strip()
  96. except Exception as e:
  97. print(f"Ошибка при получении git tag: {e}")
  98. git_tag = None
  99. # Возвращаемся в исходную директорию
  100. os.chdir(os.path.dirname(INITIAL_DIR))
  101. return git_tag
  102. def merge_bins ():
  103. # Пути к файлам
  104. os.chdir(INITIAL_DIR)
  105. pwd = os.getcwd()
  106. file_path_working = os.path.join(INITIAL_DIR, "SB_TMSG44V1_WORKING_FPGA.bin")
  107. file_path_golden = os.path.join(INITIAL_DIR, "SB_TMSG44V1_GOLD_FPGA.bin")
  108. file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_MERGE_FPGA.bin")
  109. # Размеры файлов
  110. file_size_working = os.path.getsize(file_path_working)
  111. file_size_golden = os.path.getsize(file_path_golden)
  112. # Размер выходного файла - 8 Мбит
  113. file_size_output = 0x1000000
  114. # Записываем первый файл
  115. with open(file_path_output,'wb') as outfile:
  116. with open(file_path_working, 'rb') as f1:
  117. shutil.copyfileobj(f1, outfile)
  118. # Перемещаемся к адресу для второго файла
  119. outfile.seek(GOLDEN_ADDRESS)
  120. with open(file_path_golden, 'rb') as f2:
  121. shutil.copyfileobj(f2, outfile)
  122. # Перемещаемся к адресу для пользовательских данных
  123. outfile.seek(APP_VER_ADDRESS)
  124. current_git_tag=get_git_tag()
  125. print(f"Текущий git tag: {current_git_tag}")
  126. outfile.write(current_git_tag.encode('utf-8')+b'\0')
  127. final_size = os.path.getsize(file_path_output)
  128. # Проверка итогового размера
  129. if final_size > file_size_output:
  130. os.remove(file_path_output) # Удаляем некорректный файл
  131. raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
  132. print(f"Размер файла 1: {file_size_working} байт")
  133. print(f"Размер файла 2: {file_size_golden} байт")
  134. print(f"Итоговый размер: {final_size} байт")
  135. return final_size
  136. def main():
  137. merge_bins()
  138. if __name__ == '__main__':
  139. main()