Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/unsupported_gml_api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ body:
attributes:
label: Versions
description: GM2Godot commit or release, GameMaker version, Godot version, and target platform.
placeholder: "GM2Godot 0.7.52, GameMaker LTS 2026, Godot 4.7.1, Windows"
placeholder: "GM2Godot 0.7.53, GameMaker LTS 2026, Godot 4.7.1, Windows"
validations:
required: true
59 changes: 59 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ jobs:
timeout-minutes: 20
env:
PIP_CONFIG_FILE: nul
GM2GODOT_SKIP_WINDOWS_INCLUDED_FILES_SCALE_GATE: '1'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Expand Down Expand Up @@ -234,6 +235,64 @@ jobs:
tests.test_included_files.TestIncludedFilesManagedRootTransaction
tests.test_included_files.TestIncludedFilesConverterOutputContainment

windows-included-files-scale:
runs-on: windows-2025
timeout-minutes: 20
env:
PIP_CONFIG_FILE: nul
GM2GODOT_REQUIRE_WINDOWS_INCLUDED_FILES_SCALE_GATE: '1'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12.10'
architecture: x64

- name: Install and verify test dependencies
shell: bash
run: |
venv_dir="$(cygpath -u "$RUNNER_TEMP")/gm2godot-included-files-scale-windows-venv"
if [ -e "$venv_dir" ] || [ -L "$venv_dir" ]; then
echo "::error::Refusing to reuse dependency environment: $venv_dir" >&2
exit 1
fi
python -m venv "$venv_dir"
venv_bin="$venv_dir/Scripts"
venv_native="$(cygpath -w "$venv_dir")"
venv_path_native="$(cygpath -w "$venv_bin")"
github_env_file="$(cygpath -u "$GITHUB_ENV")"
github_path_file="$(cygpath -u "$GITHUB_PATH")"
printf 'VIRTUAL_ENV=%s\n' "$venv_native" >> "$github_env_file"
printf '%s\n' "$venv_path_native" >> "$github_path_file"
export VIRTUAL_ENV="$venv_native"
export PATH="$venv_bin:$PATH"
hash -r
python -c 'import os, pathlib, sys; raise SystemExit(0 if pathlib.Path(sys.prefix).resolve() == pathlib.Path(os.environ["VIRTUAL_ENV"]).resolve() else 1)'
python -m pip --isolated --disable-pip-version-check --no-input install --no-cache-dir --only-binary=:all: \
--constraint constraints/requirements-windows-py312.txt \
pip==26.1.2
python -m pip --isolated --disable-pip-version-check --no-input install --no-cache-dir --only-binary=:all: \
--constraint constraints/requirements-windows-py312.txt \
-r requirements.txt
python scripts/verify_dependency_environment.py \
--constraint constraints/requirements-windows-py312.txt \
--mode subset \
--require pip \
--require Pillow \
--require markdown2 \
--require requests \
--require PySide6 \
--expected-python 3.12.10 \
--expected-platform win32 \
--expected-machine AMD64 \
--expected-pip 26.1.2 \
--output "$RUNNER_TEMP/included-files-scale-windows-dependencies.json"

- name: Run native Windows Included Files scale gate
run: python -m scripts.run_windows_included_files_scale_gate

windows-managed-output-crash-recovery:
runs-on: windows-2025
timeout-minutes: 20
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 0.7.53 - 2026-08-03

- Split the native Windows 10,000-entry Included Files stress test from the broader artifact-transaction suite so both retain substantial margin under the unchanged 20-minute timeout.
- Kept ordinary and local unittest discovery running the scale test while allowing only its paired GitHub Actions job to skip that exact case.
- Added a fail-closed dedicated runner that requires exactly one executed passing scale test with zero skips, plus workflow-policy coverage for the pinned Windows runner, Python, dependency constraints, timeout, flags, and locked invocation.

## 0.7.52 - 2026-07-23

