From bba0b4ab743e3300cb6b67aaa3edb3d1af0760b9 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Thu, 5 Nov 2026 10:13:37 -0800 Subject: [PATCH 1/2] fix: [SDK-5671] add missing InputGuard.cs.meta to core package Unity ignores assets without a .meta in immutable UPM packages, so InputGuard was dropped and the Android/iOS packages failed to compile. Also validate in CI that every package asset ships with a .meta. Co-Authored-By: Claude Opus 5.5 --- .../scripts/validate-unity-distribution.py | 38 +++++++++++++++++++ .../Runtime/InputGuard.cs.meta | 2 + 2 files changed, 40 insertions(+) create mode 100644 com.onesignal.unity.core/Runtime/InputGuard.cs.meta diff --git a/.github/scripts/validate-unity-distribution.py b/.github/scripts/validate-unity-distribution.py index ea116b56..ab7c4ddd 100644 --- a/.github/scripts/validate-unity-distribution.py +++ b/.github/scripts/validate-unity-distribution.py @@ -2,6 +2,7 @@ import json import re +import subprocess import sys from pathlib import Path @@ -10,6 +11,11 @@ DEMO = ROOT / "examples/demo" BOOTSTRAP = ROOT / "examples/demo/Assets/OneSignal" SAMPLE = ROOT / "com.onesignal.unity.core/Samples~" +PACKAGES = ( + "com.onesignal.unity.android", + "com.onesignal.unity.core", + "com.onesignal.unity.ios", +) INVENTORY = BOOTSTRAP / "Editor/Resources/OneSignalFileInventory.asset" EXCLUDED_PREFIXES = ( @@ -64,6 +70,37 @@ def validate_inventory() -> None: ) +def is_unity_hidden(part: str) -> bool: + return part.startswith(".") or part.endswith("~") + + +def validate_package_metas() -> None: + # UPM packages are immutable, so Unity ignores any asset that ships without a .meta. + tracked = set( + subprocess.run( + ["git", "ls-files", "-z", "--", *PACKAGES], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.split("\0") + ) - {""} + + assets = set() + for path in tracked: + if path.endswith(".meta"): + continue + parts = path.split("/") + if any(is_unity_hidden(part) for part in parts[1:]): + continue + assets.add(path) + assets.update("/".join(parts[:i]) for i in range(2, len(parts))) + + missing = sorted(f"{asset}.meta" for asset in assets if f"{asset}.meta" not in tracked) + if missing: + fail(f"package assets are missing .meta files: {', '.join(missing)}") + + def validate_sample() -> None: for filename, expected_guid in REQUIRED_SAMPLE_GUIDS.items(): path = SAMPLE / filename @@ -111,6 +148,7 @@ def main() -> None: if not (BOOTSTRAP / "Documentation").is_dir(): fail("exportable bootstrap documentation is missing") validate_inventory() + validate_package_metas() validate_sample() print("Unity distribution layout is valid.") diff --git a/com.onesignal.unity.core/Runtime/InputGuard.cs.meta b/com.onesignal.unity.core/Runtime/InputGuard.cs.meta new file mode 100644 index 00000000..3a4ebad9 --- /dev/null +++ b/com.onesignal.unity.core/Runtime/InputGuard.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d0c2ff6a1f8ce4971a952d24320ac599 \ No newline at end of file From 4ef5d8caf1e53cf67177ed1425ab21ce523154e7 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Thu, 5 Nov 2026 10:50:17 -0800 Subject: [PATCH 2/2] fix: [SDK-5671] validate packed metas and guids before publish Check the npm pack file list instead of git, require a unique guid in every .meta, and run the validator in the publish job. Co-Authored-By: Claude Opus 5.5 --- .../scripts/validate-unity-distribution.py | 63 ++++++++++++------- .github/workflows/cd.yml | 3 + 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/.github/scripts/validate-unity-distribution.py b/.github/scripts/validate-unity-distribution.py index ab7c4ddd..9391ea67 100644 --- a/.github/scripts/validate-unity-distribution.py +++ b/.github/scripts/validate-unity-distribution.py @@ -74,31 +74,46 @@ def is_unity_hidden(part: str) -> bool: return part.startswith(".") or part.endswith("~") +def packed_files(package: str) -> list[str]: + output = subprocess.run( + ["npm", "pack", "--dry-run", "--json", "--ignore-scripts"], + cwd=ROOT / package, + check=True, + capture_output=True, + text=True, + ).stdout + return [entry["path"] for entry in json.loads(output)[0]["files"]] + + def validate_package_metas() -> None: - # UPM packages are immutable, so Unity ignores any asset that ships without a .meta. - tracked = set( - subprocess.run( - ["git", "ls-files", "-z", "--", *PACKAGES], - cwd=ROOT, - check=True, - capture_output=True, - text=True, - ).stdout.split("\0") - ) - {""} - - assets = set() - for path in tracked: - if path.endswith(".meta"): - continue - parts = path.split("/") - if any(is_unity_hidden(part) for part in parts[1:]): - continue - assets.add(path) - assets.update("/".join(parts[:i]) for i in range(2, len(parts))) - - missing = sorted(f"{asset}.meta" for asset in assets if f"{asset}.meta" not in tracked) - if missing: - fail(f"package assets are missing .meta files: {', '.join(missing)}") + # UPM packages are immutable, so Unity ignores any asset that ships without a valid .meta. + guids: dict[str, str] = {} + for package in PACKAGES: + packed = set(packed_files(package)) + + assets = set() + for path in packed: + if path.endswith(".meta"): + continue + parts = path.split("/") + if any(is_unity_hidden(part) for part in parts): + continue + assets.add(path) + assets.update("/".join(parts[:i]) for i in range(1, len(parts))) + + missing = sorted(f"{package}/{asset}.meta" for asset in assets if f"{asset}.meta" not in packed) + if missing: + fail(f"packed assets are missing .meta files: {', '.join(missing)}") + + for meta in sorted(f"{asset}.meta" for asset in assets): + path = f"{package}/{meta}" + match = re.search(r"^guid:\s*([0-9a-f]{32})\s*$", (ROOT / path).read_text(), re.MULTILINE) + if match is None: + fail(f"{path} has no valid guid") + guid = match.group(1) + if guid in guids: + fail(f"{path} reuses guid {guid} from {guids[guid]}") + guids[guid] = path def validate_sample() -> None: diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 88c8e4be..fd59028d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -53,6 +53,9 @@ jobs: run: | echo "Tag from output: [${{ steps.npm-tag.outputs.tag }}]" + - name: Validate Unity distribution layout + run: python3 .github/scripts/validate-unity-distribution.py + - name: Publish packages run: | publish_pkg() {