scripts: make-manifest.py drops launcher exe from files list #9
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
make-manifest.pycurrently stores the launcher file only under the top-levellauncherfield of the manifest and excludes it from thefilesarray.The launcher-side orchestrator (jann/metin-launcher
UpdateOrchestrator) only iteratesmanifest.fileswhen downloading blobs — it never consults thelauncherfield for a download action. Result: the launcher exe (e.g.Metin2.exe) is never fetched, the install dir is left without the client binary, andGameProcess.Launchlogsgame executable not found.Hit this during today's m2pack-full release: had to post-process every signed manifest by reinjecting the launcher entry into files before publish.
Reproduction
python3 scripts/make-manifest.py --source /path/to/client --launcher Metin2.exe --out manifest.jsonjq '.files | map(select(.path == "Metin2.exe")) | length' manifest.json→0Fix options
filesinwalk_clientbefore returning (and keep thelauncherfield for spawn-time metadata).manifest.launcheron a hash mismatch.The first option is simpler and keeps the orchestrator contract ("files lists every blob") honest. Opening as a blocker for the next clean-pipeline release.
Workaround currently in use: the release wrapper patches the JSON with a second python pass that sorts the launcher entry into files and re-signs with
sign-manifest.py.Closing as misframed after Jakub's review.
The upstream
make-manifest.pydoes the right thing per spec (m2dev-client/docs/update-manifest.md):launcherentry is privileged, always required, never in thefilesarrayMetin2Launcher.exe(the self-updating updater), notMetin2.exe(the game client)fileslike any other contentThe "bug" I hit yesterday was actually my own release pipeline passing
--launcher Metin2.exetomake-manifest.py, which is a spec misuse — it tells the script "this PE binary is the updater", and the script correctly excludes it from files. My post-process wrapper then re-injected it back, which worked but muddles the contract.The correct fix is in the release tree assembly (reframed as [new issue]), not in
make-manifest.py.