diff --git a/.github/scripts/godot_ci_cache.py b/.github/scripts/godot_ci_cache.py new file mode 100644 index 0000000..ef77335 --- /dev/null +++ b/.github/scripts/godot_ci_cache.py @@ -0,0 +1,79 @@ +# +# Fixes https://github.com/godotengine/godot/issues/77508 +# original script source: https://gist.github.com/d6e/5ed21c37a8ac294db26532cc6af5c61c +# + +import os +import subprocess +import time +import re +from pathlib import Path + +# Set the path to your Godot project and Godot executable +GODOT_PROJECT_PATH = Path(".") +GODOT_EXECUTABLE = "godot" # or the path to your Godot executable +GODOT_LOG_FILE = Path("artifacts") / "godot_output.log" # Log file to store Godot output + +print("Building godot cache...", flush=True) +start_time = time.time() + +# Step 1: Recursively find all '.import' files and collect the expected imported file paths +expected_imported_files = set() +for import_file in GODOT_PROJECT_PATH.rglob('*.import'): + content = import_file.read_text() + matches = re.findall(r'dest_files=\["(res://\.godot/imported/.+?)"\]', content) + expected_imported_files.update(matches) + +total_imports = len(expected_imported_files) +print(f"Found {total_imports} references to imported files...", flush=True) + +# Step 2: Launch Godot in the background to start the import process +print("Starting Godot to import files...", flush=True) +GODOT_LOG_FILE.parent.mkdir(parents=True, exist_ok=True) +with GODOT_LOG_FILE.open("w") as log_file: + try: + godot_process = subprocess.Popen( + [GODOT_EXECUTABLE, "--path", str(GODOT_PROJECT_PATH), "--editor", "--headless"], + stdout=log_file, + stderr=subprocess.STDOUT + ) + except Exception as e: + print(f"Failed to start Godot: {e}") + exit(1) + +# Step 3: Continually check if the expected imported files exist +imported_folder = GODOT_PROJECT_PATH / ".godot/imported" +while expected_imported_files: + # Wait until the imported directory exists + if not imported_folder.exists(): + print(f"Waiting for the imported directory to be created by Godot...") + time.sleep(1) + continue + + for expected_path in list(expected_imported_files): + imported_file_path = GODOT_PROJECT_PATH / expected_path.replace("res://", "") + if imported_file_path.exists(): + expected_imported_files.remove(expected_path) + imported_count = total_imports - len(expected_imported_files) + print(f"Imported {imported_count} / {total_imports} files...") + time.sleep(1) # Wait for a second before checking again + +elapsed_time = time.time() - start_time +print(f"Imported all files in {elapsed_time:.2f} seconds.", flush=True) + +# Step 4: Once all files have been imported, quit Godot +try: + print("Quitting Godot...", flush=True) + start_time = time.time() + godot_process.terminate() + godot_process.wait(timeout=10) + +except subprocess.TimeoutExpired: + print("Godot did not terminate in a timely manner; killing the process.") + godot_process.kill() +finally: + elapsed_time = time.time() - start_time + print(f"Godot has been closed in {elapsed_time:.2f} seconds.", flush=True) + +print("All files have been imported. Godot has been closed.") + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e8a532..b6ad3f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,11 +17,17 @@ jobs: include: - build: linux godot-bin: 'godot.linuxbsd.editor.x86_64.mono' + godot-template-bins: 'godot.linuxbsd.template_*' + godot-templates-dir: '/home/runner/.local/share/godot/export_templates/4.2.2.stable.mono' - build: macos godot-bin: 'godot.macos.editor.universal' + godot-template-bins: 'godot.macos.template_release.universal' + godot-templates-dir: '/Users/runner/Library/Application Support/Godot/export_templates/4.2.2.stable' # Windows build runs on Ubuntu - build: windows godot-bin: 'godot.linuxbsd.editor.x86_64.mono' + godot-template-bins: 'godot.windows.template_*' + godot-templates-dir: '/home/runner/.local/share/godot/export_templates/4.2.2.stable.mono' steps: - uses: actions/checkout@v3 @@ -41,8 +47,27 @@ jobs: tag: v4.2.2-bitcoin filename: ${{ matrix.godot-bin }} + - name: Download Godot templates w/Bitcoin module + uses: robinraju/release-downloader@v1.11 + with: + repository: LayerTwo-Labs/godot-bitcoin-module + tag: v4.2.2-bitcoin + filename: ${{ matrix.godot-template-bins }} + + # FIXME: remove + - name: show files (linux / windows) + if: ${{ matrix.build == 'linux' || matrix.build == 'windows' }} + run: | + ls + echo 'TEMPLATES' + ls ${{ matrix.godot-templates-dir }} + echo 'VERSION TXT' + cat "${{ matrix.godot-templates-dir }}/version.txt" + echo $GODOT + # FIXME: remove - - name: show files + - name: show files (macos) + if: ${{ matrix.build == 'macos' }} run: | ls #echo 'TEMPLATES' @@ -53,6 +78,55 @@ jobs: #cat '/Users/runner/Library/Application Support/Godot/export_templates/4.2.2.stable/version.txt' echo $GODOT + - name: Replace default templates with custom templates (linux) + if: ${{ matrix.build == 'linux' }} + run: | + rm "${{ matrix.godot-templates-dir }}/linux_debug.x86_64" + mv godot.linuxbsd.template_debug.x86_64.mono "${{ matrix.godot-templates-dir }}/linux_debug.x86_64" + rm "${{ matrix.godot-templates-dir }}/linux_release.x86_64" + mv godot.linuxbsd.template_release.x86_64.mono "${{ matrix.godot-templates-dir }}/linux_release.x86_64" + + - name: Replace default templates with custom templates (macos) + if: ${{ matrix.build == 'macos' }} + run: | + # Temporary directory used to construct the zip file + TMP_ZIP_DIR=$(mktemp -d $TMPDIR) + mkdir -p "${TMP_ZIP_DIR}/macos_template.app/Contents/MacOS" + mv "godot.macos.template_debug.universal" "${TMP_ZIP_DIR}/macos_template.app/Contents/MacOS/godot_macos_debug.universal" + mv "godot.macos.template_release.universal" "${TMP_ZIP_DIR}/macos_template.app/Contents/MacOS/godot_macos_release.universal" + zip --delete "${{ matrix.godot-templates-dir }}/macos.zip" "macos_template.app/Contents/MacOS/godot_macos_debug.universal" + zip --delete "${{ matrix.godot-templates-dir }}/macos.zip" "macos_template.app/Contents/MacOS/godot_macos_release.universal" + pushd "${TMP_ZIP_DIR}" + zip "${{ matrix.godot-templates-dir }}/macos.zip" "macos_template.app/Contents/MacOS/godot_macos_debug.universal" + zip "${{ matrix.godot-templates-dir }}/macos.zip" "macos_template.app/Contents/MacOS/godot_macos_release.universal" + popd + + - name: Replace default templates with custom templates (windows) + if: ${{ matrix.build == 'windows' }} + run: | + rm "${{ matrix.godot-templates-dir }}/windows_debug_x86_64.exe" + rm "${{ matrix.godot-templates-dir }}/windows_debug_x86_64_console.exe" + rm "${{ matrix.godot-templates-dir }}/windows_release_x86_64.exe" + rm "${{ matrix.godot-templates-dir }}/windows_release_x86_64_console.exe" + + # FIXME: remove + - name: show files (linux / windows) + if: ${{ matrix.build == 'linux' || matrix.build == 'windows' }} + run: | + ls + echo 'TEMPLATES' + ls ${{ matrix.godot-templates-dir }} + + # FIXME: remove + - name: show files (macos) + if: ${{ matrix.build == 'macos' }} + run: | + ls + echo 'TEMPLATES' + ls '/Users/runner/Library/Application Support/Godot/export_templates/4.2.2.stable' + echo 'MACOS TEMPLATES' + zipinfo -1 '/Users/runner/Library/Application Support/Godot/export_templates/4.2.2.stable/macos.zip' + - name: Verify Setup run: | chmod +x ${{ matrix.godot-bin }} @@ -85,7 +159,6 @@ jobs: run: | name="${{fromJSON('{"windows": "Windows Desktop", "macos": "macOS", "linux": "Linux/X11"}')[matrix.build] }}" godot --headless --export-debug "$name" --verbose 2>&1 | tee build.log - env: GODOT_MACOS_NOTARIZATION_API_KEY_ID: ${{ secrets.GODOT_MACOS_NOTARIZATION_API_KEY_ID }}