- Extracted dependency-only `shared_models`, `expression_models`, and `result_models` owners for cross-phase tokens/context/static metadata, the complete expression AST union, and preprocessing/diagnostic/source-map/transpile results.
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ Version 0.7.51 freezes the current GML transpiler facade and phase-boundary base

Version 0.7.52 extracts dependency-only typed owners for shared GML phase data, the complete expression AST union, and preprocessing/source-map/transpile results. Every phase and converter now consumes non-underscore model exports; only the frozen top-level facade retains private model aliases for the later #820 cleanup. Dataclass shape and mutability, errors, serialization, generated output, diagnostics, and supported facade identities/signatures remain unchanged.

Version 0.7.53 keeps the native Windows artifact-transaction suite and the 10,000-entry Included Files publish/recovery stress gate in separate jobs under the same 20-minute timeout. The scale test remains part of ordinary local and full-suite discovery; only the paired broader Windows job may skip it, while a fail-closed dedicated runner requires the exact case to be the sole collected test and to execute successfully without a skip.

## What GM2Godot Is and Isn't

**GM2Godot is:**
Expand All @@ -82,7 +84,7 @@ The full compatibility roadmap lives in [`todo-list/`](todo-list/README.md). It

## Releases

Current source version: `0.7.52`.
Current source version: `0.7.53`.

Downloadable releases include Windows (`.exe`), macOS (`.dmg` with `.app`), and Linux binaries. You can also run from source on Windows, macOS, and Linux.
The packaged Linux artifact is validated on Ubuntu 24.04 x86_64. Its glibc 2.39 requirement is necessary but does not make other distributions a validated target; they must also supply compatible system, OpenGL/EGL, and X11 libraries. The reviewed Linux package manifest installs Ubuntu's `libegl1` and `libgl1` providers for QtGui together with the required XCB client libraries. The release job rejects unresolved-library warnings, extracts the final ZIP, and proves that its GUI reaches the event loop through the real `qxcb` platform under Xvfb before upload.
Expand Down
4 changes: 2 additions & 2 deletions docs/wiki/Compatibility-and-Limitations.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Compatibility and Limitations

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

[Home](Home) · [Quick Start Conversion](Quick-Start-Conversion) · [Diagnostics and Troubleshooting](Diagnostics-and-Troubleshooting)

Expand Down
6 changes: 4 additions & 2 deletions docs/wiki/Contributing-and-Testing.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Contributing and Testing

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

This page is the short contributor route map. The repository's [CONTRIBUTING.md](https://github.com/Infiland/GM2Godot/blob/main/CONTRIBUTING.md) and `AGENTS.md` remain authoritative for development rules.

Expand Down Expand Up @@ -188,6 +188,8 @@ Included Files transaction changes must retain the subprocess hard-exit recovery

The publication tests stop the child process at every forward transaction phase from the staged journal through commit-marker retirement, then require both format-v1 and format-v2 recovery to select one complete generation. The size tests require byte-exact preflight before payload staging and keep the larger record for a changed 10,000-file generation below the unchanged 16 MiB cap. The two cleanup tests independently hard-exit after quarantine or removal for owned backup, staging, stable-record, and temporary-record state. Run the native Windows Included Files workflow when changing lock, move, junction, read-only, or cleanup behavior; modeled `os.name` tests are not a substitute for NTFS and Win32 coverage. Preserve the public `res://included_files/` and registry paths, reject unknown reserved-path state, and keep the documented prohibition on conversion alongside a live game or non-cooperating writer.

