using UnityEditor; using UnityEngine; using System.IO; using System.Linq; namespace TPromise.Utilities { public class HyperSDKSyncTool : EditorWindow { private static readonly string sourcePath = "Assets/TPromise"; // Resolve to external "upm/com.metaversemagna.tpromise" folder at the project root level private static readonly string destinationPath = Path.Combine( Directory.GetParent(Application.dataPath).Parent.FullName, // Go up to COM.METAVERSEMAGNA.TPROMISE "upm/com.metaversemagna.tpromise" ); private static bool changesDetected = false; // Main menu item that runs the sync [MenuItem("HyperSDK/Sync to Hyper UPM %h", true)] private static bool ValidateSyncMenu() { changesDetected = !DirectoriesAreEqual(sourcePath, destinationPath); return changesDetected; } [MenuItem("HyperSDK/Sync to Hyper UPM %h", false)] public static void SyncToUPM() { if (!Directory.Exists(sourcePath)) { Debug.LogError("[HyperSDK Sync] Source path not found: " + sourcePath); return; } if (Directory.Exists(destinationPath)) { Debug.Log("[HyperSDK Sync] Cleaning existing UPM folder..."); Directory.Delete(destinationPath, true); } Debug.Log($"[HyperSDK Sync] Copying from: {sourcePath} to: {destinationPath}"); CopyDirectory(sourcePath, destinationPath); AssetDatabase.Refresh(); Debug.Log("[HyperSDK Sync] UPM sync complete."); } [InitializeOnLoadMethod] private static void SetupWatcher() { EditorApplication.update += EditorUpdate; } private static void EditorUpdate() { Menu.SetChecked("HyperSDK/Sync to Hyper UPM %h", !DirectoriesAreEqual(sourcePath, destinationPath)); } private static void CopyDirectory(string sourceDir, string targetDir) { Directory.CreateDirectory(targetDir); foreach (var file in Directory.GetFiles(sourceDir)) { var fileName = Path.GetFileName(file); var targetFilePath = Path.Combine(targetDir, fileName); File.Copy(file, targetFilePath); } foreach (var directory in Directory.GetDirectories(sourceDir)) { var dirName = Path.GetFileName(directory); var targetSubDir = Path.Combine(targetDir, dirName); CopyDirectory(directory, targetSubDir); } } private static bool DirectoriesAreEqual(string dir1, string dir2) { if (!Directory.Exists(dir1) || !Directory.Exists(dir2)) return false; var files1 = Directory.GetFiles(dir1, "*", SearchOption.AllDirectories) .Select(f => f.Substring(dir1.Length).TrimStart(Path.DirectorySeparatorChar)).OrderBy(f => f).ToArray(); var files2 = Directory.GetFiles(dir2, "*", SearchOption.AllDirectories) .Select(f => f.Substring(dir2.Length).TrimStart(Path.DirectorySeparatorChar)).OrderBy(f => f).ToArray(); if (files1.Length != files2.Length) return false; for (int i = 0; i < files1.Length; i++) { if (files1[i] != files2[i]) return false; var file1 = Path.Combine(dir1, files1[i]); var file2 = Path.Combine(dir2, files2[i]); if (!File.ReadAllBytes(file1).SequenceEqual(File.ReadAllBytes(file2))) return false; } return true; } } }