summaryrefslogtreecommitdiff
path: root/tools/progress.py
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2023-04-03 12:22:52 -0400
committerGitHub <noreply@github.com>2023-04-03 12:22:52 -0400
commit817a05c1abdee0009c625b0bba7971e6ab9501c0 (patch)
treee756138e4d94ab26fe6c9f35a7658d2ad518c5d5 /tools/progress.py
parent35cb5d1cfc163b95f48a2bc4f1f22bbff6e9e109 (diff)
Frogress script (#10)
* initial progress script * uploadfrogress script * Add Frogress step to Jenkinsfile * rename to animalforest * badge * ZeldaRET
Diffstat (limited to 'tools/progress.py')
-rwxr-xr-xtools/progress.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/tools/progress.py b/tools/progress.py
new file mode 100755
index 0000000..bff79fd
--- /dev/null
+++ b/tools/progress.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+
+# SPDX-FileCopyrightText: © 2023 ZeldaRET
+# SPDX-License-Identifier: MIT
+
+from __future__ import annotations
+
+import argparse
+import mapfile_parser
+from pathlib import Path
+
+
+ASMPATH = Path("asm")
+NONMATCHINGS = "nonmatchings"
+
+
+def getProgressFromMapFile(mapFile: mapfile_parser.MapFile, asmPath: Path, nonmatchings: Path, aliases: dict[str, str]=dict(), pathIndex: int=2) -> tuple[mapfile_parser.ProgressStats, dict[str, mapfile_parser.ProgressStats]]:
+ totalStats = mapfile_parser.ProgressStats()
+ progressPerFolder: dict[str, mapfile_parser.ProgressStats] = dict()
+
+ for file in mapFile:
+ if len(file.symbols) == 0:
+ continue
+
+ folder = file.filepath.parts[pathIndex]
+ if folder in aliases:
+ folder = aliases[folder]
+
+ if folder not in progressPerFolder:
+ progressPerFolder[folder] = mapfile_parser.ProgressStats()
+
+ originalFilePath = Path(*file.filepath.parts[pathIndex:])
+ fullAsmFile = asmPath / originalFilePath.with_suffix(".s")
+ wholeFileIsUndecomped = fullAsmFile.exists()
+
+ for func in file.symbols:
+ if wholeFileIsUndecomped:
+ totalStats.undecompedSize += func.size
+ progressPerFolder[folder].undecompedSize += func.size
+ elif mapFile.findSymbolByName(func.name) is not None:
+ totalStats.undecompedSize += func.size
+ progressPerFolder[folder].undecompedSize += func.size
+ else:
+ totalStats.decompedSize += func.size
+ progressPerFolder[folder].decompedSize += func.size
+
+ return totalStats, progressPerFolder
+
+
+def getProgress(mapPath: Path, version: str) -> tuple[mapfile_parser.ProgressStats, dict[str, mapfile_parser.ProgressStats]]:
+ mapFile = mapfile_parser.MapFile()
+ mapFile.readMapFile(mapPath)
+
+ for file in mapFile:
+ if len(file.symbols) == 0:
+ continue
+
+ filepathParts = list(file.filepath.parts)
+ if version in filepathParts:
+ filepathParts.remove(version)
+ file.filepath = Path(*filepathParts)
+
+ nonMatchingsPath = ASMPATH / version / NONMATCHINGS
+
+ return mapFile.filterBySegmentType(".text").getProgress(ASMPATH / version, nonMatchingsPath, aliases={"ultralib": "libultra"})
+
+def progressMain():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-v", "--version", help="version to process", default="jp")
+
+ args = parser.parse_args()
+
+ mapPath = Path("build") / f"animalforest.{args.version}.map"
+
+ totalStats, progressPerFolder = getProgress(mapPath, args.version)
+
+ mapfile_parser.progress_stats.printStats(totalStats, progressPerFolder)
+
+if __name__ == "__main__":
+ progressMain()