Repository navigation
contributing
How changes get into Launchstation: what to run before opening a pull request, what CI enforces, and what only real hardware can prove.
- Fork NathanNeurotic/Launchstation and branch from
master. Check existing issues and open a draft early for anything large (storage-driver and IOP-lifecycle changes in particular). - Build locally with the LLVM toolchain. A change that only compiles with GCC is not releasable.
- Run the affected tests, and the whole suite for anything touching shared code such as
init.c,dash_worker.cor the file-copy path. - Update documentation in the same pull request (see below).
- Open a pull request. CI runs on every push and pull request; only a verified push to
mastercan publish the rolling release.
.github/workflows/compile.yml (Automated-Build) runs, in order:
- the explicit list of
tests/test_*.pyscripts, then the copy-test fixture generator; - the documentation site build (
python3 docs-site/build.py); - SDK install,
ps2build updateand the LLVM toolchain check; - Mbed TLS and libjpeg-turbo builds, the Google client header, the isolated PC CARD CF driver;
- the standard and DS34 builds, then
check_ds34_build.py,check_toolchain_purity.py,check_udpfs_smap.pyandcheck_loader_layout.sh; - packaging with
package_apps.pyand a second run of the package test; artifacts are uploaded.
On master pushes, a final step publishes the four packages to the rolling latest release only if the tests, both builds and every check passed, if master did not move during the build, and if the previous latest commit is an ancestor of the new one (the in-app updater relies on that lineage). It then re-downloads each published asset, compares it byte for byte, and only then moves the tag. Pull requests build review artifacts but never overwrite public downloads.
- Tests are standalone scripts:
python3 tests/test_name.pyexits non-zero on failure and normally prints aPASS:line. - Prefer compiling the production source with small stubs (see
test_worker_queue.py,test_copy_pipeline.py,test_pccf.py) over re-implementing logic in the test. The host compiler isgccorclang. - Source/workflow-contract tests (
test_llvm_toolchain.py,test_rolling_release_workflow.py,test_native_cloud.py,test_self_update.py) read files and assert on them; update them deliberately when you change the contract they protect. -
Register new tests: CI runs an explicit list. Add a line to the first step of
compile.yml; a test that is not listed does not gate merges. - Run everything locally with
for t in tests/test_*.py; do python3 "$t" || echo "FAIL $t"; donefrom inside a Git checkout.
Fixtures live in tests/fixtures and tests/pccf-stubs. Passing host tests do not establish console behavior: USB timing, IOP stalls, DEV9 sharing, display output and external-core handoffs need a console, and release notes say so.
When you test on real hardware, report the console model and revision, video mode, boot device and exact ELF commit (shown by Tools > About Launchstation), the storage devices attached and the minimal reproduction steps. Say clearly what you did not test (for example one USB drive but not two). The copy-test fixture (LS-COPY-TEST.zip, produced by scripts/copy_test_pack.py and uploaded by CI as the Launchstation-copy-test artifact) gives deterministic files for verifying copies across devices; --verify checks a returned folder.
- User documentation is
docs-site/content/*.htmlplusdocs-site/manifest.json; long-form guides aredocs/wiki/*.md. Do not editgh-pagesor the GitHub wiki by hand; both are generated. - Add a bullet to the
## Rollingsection ofCHANGELOG.mdfor user-visible changes. The rolling release notes are built from that section. - Pages must match the code: when you change a menu label, file name, default or network behavior, grep
docs-site/content,docs/andREADME.mdfor it. - Every external project you vendor, link or mention needs an entry in Credits and docs/THIRD_PARTY_CREDITS.md, with the role (vendored code, compiled dependency, external program, service, or reference) and the license. Keep original file-level notices intact. For vendored source also record upstream URL, base commit, local changes and license in an
ORIGIN.mdorVENDORED.mdbeside it (seeiop/udpfs_smap/ORIGIN.mdandiop/pccf/VENDORED.md). - There is no root
LICENSEfile, and the tree contains components under different terms (AFL-2.0, AFL-3.0, MIT, BSD, Apache-2.0 and a restrictive legacy libcdvd license); do not assume one license applies to every file.
- Never commit generated or secret files:
githash.h,.cloud-deps/,.jpeg-deps/,.cache/,build*/,.ps2-ds34.yaml, packages and ZIPs (they are in.gitignore), or Google client secrets, token files (WLE-CLOUD.TOK) and MagicGate keys (PS2KEYS.dat). - The official Google OAuth client comes only from the repository secrets
WLE_GOOGLE_CLIENT_IDandWLE_GOOGLE_CLIENT_SECRET; forks build without it. - Keep changes behavior-neutral when refactoring, and keep new IOP modules lazy-loaded.
Use the Launchstation issue form. It asks for the console model, the build commit, the package you installed, the storage and network setup, and the display chain, so complete reports are triaged quickly. Consoles with a modchip installed are a confounder; confirmation on an unmodified console is appreciated. See also Good bug report.
LAUNCHSTATION repository · Live documentation · Release downloads
Maintained from documentation sources. Do not edit generated pages directly; propose changes in the source repository.