format.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import sys
  2. import subprocess
  3. from pathlib import Path
  4. import codecs
  5. def format_file(filepath):
  6. try:
  7. subprocess.run(['clang-format', '-i', str(filepath)], check=True)
  8. except subprocess.CalledProcessError as e:
  9. print(f'Error formatting file: {filepath}. Error message: {str(e)}')
  10. non_ascii_lines = []
  11. with codecs.open(filepath, 'r', 'utf-8-sig') as file:
  12. lines = file.readlines()
  13. for i, line in enumerate(lines):
  14. if filepath.suffix != '.cpp':
  15. if not line.isascii():
  16. non_ascii_lines.append((i + 1, line))
  17. if lines and not lines[-1].endswith('\n'):
  18. lines.append('\n')
  19. print(f'Added newline to file: {filepath}')
  20. with codecs.open(filepath, 'w', 'utf-8') as file:
  21. file.writelines(lines)
  22. if non_ascii_lines:
  23. # print with yellow color
  24. print(f'\033[33mFound non-ASCII lines in file: {filepath}\033[0m')
  25. for line_no, line in non_ascii_lines:
  26. print(f'Line {filepath}:{line_no}: {line}')
  27. def format_files_in_dir(dir_path, dir_skip):
  28. for filepath in dir_path.rglob('*'):
  29. # Skip if the current file's directory or any of its parents are in dir_skip
  30. if any(str(filepath).startswith(dir) for dir in dir_skip):
  31. continue
  32. # 只处理.c, .h, .cpp文件
  33. if filepath.suffix in ['.c', '.h', '.cpp']:
  34. format_file(filepath)
  35. # 从命令行参数获取目录列表
  36. dirs = sys.argv[1:]
  37. # 如果没有命令行参数, 则使用默认目录
  38. if len(dirs) == 0:
  39. dirs = ['package/pikascript/pikascript-lib',
  40. 'package/pikascript/pikascript-core', 'test']
  41. dir_skip = ['package/pikascript/pikascript-lib/re',
  42. 'package/pikascript/pikascript-lib/PikaNN',
  43. 'package/pikascript/pikascript-lib/modbus',
  44. 'package/pikascript/pikascript-lib/PikaStdDevice/pika_hal_table_rule.h'
  45. ]
  46. # 对每个目录进行处理
  47. for dir_path_str in dirs:
  48. dir_path = Path(dir_path_str)
  49. if dir_path.is_dir():
  50. format_files_in_dir(dir_path, dir_skip)
  51. print(f'Finished processing directory: {dir_path_str}')
  52. else:
  53. print(f"'{dir_path_str}' is not a directory. Skipping...")