145 lines
4.3 KiB
C#
145 lines
4.3 KiB
C#
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
|
|
namespace AlicizaX.PackageManager.Editor
|
|
{
|
|
internal static class UpdateAllPackageHelper
|
|
{
|
|
private static readonly Queue<RepositoryPackageData> PackagesToUpdate = new Queue<RepositoryPackageData>();
|
|
private static FrameworkPackageManagerWindow s_window;
|
|
private static int s_totalCount;
|
|
private static int s_currentIndex;
|
|
|
|
public static void UpdatePackages(FrameworkPackageManagerWindow window)
|
|
{
|
|
if (window == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (PackageOperationRunner.IsBusy)
|
|
{
|
|
EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定");
|
|
return;
|
|
}
|
|
|
|
var updatablePackages = CollectUpdatablePackages(window.RepositoryPackageDatas);
|
|
if (updatablePackages.Count == 0)
|
|
{
|
|
EditorUtility.DisplayDialog("更新包", "当前没有可更新的包。", "确定");
|
|
return;
|
|
}
|
|
|
|
var confirm = EditorUtility.DisplayDialog(
|
|
"更新包提示",
|
|
$"检测到 {updatablePackages.Count} 个包可更新,是否继续?\n更新完成后建议重新打开 Unity。",
|
|
"是",
|
|
"否");
|
|
|
|
if (!confirm)
|
|
{
|
|
return;
|
|
}
|
|
|
|
s_window = window;
|
|
PackagesToUpdate.Clear();
|
|
foreach (var package in updatablePackages)
|
|
{
|
|
PackagesToUpdate.Enqueue(package);
|
|
}
|
|
|
|
s_totalCount = PackagesToUpdate.Count;
|
|
s_currentIndex = 0;
|
|
UpdateNextPackage();
|
|
}
|
|
|
|
public static void UpdatePackage(FrameworkPackageManagerWindow window, RepositoryPackageData package)
|
|
{
|
|
if (window == null || package == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (PackageOperationRunner.IsBusy)
|
|
{
|
|
EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定");
|
|
return;
|
|
}
|
|
|
|
if (package.PackageState != PackageState.Update)
|
|
{
|
|
EditorUtility.DisplayDialog("更新包", "当前包没有检测到远端更新。", "确定");
|
|
return;
|
|
}
|
|
|
|
s_window = window;
|
|
PackagesToUpdate.Clear();
|
|
PackagesToUpdate.Enqueue(package);
|
|
s_totalCount = 1;
|
|
s_currentIndex = 0;
|
|
UpdateNextPackage();
|
|
}
|
|
|
|
private static List<RepositoryPackageData> CollectUpdatablePackages(List<RepositoryPackageData> repositoryPackageDatas)
|
|
{
|
|
var result = new List<RepositoryPackageData>();
|
|
if (repositoryPackageDatas == null)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
foreach (var package in repositoryPackageDatas)
|
|
{
|
|
if (package == null || package.PackageState != PackageState.Update)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(package.cloneUrl))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
result.Add(package);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private static void UpdateNextPackage()
|
|
{
|
|
if (PackagesToUpdate.Count == 0)
|
|
{
|
|
EditorUtility.ClearProgressBar();
|
|
s_window?.Refresh();
|
|
return;
|
|
}
|
|
|
|
s_currentIndex++;
|
|
var package = PackagesToUpdate.Dequeue();
|
|
var canceled = EditorUtility.DisplayCancelableProgressBar(
|
|
"正在更新包",
|
|
$"{s_currentIndex}/{s_totalCount} {package.name}",
|
|
(float)s_currentIndex / s_totalCount);
|
|
|
|
if (canceled)
|
|
{
|
|
PackagesToUpdate.Clear();
|
|
EditorUtility.ClearProgressBar();
|
|
return;
|
|
}
|
|
|
|
PackageManagerCheckTool.UpdatePackage(package, (success, _) =>
|
|
{
|
|
if (!success)
|
|
{
|
|
EditorUtility.ClearProgressBar();
|
|
return;
|
|
}
|
|
|
|
UpdateNextPackage();
|
|
});
|
|
}
|
|
}
|
|
}
|