Native Windows CI keeps the broad `windows-artifact-transactions` suite separate from `windows-included-files-scale`. The broad job may set `GM2GODOT_SKIP_WINDOWS_INCLUDED_FILES_SCALE_GATE=1` only under GitHub Actions; the dedicated job sets `GM2GODOT_REQUIRE_WINDOWS_INCLUDED_FILES_SCALE_GATE=1` and invokes `python -m scripts.run_windows_included_files_scale_gate` from the repository root. That fail-closed runner loads only `test_ten_thousand_entry_compact_records_publish_and_recover_below_cap`, requires exactly one collected and executed passing test, and rejects skips, failures, errors, expected failures, unexpected successes, and fixture exits. Workflow policy locks the dedicated step inventory and forbids conditional or continue-on-error execution. Simultaneous require/skip flags fail closed. Both jobs keep the pinned Windows 2025, CPython 3.12.10, dependency constraints, and 20-minute timeout. Never copy the skip flag into local commands or the dedicated scale job.

Worker-scheduling changes must also retain the deterministic 10,000-source submission bound, changed/unchanged failure and cancellation admission checks, and cross-worker output equivalence:

```bash
Expand Down
4 changes: 2 additions & 2 deletions docs/wiki/Diagnostics-and-Troubleshooting.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Diagnostics and Troubleshooting

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

[Home](Home) · [Quick Start Conversion](Quick-Start-Conversion) · [Compatibility and Limitations](Compatibility-and-Limitations)

Expand Down
4 changes: 2 additions & 2 deletions docs/wiki/Generated-Project-and-Runtime.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Generated Project and Runtime

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

[Home](Home) · [Installation](Installation) · [Quick start](Quick-Start-Conversion) · [Compatibility](Compatibility-and-Limitations) · [Diagnostics](Diagnostics-and-Troubleshooting) · [Contributing](Contributing-and-Testing)

Expand Down
6 changes: 3 additions & 3 deletions docs/wiki/Home.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# GM2Godot Documentation

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

GM2Godot converts supported GameMaker source projects and GML into editable Godot projects. It combines asset conversion, a GML-to-GDScript transpiler, generated runtime helpers, compatibility diagnostics, and headless Godot validation. It is a migration aid, not a promise of automatic one-to-one gameplay parity.

Expand All @@ -21,7 +21,7 @@ Maintainers should also read [Release and Wiki Maintenance](Maintainer-Release-a

This documentation set describes:

- GM2Godot 0.7.52;
- GM2Godot 0.7.53;
- GameMaker LTS 2026 source projects in the GMS2 runtime family; and
- Godot 4.7.1 output and validation, pinned in CI as `4.7.1.stable.official.a13da4feb`.

Expand Down
8 changes: 4 additions & 4 deletions docs/wiki/Installation.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Installation

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

Use a packaged release for the desktop interface, or run from source when you also need the headless CLI. The current packaging and dependency details live in the repository's [release workflow](https://github.com/Infiland/GM2Godot/blob/main/.github/workflows/release.yml), [`requirements.txt`](https://github.com/Infiland/GM2Godot/blob/main/requirements.txt), and [native dependency-lock workflow](https://github.com/Infiland/GM2Godot/blob/main/.github/workflows/dependency-locks.yml).

Expand Down Expand Up @@ -46,7 +46,7 @@ On Windows, run `Get-FileHash -Algorithm SHA256 .\GM2Godot-windows.zip` in Power

The packaged builds are produced as windowed applications. For the CLI commands in this Wiki, use a source installation.

After launch, confirm that the title bar or **Help → About GM2Godot** shows version `0.7.52`. Click the version in the bottom information bar to browse the ten newest release changelogs; **Show more** appends the next ten.
After launch, confirm that the title bar or **Help → About GM2Godot** shows version `0.7.53`. Click the version in the bottom information bar to browse the ten newest release changelogs; **Show more** appends the next ten.

## Run from source

Expand Down Expand Up @@ -133,6 +133,6 @@ python main.py --version
python main.py list-converters
```

The first command should print `GM2Godot 0.7.52`; the second should list the conversion groups and the exact converter keys accepted by `--only`. The same CLI is also available through `python -m src.cli`.
The first command should print `GM2Godot 0.7.53`; the second should list the conversion groups and the exact converter keys accepted by `--only`. The same CLI is also available through `python -m src.cli`.

