diff --git a/Assets/Editor/GitPullEditor.cs b/Assets/Editor/GitPullEditor.cs new file mode 100644 index 0000000..8ec00ab --- /dev/null +++ b/Assets/Editor/GitPullEditor.cs @@ -0,0 +1,93 @@ +using UnityEditor; +using UnityEngine; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace Editor +{ + public static class GitPullEditor + { + static bool isRunning = false; + + // 菜单项 + [MenuItem("Tools/Git/拉取最新版本", false, 100)] + public static void PullLatest() + { + if (isRunning) + { + EditorUtility.DisplayDialog("Git 拉取", "正在拉取中,请稍候...", "确定"); + return; + } + + isRunning = true; + var projectRoot = Directory.GetParent(Application.dataPath).FullName; + + var psi = new ProcessStartInfo + { + FileName = "git", + Arguments = "pull", + WorkingDirectory = projectRoot, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8 + }; + + var proc = new Process { StartInfo = psi, EnableRaisingEvents = true }; + var output = new StringBuilder(); + + proc.OutputDataReceived += (s, e) => + { + if (!string.IsNullOrEmpty(e.Data)) + { + output.AppendLine(e.Data); + UnityEngine.Debug.Log("[git] " + e.Data); + } + }; + + proc.ErrorDataReceived += (s, e) => + { + if (!string.IsNullOrEmpty(e.Data)) + { + output.AppendLine(e.Data); + UnityEngine.Debug.LogError("[git] " + e.Data); + } + }; + + try + { + proc.Start(); + proc.BeginOutputReadLine(); + proc.BeginErrorReadLine(); + // 等待完成(超时 10 分钟) + proc.WaitForExit(600000); + isRunning = false; + + if (proc.ExitCode == 0) + { + EditorUtility.DisplayDialog("Git 拉取", "拉取完成。请查看控制台获取详细信息。", "确定"); + } + else + { + EditorUtility.DisplayDialog("Git 拉取失败", $"ExitCode: {proc.ExitCode}\n请查看控制台输出。", "确定"); + } + } + catch (System.Exception ex) + { + isRunning = false; + UnityEngine.Debug.LogException(ex); + EditorUtility.DisplayDialog("Git 拉取异常", ex.Message, "确定"); + } + } + + // 菜单验证,拉取中禁用该菜单项 + [MenuItem("Tools/Git/拉取最新版本", true)] + public static bool ValidatePullLatest() + { + return !isRunning; + } + } +} \ No newline at end of file diff --git a/Assets/Editor/GitPullEditor.cs.meta b/Assets/Editor/GitPullEditor.cs.meta new file mode 100644 index 0000000..2f731e5 --- /dev/null +++ b/Assets/Editor/GitPullEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 10b461d8a5754bfc8596240a17155757 +timeCreated: 1761206120 \ No newline at end of file