summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/progress.py181
-rwxr-xr-xtools/upload_frogress.py40
2 files changed, 68 insertions, 153 deletions
diff --git a/tools/progress.py b/tools/progress.py
index c4e99a4..857563a 100755
--- a/tools/progress.py
+++ b/tools/progress.py
@@ -1,132 +1,87 @@
#!/usr/bin/env python3
-# SPDX-FileCopyrightText: © 2023 ZeldaRET
+# SPDX-FileCopyrightText: © 2023-2025 ZeldaRET
# SPDX-License-Identifier: MIT
from __future__ import annotations
import argparse
-import mapfile_parser
+import sys
from pathlib import Path
+import decomp_settings
+import mapfile_parser
-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 segment in mapFile:
- for file in segment:
- if len(file) == 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:])
-
- extensionlessFilePath = originalFilePath
- while extensionlessFilePath.suffix:
- extensionlessFilePath = extensionlessFilePath.with_suffix("")
-
- fullAsmFile = asmPath / extensionlessFilePath.with_suffix(".s")
-
- handwrittenAsmFiles = [Path("boot/libc64/fp.o"), Path("makerom/entry.o")]
-
- if originalFilePath in handwrittenAsmFiles:
- wholeFileIsUndecomped = False
- else:
- wholeFileIsUndecomped = fullAsmFile.exists()
-
-
- for func in file:
- funcAsmPath = nonmatchings / extensionlessFilePath / f"{func.name}.s"
-
- symSize = 0
- if func.size is not None:
- symSize = func.size
-
- if wholeFileIsUndecomped:
- totalStats.undecompedSize += symSize
- progressPerFolder[folder].undecompedSize += symSize
- elif funcAsmPath.exists():
- totalStats.undecompedSize += symSize
- progressPerFolder[folder].undecompedSize += symSize
- else:
- totalStats.decompedSize += symSize
- progressPerFolder[folder].decompedSize += symSize
-
- 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 segment in mapFile:
- for file in segment:
- if len(file) == 0:
- continue
-
- filepathParts = list(file.filepath.parts)
- if version in filepathParts:
- filepathParts.remove(version)
- file.filepath = Path(*filepathParts)
-
- nonMatchingsPath = ASMPATH / version / NONMATCHINGS
-
- return getProgressFromMapFile(mapFile.filterBySectionType(".text"), ASMPATH / version, nonMatchingsPath, aliases={"ultralib": "libultra"})
-
-def getAssetProgress(mapPath: Path, version: str):
- totalStats = mapfile_parser.ProgressStats()
- progressPerFolder: dict[str, mapfile_parser.ProgressStats] = dict()
- progressPerFolder["objects"] = mapfile_parser.ProgressStats()
- progressPerFolder["unidentified"] = mapfile_parser.ProgressStats()
-
- mapFile = mapfile_parser.MapFile()
- mapFile.readMapFile(mapPath)
- mapFile = mapFile.filterBySectionType(".data")
-
- for segment in mapFile:
- for file in segment:
-
- if len(file) == 0:
- continue
- if str(file.filepath).startswith("build/src/objects"):
- totalStats.decompedSize += file.size
- progressPerFolder["objects"].decompedSize += file.size
- elif str(file.filepath).startswith("build/assets/" + version + "/objects"):
- totalStats.undecompedSize += file.size
- progressPerFolder["objects"].undecompedSize += file.size
- elif str(file.filepath).startswith("build/assets/" + version):
- progressPerFolder["unidentified"].undecompedSize += file.size
- totalStats.undecompedSize += file.size
-
- return totalStats, progressPerFolder
+def doThing(
+ version: str,
+ settings: decomp_settings.Config,
+ units: bool,
+ sort: bool,
+ remaining: bool,
+):
+ selectedVersion = settings.get_version_by_name(version)
+ assert selectedVersion is not None
+ mapPath = Path(selectedVersion.paths.map)
+ outputPath = Path(selectedVersion.paths.build_dir) / "report.json"
+
+ specificSettings = mapfile_parser.frontends.objdiff_report.SpecificSettings.fromDecompConfig(settings)
+ assert specificSettings is not None
+ prefixesToTrim = specificSettings.prefixesToTrim
+ pathIndex = specificSettings.pathIndex
+ assert pathIndex is not None
+
+ reportCategories = mapfile_parser.ReportCategories()
+ for cat in specificSettings.categories:
+ reportCategories.push(cat.ide, cat.name, cat.paths)
+
+ if specificSettings.checkAsmPaths:
+ assert selectedVersion.paths.asm is not None
+ asmPath = Path(selectedVersion.paths.asm)
+ else:
+ asmPath = None
+
+ summaryTableConfig = mapfile_parser.frontends.objdiff_report.SummaryTableConfig(
+ doUnits=units,
+ sort=sort,
+ remaining=remaining,
+ )
+
+ exitcode = mapfile_parser.frontends.objdiff_report.doObjdiffReport(
+ mapPath,
+ outputPath,
+ prefixesToTrim,
+ reportCategories,
+ pathIndex=pathIndex,
+ asmPath=asmPath,
+ summaryTableConfig=summaryTableConfig,
+ )
+ sys.exit(exitcode)
def progressMain():
- parser = argparse.ArgumentParser()
- parser.add_argument("-v", "--version", help="version to process", default="jp")
+ settings = decomp_settings.scan_for_config()
+ versionsChoices = [x.name for x in settings.versions]
- args = parser.parse_args()
+ parser = argparse.ArgumentParser(description="Print the progress for each category in your terminal.")
+ parser.add_argument("-v", "--version", help="version to process", choices=versionsChoices, default=versionsChoices[0])
+ parser.add_argument("-u", "--units", help="Print units instead of categories", action="store_true")
+ parser.add_argument("-s", "--sort", help="Sort by decomped size", action="store_true")
+ parser.add_argument("-r", "--remaining", help="Print an extra column indicating the remaining percentage to match of each entry", action="store_true")
- mapPath = Path("build") / f"animalforest-{args.version}.map"
+ args = parser.parse_args()
+ version: str = args.version
+ units: bool = args.units
+ sort: bool = args.sort
+ remaining: bool = args.remaining
+
+ doThing(
+ version,
+ settings,
+ units,
+ sort,
+ remaining,
+ )
- codeTotalStats, codeProgressPerFolder = getProgress(mapPath, args.version)
- assetTotalStats, assetProgressPerFolder = getAssetProgress(mapPath, args.version)
- print("code:")
- mapfile_parser.progress_stats.printStats(codeTotalStats, codeProgressPerFolder)
- print("\n\nassets:")
- mapfile_parser.progress_stats.printStats(assetTotalStats, assetProgressPerFolder)
if __name__ == "__main__":
progressMain()
diff --git a/tools/upload_frogress.py b/tools/upload_frogress.py
deleted file mode 100755
index 480c8cf..0000000
--- a/tools/upload_frogress.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/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
-
-import progress
-
-
-BASE_URL = "https://progress.deco.mp"
-PROJECT = "animalforest"
-
-def uploadProgressMain():
- parser = argparse.ArgumentParser()
- parser.add_argument("version", help="Version slug")
- parser.add_argument("--apikey", help="API key")
-
- args = parser.parse_args()
-
- version: str = args.version
- apikey: str = args.apikey
- mapPath = Path("build") / f"animalforest-{args.version}.map"
-
- codeTotalStats, codeProgressPerFolder = progress.getProgress(mapPath, version)
- codeEntries: dict[str, int] = mapfile_parser.frontends.upload_frogress.getFrogressEntriesFromStats(codeTotalStats, codeProgressPerFolder, verbose=True)
-
- assetTotalStats, assetProgressPerFolder = progress.getAssetProgress(mapPath, version)
- assetEntries: dict[str, int] = mapfile_parser.frontends.upload_frogress.getFrogressEntriesFromStats(assetTotalStats, assetProgressPerFolder, verbose=True)
-
- url = mapfile_parser.utils.generateFrogressEndpointUrl(BASE_URL, PROJECT, version)
- mapfile_parser.frontends.upload_frogress.uploadEntriesToFrogress(codeEntries, "code", url, apikey=apikey, verbose=True)
- mapfile_parser.frontends.upload_frogress.uploadEntriesToFrogress(assetEntries, "assets", url, apikey=apikey, verbose=True)
-
-if __name__ == '__main__':
- uploadProgressMain()