Continue with [Quick Start Conversion](Quick-Start-Conversion). If launch or dependency setup fails, see [Diagnostics and Troubleshooting](Diagnostics-and-Troubleshooting).
4 changes: 2 additions & 2 deletions docs/wiki/Maintainer-Release-and-Wiki.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Release and Wiki Maintenance

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

This page documents the current maintainer path for a versioned release and for publishing the reviewed Wiki sources. It does not replace branch protection or repository settings.

Expand Down
4 changes: 2 additions & 2 deletions docs/wiki/Quick-Start-Conversion.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Quick Start Conversion

> **Applies to:** GM2Godot 0.7.52 · GameMaker LTS 2026 · Godot 4.7.1
> **Applies to:** GM2Godot 0.7.53 · GameMaker LTS 2026 · Godot 4.7.1
>
> **Last reviewed:** 2026-07-23
> **Last reviewed:** 2026-08-03

This guide covers a first conversion through either the desktop interface or the source CLI. GM2Godot converts source projects, so select the GameMaker project root that contains the `.yyp` file—not an exported or compiled game.

Expand Down
88 changes: 88 additions & 0 deletions scripts/run_windows_included_files_scale_gate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from __future__ import annotations

import os
import sys
import unittest
from typing import TextIO


EXACT_TEST_NAME = (
"tests.test_included_files.TestIncludedFilesManagedRootTransaction."
"test_ten_thousand_entry_compact_records_publish_and_recover_below_cap"
)
REQUIRE_ENVIRONMENT_VARIABLE = (
"GM2GODOT_REQUIRE_WINDOWS_INCLUDED_FILES_SCALE_GATE"
)
SKIP_ENVIRONMENT_VARIABLE = "GM2GODOT_SKIP_WINDOWS_INCLUDED_FILES_SCALE_GATE"


def run_exact_suite(
suite: unittest.TestSuite,
*,
stream: TextIO,
) -> int:
collected = suite.countTestCases()
if collected != 1:
print(
"The native Windows Included Files scale gate must collect exactly "
f"one test; collected {collected}.",
file=stream,
)
return 2

result = unittest.TextTestRunner(stream=stream, verbosity=2).run(suite)
invalid_outcomes = (
result.testsRun != 1
or bool(result.skipped)
or bool(result.failures)
or bool(result.errors)
or bool(result.expectedFailures)
or bool(result.unexpectedSuccesses)
or not result.wasSuccessful()
)
if invalid_outcomes:
print(
"The native Windows Included Files scale gate requires exactly one "
"executed passing test with zero skips, failures, errors, expected "
"failures, or unexpected successes.",
file=stream,
)
return 1
return 0


def main() -> int:
if os.environ.get("GITHUB_ACTIONS") != "true":
print(
"The native Windows Included Files scale gate runner may only run "
"in GitHub Actions.",
file=sys.stderr,
)
return 2
if os.environ.get(REQUIRE_ENVIRONMENT_VARIABLE) != "1":
print(
f"{REQUIRE_ENVIRONMENT_VARIABLE}=1 is required.",
file=sys.stderr,
)
return 2
if os.environ.get(SKIP_ENVIRONMENT_VARIABLE) == "1":
print(
f"{SKIP_ENVIRONMENT_VARIABLE}=1 conflicts with the required gate.",
file=sys.stderr,
)
return 2

try:
suite = unittest.defaultTestLoader.loadTestsFromName(EXACT_TEST_NAME)
return run_exact_suite(suite, stream=sys.stderr)
except SystemExit as error:
print(
"The native Windows Included Files scale gate raised an unexpected "
f"SystemExit({error.code!r}); refusing a successful process exit.",
file=sys.stderr,
)
return 1


if __name__ == "__main__":
raise SystemExit(main())
2 changes: 1 addition & 1 deletion src/version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION = "0.7.52"
VERSION = "0.7.53"


def get_version():
Expand Down
Loading