From a1c7937dba74f265e0bdc07518784ce82a7fd0d7 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Thu, 18 Jul 2024 01:32:55 +0200 Subject: [PATCH] make format.py clean up extra whitespace, also in .h files (#1991) * make format.py clean up extra whitespace, also in .h files * fixup * cleanup whitespace msg * Update check_format.py to also check non-src files touched by format.py * format --- format.py | 47 ++++++++++++++++++++++++++++++------------ include/z64actor.h | 48 +++++++++++++++++++++---------------------- tools/check_format.py | 29 ++++++++++++++------------ 3 files changed, 74 insertions(+), 50 deletions(-) diff --git a/format.py b/format.py index 520a2d8078..2e5cbd08f7 100755 --- a/format.py +++ b/format.py @@ -4,6 +4,7 @@ import argparse import glob import multiprocessing import os +from pathlib import Path import re import shutil import subprocess @@ -94,14 +95,25 @@ def run_clang_apply_replacements(tmp_dir: str): subprocess.run(exec_str, shell=True) -def add_final_new_line(file: str): - # https://backreference.org/2010/05/23/sanitizing-files-with-no-trailing-newline/index.html - # "gets the last character of the file pipes it into read, which will exit with a nonzero exit - # code if it encounters EOF before newline (so, if the last character of the file isn't a newline). - # If read exits nonzero, then append a newline onto the file using echo (if read exits 0, - # that satisfies the ||, so the echo command isn't run)." (https://stackoverflow.com/a/34865616) - exec_str = f"tail -c1 {file} | read -r _ || echo >> {file}" - subprocess.run(exec_str, shell=True) +def cleanup_whitespace(file: str): + """ + Remove whitespace at the end of lines, + ensure the file ends with an empty line. + """ + file_p = Path(file) + contents = file_p.read_text(encoding="UTF-8") + modified = False + + contents, n_subst = re.subn(r"[^\S\n]+\n", "\n", contents) + if n_subst != 0: + modified = True + + if not contents.endswith("\n"): + contents += "\n" + modified = True + + if modified: + file_p.write_text(contents, encoding="UTF-8") def format_files(src_files: List[str], extra_files: List[str], nb_jobs: int): @@ -134,14 +146,24 @@ def format_files(src_files: List[str], extra_files: List[str], nb_jobs: int): else: run_clang_tidy(src_files) - print("Adding missing final new lines...") - # Adding final new lines is safe to do in parallel and can be applied to all types of files + print("Cleaning up whitespace...") + # Safe to do in parallel and can be applied to all types of files with multiprocessing.get_context("fork").Pool(nb_jobs) as pool: - pool.map(add_final_new_line, src_files + extra_files) + pool.map(cleanup_whitespace, src_files + extra_files) print("Done formatting files.") +def list_files_to_format(): + files = glob.glob("src/**/*.c", recursive=True) + extra_files = ( + glob.glob("assets/**/*.xml", recursive=True) + + glob.glob("include/**/*.h", recursive=True) + + glob.glob("src/**/*.h", recursive=True) + ) + return files, extra_files + + def main(): parser = argparse.ArgumentParser(description="Format files in the codebase to enforce most style rules") parser.add_argument( @@ -179,8 +201,7 @@ def main(): files = args.files extra_files = [] else: - files = glob.glob("src/**/*.c", recursive=True) - extra_files = glob.glob("assets/**/*.xml", recursive=True) + files, extra_files = list_files_to_format() format_files(files, extra_files, nb_jobs) diff --git a/include/z64actor.h b/include/z64actor.h index 3479b7a917..ef436ff9fd 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -140,22 +140,22 @@ typedef struct { /* 0x18 */ Vec3f feetPos[2]; // Update by using `Actor_SetFeetPos` in PostLimbDraw } ActorShape; // size = 0x30 -// +// #define ACTOR_FLAG_0 (1 << 0) -// +// #define ACTOR_FLAG_2 (1 << 2) -// +// #define ACTOR_FLAG_3 (1 << 3) -// +// #define ACTOR_FLAG_4 (1 << 4) -// +// #define ACTOR_FLAG_5 (1 << 5) -// +// #define ACTOR_FLAG_6 (1 << 6) // hidden or revealed by Lens of Truth (depending on room lensMode) @@ -166,64 +166,64 @@ typedef struct { // Actor will retain this flag until `Actor_TalkOfferAccepted` is called or manually turned off by the actor #define ACTOR_FLAG_TALK (1 << 8) -// +// #define ACTOR_FLAG_9 (1 << 9) -// +// #define ACTOR_FLAG_10 (1 << 10) -// +// #define ACTOR_FLAG_ENKUSA_CUT (1 << 11) // Actor will not shake when a quake occurs #define ACTOR_FLAG_IGNORE_QUAKE (1 << 12) -// +// #define ACTOR_FLAG_13 (1 << 13) -// +// #define ACTOR_FLAG_14 (1 << 14) -// +// #define ACTOR_FLAG_15 (1 << 15) -// +// #define ACTOR_FLAG_16 (1 << 16) -// +// #define ACTOR_FLAG_17 (1 << 17) -// +// #define ACTOR_FLAG_18 (1 << 18) -// +// #define ACTOR_FLAG_19 (1 << 19) -// +// #define ACTOR_FLAG_20 (1 << 20) -// +// #define ACTOR_FLAG_21 (1 << 21) // ignores point lights but not directional lights (such as environment lights) #define ACTOR_FLAG_IGNORE_POINT_LIGHTS (1 << 22) -// +// #define ACTOR_FLAG_23 (1 << 23) -// +// #define ACTOR_FLAG_24 (1 << 24) -// +// #define ACTOR_FLAG_25 (1 << 25) -// +// #define ACTOR_FLAG_26 (1 << 26) -// +// #define ACTOR_FLAG_27 (1 << 27) -// +// #define ACTOR_FLAG_28 (1 << 28) #define COLORFILTER_GET_COLORINTENSITY(colorFilterParams) (((colorFilterParams) & 0x1F00) >> 5) diff --git a/tools/check_format.py b/tools/check_format.py index c2d6d7d2a0..f6b23a2280 100644 --- a/tools/check_format.py +++ b/tools/check_format.py @@ -23,14 +23,15 @@ def get_modified_files_to_format(compare_to): modified_files_str = subprocess.check_output( ["git", "diff", "--name-only", compare_to], text=True ) - modified_files = modified_files_str.splitlines() - modified_c_files = [ - f - for f in modified_files - if f.startswith("src" + os.path.sep) and f.endswith(".c") - ] - modified_c_files_existing = [f for f in modified_c_files if os.path.exists(f)] - return modified_c_files_existing + modified_files = set(modified_files_str.splitlines()) + + all_src_files, all_extra_files = format.list_files_to_format() + # Split modified_files between source files and extra files (see format.py) + # This also filters out deleted files that no logner exist + modified_src_files_existing = list(modified_files.intersection(all_src_files)) + modified_extra_files_existing = list(modified_files.intersection(all_extra_files)) + + return modified_src_files_existing, modified_extra_files_existing def main(): @@ -40,21 +41,23 @@ def main(): args = parser.parse_args() if args.compare_to: - src_files = get_modified_files_to_format(args.compare_to) + src_files, extra_files = get_modified_files_to_format(args.compare_to) if args.verbose: - print("Formatting specific files:", len(src_files), src_files) - if not src_files: + print("Formatting specific files:") + print(len(src_files), src_files) + print(len(extra_files), extra_files) + if not src_files and not extra_files: if args.verbose: print("Nothing to format") exit(0) else: - src_files = glob.glob("src/**/*.c", recursive=True) + src_files, extra_files = format.list_files_to_format() nb_jobs = multiprocessing.cpu_count() git_status_pre = get_git_status() - format.format_files(src_files, [], nb_jobs) + format.format_files(src_files, extra_files, nb_jobs) git_status_post = get_git_status()