From 273f48cd5342ca9d4ac5ed32d7f172c0c8df7c12 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 29 Nov 2024 15:21:01 +1100 Subject: [PATCH] Cleanup: use main functions to allow importing scripts Support importing scripts without running their logic to allow basic validation (see #130746). Parts of !131037 were used. Co-authored-by: Bastien Montagne --- build_files/package_spec/build_archive.py | 118 ++++++------ build_files/utils/make_test.py | 81 +++++---- build_files/utils/make_update.py | 32 ++-- tools/check_source/check_unused_defines.py | 45 +++-- tools/git/git_sh1_to_svn_rev.py | 79 ++++---- tools/utils/blender_merge_format_changes.py | 172 +++++++++--------- tools/utils/make_cursor_gui.py | 15 +- tools/utils_maintenance/c_sort_blocks.py | 18 +- tools/utils_maintenance/c_struct_clean.py | 18 +- .../utils_maintenance/cmake_sort_filelists.py | 18 +- 10 files changed, 331 insertions(+), 265 deletions(-) diff --git a/build_files/package_spec/build_archive.py b/build_files/package_spec/build_archive.py index 2af01498ba4..4a48cc10f82 100755 --- a/build_files/package_spec/build_archive.py +++ b/build_files/package_spec/build_archive.py @@ -11,65 +11,73 @@ import sys # todo: # strip executables -# get parameters -if len(sys.argv) < 5: - sys.stderr.write('Excepted arguments: ./build_archive.py name extension install_dir output_dir') - sys.exit(1) -package_name = sys.argv[1] -extension = sys.argv[2] -install_dir = sys.argv[3] -output_dir = sys.argv[4] +def main() -> int: + # get parameters + if len(sys.argv) < 5: + sys.stderr.write('Excepted arguments: ./build_archive.py name extension install_dir output_dir') + return 1 -package_archive = os.path.join(output_dir, package_name + '.' + extension) -package_dir = package_name + package_name = sys.argv[1] + extension = sys.argv[2] + install_dir = sys.argv[3] + output_dir = sys.argv[4] -# remove existing package with the same name -try: - if os.path.exists(package_archive): - os.remove(package_archive) - if os.path.exists(package_dir): + package_archive = os.path.join(output_dir, package_name + '.' + extension) + package_dir = package_name + + # remove existing package with the same name + try: + if os.path.exists(package_archive): + os.remove(package_archive) + if os.path.exists(package_dir): + shutil.rmtree(package_dir) + except Exception as ex: + sys.stderr.write('Failed to clean up old package files: ' + str(ex) + '\n') + return 1 + + # create temporary package dir + try: + shutil.copytree(install_dir, package_dir) + + for f in os.listdir(package_dir): + if f.startswith('makes'): + os.remove(os.path.join(package_dir, f)) + except Exception as ex: + sys.stderr.write('Failed to copy install directory: ' + str(ex) + '\n') + return 1 + + # create archive + try: + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + archive_env = os.environ.copy() + + if extension == 'zip': + archive_cmd = ['zip', '-9', '-r', package_archive, package_dir] + elif extension == 'tar.xz': + archive_cmd = ['tar', '-cf', package_archive, '--owner=0', '--group=0', + '--use-compress-program=xz', package_dir] + archive_env['XZ_OPT'] = '-9' + else: + sys.stderr.write('Unknown archive extension: ' + extension) + return 1 + + subprocess.check_call(archive_cmd, env=archive_env) + except Exception as ex: + sys.stderr.write('Failed to create package archive: ' + str(ex) + '\n') + return 1 + + # empty temporary package dir + try: shutil.rmtree(package_dir) -except Exception as ex: - sys.stderr.write('Failed to clean up old package files: ' + str(ex) + '\n') - sys.exit(1) + except Exception as ex: + sys.stderr.write('Failed to clean up package directory: ' + str(ex) + '\n') + return 1 -# create temporary package dir -try: - shutil.copytree(install_dir, package_dir) + return 0 - for f in os.listdir(package_dir): - if f.startswith('makes'): - os.remove(os.path.join(package_dir, f)) -except Exception as ex: - sys.stderr.write('Failed to copy install directory: ' + str(ex) + '\n') - sys.exit(1) -# create archive -try: - if not os.path.exists(output_dir): - os.mkdir(output_dir) - - archive_env = os.environ.copy() - - if extension == 'zip': - archive_cmd = ['zip', '-9', '-r', package_archive, package_dir] - elif extension == 'tar.xz': - archive_cmd = ['tar', '-cf', package_archive, '--owner=0', '--group=0', - '--use-compress-program=xz', package_dir] - archive_env['XZ_OPT'] = '-9' - else: - sys.stderr.write('Unknown archive extension: ' + extension) - sys.exit(-1) - - subprocess.check_call(archive_cmd, env=archive_env) -except Exception as ex: - sys.stderr.write('Failed to create package archive: ' + str(ex) + '\n') - sys.exit(1) - -# empty temporary package dir -try: - shutil.rmtree(package_dir) -except Exception as ex: - sys.stderr.write('Failed to clean up package directory: ' + str(ex) + '\n') - sys.exit(1) +if __name__ == "__main__": + sys.exit(main()) diff --git a/build_files/utils/make_test.py b/build_files/utils/make_test.py index a8a66ede316..b33fb282f1c 100755 --- a/build_files/utils/make_test.py +++ b/build_files/utils/make_test.py @@ -15,9 +15,8 @@ import make_utils from make_utils import call from pathlib import Path + # Parse arguments. - - def parse_arguments() -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument("--ctest-command", default="ctest") @@ -28,49 +27,55 @@ def parse_arguments() -> argparse.Namespace: return parser.parse_args() -args = parse_arguments() -git_command = args.git_command -ctest_command = args.ctest_command -cmake_command = args.cmake_command -config = args.config -build_dir = args.build_directory +def main() -> int: + args = parse_arguments() + git_command = args.git_command + ctest_command = args.ctest_command + cmake_command = args.cmake_command + config = args.config + build_dir = args.build_directory -if make_utils.command_missing(ctest_command): - sys.stderr.write("ctest not found, can't run tests\n") - sys.exit(1) + if make_utils.command_missing(ctest_command): + sys.stderr.write("ctest not found, can't run tests\n") + return 1 -if make_utils.command_missing(git_command): - sys.stderr.write("git not found, can't run tests\n") - sys.exit(1) + if make_utils.command_missing(git_command): + sys.stderr.write("git not found, can't run tests\n") + return 1 -# Test if we are building a specific release version. -lib_tests_dirpath = Path("tests") / "data" + # Test if we are building a specific release version. + lib_tests_dirpath = Path("tests") / "data" -if not (lib_tests_dirpath / ".git").exists(): - print("Tests files not found, downloading...") + if not (lib_tests_dirpath / ".git").exists(): + print("Tests files not found, downloading...") - if make_utils.command_missing(cmake_command): - sys.stderr.write("cmake not found, can't checkout test files\n") - sys.exit(1) + if make_utils.command_missing(cmake_command): + sys.stderr.write("cmake not found, can't checkout test files\n") + return 1 - # Ensure the test data files sub-module is configured and present. - make_utils.git_enable_submodule(git_command, Path("tests") / "data") - make_utils.git_update_submodule(args.git_command, lib_tests_dirpath) + # Ensure the test data files sub-module is configured and present. + make_utils.git_enable_submodule(git_command, Path("tests") / "data") + make_utils.git_update_submodule(args.git_command, lib_tests_dirpath) + + # Run cmake again to detect tests files. + os.chdir(build_dir) + call([cmake_command, "."]) + + # Run tests + tests_dir = os.path.join(build_dir, "tests") + os.makedirs(tests_dir, exist_ok=True) - # Run cmake again to detect tests files. os.chdir(build_dir) - call([cmake_command, "."]) + command = [ctest_command, ".", "--output-on-failure"] + if len(config): + command += ["-C", config] + tests_log = "log_" + config + ".txt" + else: + tests_log = "log.txt" + command += ["-O", os.path.join(tests_dir, tests_log)] + call(command) + return 0 -# Run tests -tests_dir = os.path.join(build_dir, "tests") -os.makedirs(tests_dir, exist_ok=True) -os.chdir(build_dir) -command = [ctest_command, ".", "--output-on-failure"] -if len(config): - command += ["-C", config] - tests_log = "log_" + config + ".txt" -else: - tests_log = "log.txt" -command += ["-O", os.path.join(tests_dir, tests_log)] -call(command) +if __name__ == "__main__": + sys.exit(main()) diff --git a/build_files/utils/make_update.py b/build_files/utils/make_update.py index 19c44afb5a3..83e624a9300 100755 --- a/build_files/utils/make_update.py +++ b/build_files/utils/make_update.py @@ -63,7 +63,7 @@ def parse_arguments() -> argparse.Namespace: return parser.parse_args() -def get_blender_git_root() -> Path: +def get_blender_git_root(args: argparse.Namespace) -> Path: """ Get root directory of the current Git directory. """ @@ -126,7 +126,7 @@ def get_submodule_directories(args: argparse.Namespace) -> "tuple[Path, ...]": Get list of all configured submodule directories. """ - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) dot_modules = blender_git_root / ".gitmodules" if not dot_modules.exists(): @@ -143,13 +143,13 @@ def ensure_git_lfs(args: argparse.Namespace) -> None: call((args.git_command, "lfs", "install", "--skip-repo"), exit_on_error=True) -def prune_stale_files() -> None: +def prune_stale_files(args: argparse.Namespace) -> None: """ Ensure files from previous Git configurations do not exist anymore """ print_stage("Removing stale files") - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) found_stale_files = False for relative_dir_to_remove in ( @@ -322,7 +322,7 @@ def external_script_copy_old_submodule_over( directory: Path, old_submodules_dir: Path, ) -> None: - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) external_dir = blender_git_root / directory print(f"Moving {old_submodules_dir} to {directory} ...") @@ -349,7 +349,7 @@ def floating_checkout_initialize_if_needed( ) -> None: """Initialize checkout of an external repository""" - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) blender_dot_git = blender_git_root / ".git" external_dir = blender_git_root / directory @@ -392,7 +392,7 @@ def floating_checkout_add_origin_if_needed( cwd = os.getcwd() - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) external_dir = blender_git_root / directory origin_blender_url = make_utils.git_get_remote_url(args.git_command, "origin") @@ -447,7 +447,7 @@ def floating_checkout_update( ) -> str: """Update a single external checkout with the given name in the scripts folder""" - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) external_dir = blender_git_root / directory if only_update and not external_dir.exists(): @@ -456,7 +456,7 @@ def floating_checkout_update( floating_checkout_initialize_if_needed(args, repo_name, directory, old_submodules_dir) floating_checkout_add_origin_if_needed(args, repo_name, directory) - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) external_dir = blender_git_root / directory print(f"* Updating {directory} ...") @@ -556,7 +556,7 @@ def add_submodule_push_url(args: argparse.Namespace) -> None: Add pushURL configuration for all locally activated submodules, pointing to SSH protocol. """ - blender_git_root = get_blender_git_root() + blender_git_root = get_blender_git_root(args) modules = blender_git_root / ".git" / "modules" submodule_directories = get_submodule_directories(args) @@ -611,7 +611,7 @@ def submodules_lib_update(args: argparse.Namespace, branch: "str | None") -> str return msg -if __name__ == "__main__": +def main() -> int: args = parse_arguments() blender_skip_msg = "" libraries_skip_msg = "" @@ -629,7 +629,7 @@ if __name__ == "__main__": ensure_git_lfs(args) if args.prune_destructive: - prune_stale_files() + prune_stale_files(args) if not args.no_blender: blender_skip_msg = git_update_skip(args) @@ -655,4 +655,10 @@ if __name__ == "__main__": # For Blender itself we don't and consider "make update" to be a command # you can use while working on uncommitted code. if submodules_skip_msg: - sys.exit(1) + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/check_source/check_unused_defines.py b/tools/check_source/check_unused_defines.py index b0d673a7d34..dce19f38dbc 100755 --- a/tools/check_source/check_unused_defines.py +++ b/tools/check_source/check_unused_defines.py @@ -29,9 +29,9 @@ SOURCE_EXT = ( ".glsl", ) -words = set() -words_multi = set() -defines = {} +words: set[str] = set() +words_multi: set[str] = set() +defines: dict[str, str] = {} import re re_words = re.compile("[A-Za-z_][A-Za-z_0-9]*") @@ -41,23 +41,23 @@ re_defines = re.compile("^\\s*#define\\s+([A-Za-z_][A-Za-z_0-9]*)", re.MULTILINE # https://stackoverflow.com/a/18381470/432509 -def remove_comments(string): +def remove_comments(string: str) -> str: pattern = r"(\".*?\"|\'.*?\')|(/\*.*?\*/|//[^\r\n]*$)" # first group captures quoted strings (double or single) # second group captures comments (//single-line or /* multi-line */) regex = re.compile(pattern, re.MULTILINE | re.DOTALL) - def _replacer(match): + def _replacer(m: re.Match[str]) -> str: # if the 2nd group (capturing comments) is not None, # it means we have captured a non-quoted (real) comment string. - if match.group(2) is not None: + if m.group(2) is not None: return "" # so we will return empty to remove the comment else: # otherwise, we will return the 1st group - return match.group(1) # capture + return m.group(1) # capture return regex.sub(_replacer, string) -def extract_terms(fn, data_src): +def extract_terms(fn: str, data_src: str) -> None: data_src_nocomments = remove_comments(data_src) for m in re_words.finditer(data_src_nocomments): words_len = len(words) @@ -73,15 +73,22 @@ def extract_terms(fn, data_src): return None -run( - directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], - is_text=lambda fn: fn.endswith(SOURCE_EXT), - text_operation=extract_terms, - # Can't be used if we want to accumulate in a global variable. - use_multiprocess=False, -) +def main() -> int: + run( + directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], + is_text=lambda fn: fn.endswith(SOURCE_EXT), + text_operation=extract_terms, + # Can't be used if we want to accumulate in a global variable. + use_multiprocess=False, + ) -print("Found", len(defines), "defines, searching", len(words_multi), "terms...") -for fn, define in sorted([(fn, define) for define, fn in defines.items()]): - if define not in words_multi: - print(define, "->", fn) + print("Found", len(defines), "defines, searching", len(words_multi), "terms...") + for fn, define in sorted([(fn, define) for define, fn in defines.items()]): + if define not in words_multi: + print(define, "->", fn) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/git/git_sh1_to_svn_rev.py b/tools/git/git_sh1_to_svn_rev.py index 85d2337a2d0..2f314bc11d2 100755 --- a/tools/git/git_sh1_to_svn_rev.py +++ b/tools/git/git_sh1_to_svn_rev.py @@ -6,50 +6,59 @@ # generate svn rev-sha1 mapping import os +import sys + CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.normpath(os.path.join(CURRENT_DIR, "..", "..")))) -print("creating git-log of %r" % SOURCE_DIR) -os.chdir(SOURCE_DIR) -os.system('git log --all --format="%H %cd" --date=iso > "' + CURRENT_DIR + '/git_log.txt"') -print("creating mapping...") -os.chdir(CURRENT_DIR) -time_to_sha1 = {} -f = "git_log.txt" -with open(f, "r", encoding="utf-8") as fh: - for l in fh: - sha1 = l[:40] - time = l[41:60] - time_to_sha1[time] = sha1 -os.remove("git_log.txt") +def main() -> int: + print("creating git-log of %r" % SOURCE_DIR) + os.chdir(SOURCE_DIR) + os.system('git log --all --format="%H %cd" --date=iso > "' + CURRENT_DIR + '/git_log.txt"') -# for reverse mapping -rev_sha1_ls = [] - -with open("rev_to_sha1.py", "w", encoding="utf-8") as fh_dst: - fh_dst.write("data = {\n") - - f = "git_sh1_to_svn_rev.fossils" + print("creating mapping...") + os.chdir(CURRENT_DIR) + time_to_sha1 = {} + f = "git_log.txt" with open(f, "r", encoding="utf-8") as fh: for l in fh: - # skip 'SVN:' - rev, time = l[4:].split("\t", 1) - time = time.split("Z", 1)[0].replace("T", " ", 1) - sha1 = time_to_sha1.get(time) - if sha1 is not None: - fh_dst.write('%s: "%s",\n' % (rev, sha1)) + sha1 = l[:40] + time = l[41:60] + time_to_sha1[time] = sha1 + os.remove("git_log.txt") - rev_sha1_ls.append((rev, sha1)) + # for reverse mapping + rev_sha1_ls = [] - fh_dst.write('}\n') + with open("rev_to_sha1.py", "w", encoding="utf-8") as fh_dst: + fh_dst.write("data = {\n") -print("written: rev_to_sha1.py") + f = "git_sh1_to_svn_rev.fossils" + with open(f, "r", encoding="utf-8") as fh: + for l in fh: + # skip 'SVN:' + rev, time = l[4:].split("\t", 1) + time = time.split("Z", 1)[0].replace("T", " ", 1) + sha1 = time_to_sha1.get(time) + if sha1 is not None: + fh_dst.write('%s: "%s",\n' % (rev, sha1)) -with open("sha1_to_rev.py", "w", encoding="utf-8") as fh_dst: - fh_dst.write("data = {\n") - for rev, sha1 in rev_sha1_ls: - fh_dst.write('"%s": %s,\n' % (sha1, rev)) - fh_dst.write('}\n') + rev_sha1_ls.append((rev, sha1)) -print("written: sha1_to_rev.py") + fh_dst.write('}\n') + + print("written: rev_to_sha1.py") + + with open("sha1_to_rev.py", "w", encoding="utf-8") as fh_dst: + fh_dst.write("data = {\n") + for rev, sha1 in rev_sha1_ls: + fh_dst.write('"%s": %s,\n' % (sha1, rev)) + fh_dst.write('}\n') + + print("written: sha1_to_rev.py") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/utils/blender_merge_format_changes.py b/tools/utils/blender_merge_format_changes.py index 32041b97eba..65d669e5d18 100755 --- a/tools/utils/blender_merge_format_changes.py +++ b/tools/utils/blender_merge_format_changes.py @@ -21,95 +21,101 @@ def get_string(cmd): return subprocess.run(cmd, stdout=subprocess.PIPE).stdout.decode('utf8').strip() -# Parse arguments. -mode = None -base_branch = 'main' -if len(sys.argv) >= 2: - # Note that recursive conflict resolution strategy has to reversed in rebase compared to merge. - # See https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt--m - if sys.argv[1] == '--rebase': - mode = 'rebase' - recursive_format_commit_merge_options = '-Xignore-all-space -Xtheirs' - elif sys.argv[1] == '--merge': - mode = 'merge' - recursive_format_commit_merge_options = '-Xignore-all-space -Xours' - if len(sys.argv) == 4: - if sys.argv[2] == '--base_branch': - base_branch = sys.argv[3] +def main() -> int: + # Parse arguments. + mode = None + base_branch = 'main' + if len(sys.argv) >= 2: + # Note that recursive conflict resolution strategy has to reversed in rebase compared to merge. + # See https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt--m + if sys.argv[1] == '--rebase': + mode = 'rebase' + recursive_format_commit_merge_options = '-Xignore-all-space -Xtheirs' + elif sys.argv[1] == '--merge': + mode = 'merge' + recursive_format_commit_merge_options = '-Xignore-all-space -Xours' + if len(sys.argv) == 4: + if sys.argv[2] == '--base_branch': + base_branch = sys.argv[3] -if mode is None: - print("Merge or rebase Blender main (or another base branch) into a branch in 3 steps,") - print("to automatically merge clang-format changes.") - print("") - print(" --rebase Perform equivalent of 'git rebase main'") - print(" --merge Perform equivalent of 'git merge main'") - print("") - print("Optional arguments:") - print(" --base_branch Use given branch instead of main") - print(" (assuming that base branch has already been updated") - print(" and has the initial clang-format commit).") - sys.exit(0) + if mode is None: + print("Merge or rebase Blender main (or another base branch) into a branch in 3 steps,") + print("to automatically merge clang-format changes.") + print("") + print(" --rebase Perform equivalent of 'git rebase main'") + print(" --merge Perform equivalent of 'git merge main'") + print("") + print("Optional arguments:") + print(" --base_branch Use given branch instead of main") + print(" (assuming that base branch has already been updated") + print(" and has the initial clang-format commit).") + return 0 -# Verify we are in the right directory. -root_path = get_string(['git', 'rev-parse', '--show-superproject-working-tree']) -if os.path.realpath(root_path) != os.path.realpath(os.getcwd()): - print("BLENDER MERGE: must run from blender repository root directory") - sys.exit(1) + # Verify we are in the right directory. + root_path = get_string(['git', 'rev-parse', '--show-superproject-working-tree']) + if os.path.realpath(root_path) != os.path.realpath(os.getcwd()): + print("BLENDER MERGE: must run from blender repository root directory") + return 1 -# Abort if a rebase is still progress. -rebase_merge = get_string(['git', 'rev-parse', '--git-path', 'rebase-merge']) -rebase_apply = get_string(['git', 'rev-parse', '--git-path', 'rebase-apply']) -merge_head = get_string(['git', 'rev-parse', '--git-path', 'MERGE_HEAD']) -if os.path.exists(rebase_merge) or \ - os.path.exists(rebase_apply) or \ - os.path.exists(merge_head): - print("BLENDER MERGE: rebase or merge in progress, complete it first") - sys.exit(1) + # Abort if a rebase is still progress. + rebase_merge = get_string(['git', 'rev-parse', '--git-path', 'rebase-merge']) + rebase_apply = get_string(['git', 'rev-parse', '--git-path', 'rebase-apply']) + merge_head = get_string(['git', 'rev-parse', '--git-path', 'MERGE_HEAD']) + if os.path.exists(rebase_merge) or \ + os.path.exists(rebase_apply) or \ + os.path.exists(merge_head): + print("BLENDER MERGE: rebase or merge in progress, complete it first") + return 1 -# Abort if uncommitted changes. -changes = get_string(['git', 'status', '--porcelain', '--untracked-files=no']) -if len(changes) != 0: - print("BLENDER MERGE: detected uncommitted changes, can't run") - sys.exit(1) + # Abort if uncommitted changes. + changes = get_string(['git', 'status', '--porcelain', '--untracked-files=no']) + if len(changes) != 0: + print("BLENDER MERGE: detected uncommitted changes, can't run") + return 1 -# Setup command, with commit message for merge commits. -if mode == 'rebase': - mode_cmd = 'rebase' -else: - branch = get_string(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - mode_cmd = 'merge --no-edit -m "Merge \'' + base_branch + '\' into \'' + branch + '\'"' + # Setup command, with commit message for merge commits. + if mode == 'rebase': + mode_cmd = 'rebase' + else: + branch = get_string(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + mode_cmd = 'merge --no-edit -m "Merge \'' + base_branch + '\' into \'' + branch + '\'"' -# Rebase up to the clang-format commit. -code = os.system('git merge-base --is-ancestor ' + pre_format_commit + ' HEAD') -if code != 0: - code = os.system('git ' + mode_cmd + ' ' + pre_format_commit) + # Rebase up to the clang-format commit. + code = os.system('git merge-base --is-ancestor ' + pre_format_commit + ' HEAD') if code != 0: - print("BLENDER MERGE: resolve conflicts, complete " + mode + " and run again") - sys.exit(code) + code = os.system('git ' + mode_cmd + ' ' + pre_format_commit) + if code != 0: + print("BLENDER MERGE: resolve conflicts, complete " + mode + " and run again") + return code -# Rebase clang-format commit. -code = os.system('git merge-base --is-ancestor ' + format_commits[-1] + ' HEAD') -if code != 0: - os.system('git ' + mode_cmd + ' ' + recursive_format_commit_merge_options + ' ' + format_commits[-1]) - paths = get_string(('git', '--no-pager', 'diff', '--name-only', format_commits[-1])).replace('\n', ' ') - if sys.platform == 'win32' and len(paths) > 8000: - # Windows command-line does not accept more than 8191 chars. - os.system('make format') - else: - os.system('make format PATHS="' + paths + '"') - os.system('git add -u') - count = int(get_string(['git', 'rev-list', '--count', '' + format_commits[-1] + '..HEAD'])) - if count == 1 or mode == 'merge': - # Amend if we just have a single commit or are merging. - os.system('git commit --amend --no-edit') - else: - # Otherwise create a commit for formatting. - os.system('git commit -m "Cleanup: apply clang format"') + # Rebase clang-format commit. + code = os.system('git merge-base --is-ancestor ' + format_commits[-1] + ' HEAD') + if code != 0: + os.system('git ' + mode_cmd + ' ' + recursive_format_commit_merge_options + ' ' + format_commits[-1]) + paths = get_string(('git', '--no-pager', 'diff', '--name-only', format_commits[-1])).replace('\n', ' ') + if sys.platform == 'win32' and len(paths) > 8000: + # Windows command-line does not accept more than 8191 chars. + os.system('make format') + else: + os.system('make format PATHS="' + paths + '"') + os.system('git add -u') + count = int(get_string(['git', 'rev-list', '--count', '' + format_commits[-1] + '..HEAD'])) + if count == 1 or mode == 'merge': + # Amend if we just have a single commit or are merging. + os.system('git commit --amend --no-edit') + else: + # Otherwise create a commit for formatting. + os.system('git commit -m "Cleanup: apply clang format"') -# Rebase remaining commits -code = os.system('git ' + mode_cmd + ' ' + base_branch) -if code != 0: - print("BLENDER MERGE: resolve conflicts, complete " + mode + " and you're done") -else: - print("BLENDER MERGE: done") -sys.exit(code) + # Rebase remaining commits + code = os.system('git ' + mode_cmd + ' ' + base_branch) + if code != 0: + print("BLENDER MERGE: resolve conflicts, complete " + mode + " and you're done") + else: + print("BLENDER MERGE: done") + + return code + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/utils/make_cursor_gui.py b/tools/utils/make_cursor_gui.py index a6b99bc9c3d..a63a7c47bc2 100755 --- a/tools/utils/make_cursor_gui.py +++ b/tools/utils/make_cursor_gui.py @@ -6,6 +6,7 @@ # Created by Robert Wenzlaff (Det. Thorn). # Oct. 30, 2003 +import sys from tkinter import ( Button, Canvas, @@ -288,9 +289,15 @@ class App: ################## Main App ####################### -root = Tk() +def main() -> int: + root = Tk() -app = App(root) -root.title("Cursor Maker") + app = App(root) + root.title("Cursor Maker") -root.mainloop() + root.mainloop() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/utils_maintenance/c_sort_blocks.py b/tools/utils_maintenance/c_sort_blocks.py index 9283186da54..2304a94a194 100755 --- a/tools/utils_maintenance/c_sort_blocks.py +++ b/tools/utils_maintenance/c_sort_blocks.py @@ -83,9 +83,15 @@ def sort_struct_lists(fn: str, data_src: str) -> str | None: return None -run( - directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], - is_text=lambda fn: fn.endswith(SOURCE_EXT), - text_operation=sort_struct_lists, - use_multiprocess=True, -) +def main() -> int: + run( + directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], + is_text=lambda fn: fn.endswith(SOURCE_EXT), + text_operation=sort_struct_lists, + use_multiprocess=True, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/utils_maintenance/c_struct_clean.py b/tools/utils_maintenance/c_struct_clean.py index b500b24f083..6f1d1e05c3a 100755 --- a/tools/utils_maintenance/c_struct_clean.py +++ b/tools/utils_maintenance/c_struct_clean.py @@ -84,9 +84,15 @@ def clean_structs(fn: str, data_src: str) -> str | None: return None -run( - directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], - is_text=lambda fn: fn.endswith(SOURCE_EXT), - text_operation=clean_structs, - use_multiprocess=False, -) +def main() -> int: + run( + directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], + is_text=lambda fn: fn.endswith(SOURCE_EXT), + text_operation=clean_structs, + use_multiprocess=False, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/utils_maintenance/cmake_sort_filelists.py b/tools/utils_maintenance/cmake_sort_filelists.py index 2136b7fe5e1..483dea94ee7 100755 --- a/tools/utils_maintenance/cmake_sort_filelists.py +++ b/tools/utils_maintenance/cmake_sort_filelists.py @@ -93,9 +93,15 @@ def sort_cmake_file_lists(fn: str, data_src: str) -> str | None: return None -run( - directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], - is_text=lambda fn: fn.endswith("CMakeLists.txt"), - text_operation=sort_cmake_file_lists, - use_multiprocess=True, -) +def main() -> int: + run( + directories=[os.path.join(SOURCE_DIR, d) for d in SOURCE_DIRS], + is_text=lambda fn: fn.endswith("CMakeLists.txt"), + text_operation=sort_cmake_file_lists, + use_multiprocess=True, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main())