tools/progress: Add option to print CSV line

This commit is contained in:
Léo Lam 2020-11-22 11:54:00 +01:00
parent 88620ca9af
commit 601ecd92a1
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
1 changed files with 58 additions and 27 deletions

View File

@ -9,6 +9,8 @@ from util.utils import FunctionStatus
import typing as tp import typing as tp
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--csv", "-c", action="store_true",
help="Print a CSV line rather than a human-readable progress report")
parser.add_argument("--print-nm", "-n", action="store_true", parser.add_argument("--print-nm", "-n", action="store_true",
help="Print non-matching functions with major issues") help="Print non-matching functions with major issues")
parser.add_argument("--print-eq", "-e", action="store_true", parser.add_argument("--print-eq", "-e", action="store_true",
@ -68,18 +70,19 @@ for info in utils.get_functions():
counts[info.status] += 1 counts[info.status] += 1
code_size[info.status] += info.size code_size[info.status] += info.size
if info.status == FunctionStatus.NonMatching: if not args.csv:
if args.print_nm and not should_hide_nonmatching(info.decomp_name): if info.status == FunctionStatus.NonMatching:
print(f"{Fore.RED}NM{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}") if args.print_nm and not should_hide_nonmatching(info.decomp_name):
elif info.status == FunctionStatus.Equivalent: print(f"{Fore.RED}NM{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}")
if args.print_eq and not should_hide_nonmatching(info.decomp_name): elif info.status == FunctionStatus.Equivalent:
print(f"{Fore.YELLOW}EQ{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}") if args.print_eq and not should_hide_nonmatching(info.decomp_name):
elif info.status == FunctionStatus.Matching: print(f"{Fore.YELLOW}EQ{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}")
if args.print_ok: elif info.status == FunctionStatus.Matching:
print(f"{Fore.GREEN}OK{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}") if args.print_ok:
elif info.status == FunctionStatus.Wip: print(f"{Fore.GREEN}OK{Fore.RESET} {utils.format_symbol_name(info.decomp_name)}")
print( elif info.status == FunctionStatus.Wip:
f"{Back.RED}{Style.BRIGHT}{Fore.WHITE} WIP {Style.RESET_ALL} {utils.format_symbol_name(info.decomp_name)}{Style.RESET_ALL}") print(
f"{Back.RED}{Style.BRIGHT}{Fore.WHITE} WIP {Style.RESET_ALL} {utils.format_symbol_name(info.decomp_name)}{Style.RESET_ALL}")
def format_progress(label: str, num: int, size: int): def format_progress(label: str, num: int, size: int):
@ -97,22 +100,50 @@ def format_ai_progress(label: str, class_type: AIClassType):
return f"{ai_counts_done[class_type]:>7d} {label}{Fore.RESET} ({percentage}%)" return f"{ai_counts_done[class_type]:>7d} {label}{Fore.RESET} ({percentage}%)"
print() if args.csv:
import git
print(f"{num_total:>7d} functions (size: ~{code_size_total} bytes)") version = 1
git_object = git.Repo().head.object
timestamp = str(git_object.committed_date)
git_hash = git_object.hexsha
count_decompiled = counts[FunctionStatus.Matching] + counts[FunctionStatus.Equivalent] + counts[ fields = [
FunctionStatus.NonMatching] str(version),
code_size_decompiled = code_size[FunctionStatus.Matching] + code_size[FunctionStatus.Equivalent] + code_size[ timestamp,
FunctionStatus.NonMatching] git_hash,
print(format_progress(f"{Fore.CYAN}decompiled", count_decompiled, code_size_decompiled)) str(num_total),
print(format_progress_for_status(f"{Fore.GREEN}matching", FunctionStatus.Matching)) str(code_size_total),
print(format_progress_for_status(f"{Fore.YELLOW}non-matching (minor issues)", FunctionStatus.Equivalent))
print(format_progress_for_status(f"{Fore.RED}non-matching (major issues)", FunctionStatus.NonMatching))
print() str(counts[FunctionStatus.Matching]),
print(format_ai_progress("actions", AIClassType.Action)) str(code_size[FunctionStatus.Matching]),
print(format_ai_progress("AIs", AIClassType.AI))
print(format_ai_progress("behaviors", AIClassType.Behavior)) str(counts[FunctionStatus.Equivalent]),
print(format_ai_progress("queries", AIClassType.Query)) str(code_size[FunctionStatus.Equivalent]),
str(counts[FunctionStatus.NonMatching]),
str(code_size[FunctionStatus.NonMatching]),
]
print(",".join(fields))
else:
print()
print(f"{num_total:>7d} functions (size: ~{code_size_total} bytes)")
count_decompiled = counts[FunctionStatus.Matching] + counts[FunctionStatus.Equivalent] + counts[
FunctionStatus.NonMatching]
code_size_decompiled = code_size[FunctionStatus.Matching] + code_size[FunctionStatus.Equivalent] + code_size[
FunctionStatus.NonMatching]
print(format_progress(f"{Fore.CYAN}decompiled", count_decompiled, code_size_decompiled))
print(format_progress_for_status(f"{Fore.GREEN}matching", FunctionStatus.Matching))
print(format_progress_for_status(f"{Fore.YELLOW}non-matching (minor issues)", FunctionStatus.Equivalent))
print(format_progress_for_status(f"{Fore.RED}non-matching (major issues)", FunctionStatus.NonMatching))
print()
print(format_ai_progress("actions", AIClassType.Action))
print(format_ai_progress("AIs", AIClassType.AI))
print(format_ai_progress("behaviors", AIClassType.Behavior))
print(format_ai_progress("queries", AIClassType.Query))