135 lines
4.2 KiB
C#
135 lines
4.2 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
using Codice.LogWrapper;
|
|
using Unity.PlasticSCM.Editor.UI;
|
|
|
|
using PackageManager = UnityEditor.PackageManager;
|
|
|
|
namespace Unity.PlasticSCM.Editor
|
|
{
|
|
internal static class PackageInfo
|
|
{
|
|
internal const string NAME = "com.unity.collab-proxy";
|
|
|
|
internal static VersionData Data = VersionData.Default;
|
|
|
|
internal class VersionData
|
|
{
|
|
internal readonly string Version;
|
|
|
|
internal string LatestVersion { get; private set; }
|
|
|
|
internal static VersionData Default = new VersionData("0.0.0", "0.0.0");
|
|
|
|
internal VersionData(string version, string latestVersion)
|
|
{
|
|
Version = version;
|
|
LatestVersion = latestVersion;
|
|
}
|
|
|
|
internal void SetLatestVersion(string latestVersion)
|
|
{
|
|
LatestVersion = latestVersion;
|
|
}
|
|
|
|
internal bool IsLatestVersion()
|
|
{
|
|
if (string.IsNullOrEmpty(LatestVersion) ||
|
|
LatestVersion == Default.LatestVersion)
|
|
return true;
|
|
|
|
return Version == LatestVersion;
|
|
}
|
|
}
|
|
|
|
internal static void Initialize()
|
|
{
|
|
Assembly assembly = Assembly.GetExecutingAssembly();
|
|
|
|
PackageManager.PackageInfo packageInfo = FindPackageInfo(assembly);
|
|
|
|
if (packageInfo == null)
|
|
return;
|
|
|
|
Data = new VersionData(
|
|
packageInfo.version,
|
|
VersionData.Default.LatestVersion);
|
|
|
|
SearchPackageAsync(
|
|
Data,
|
|
PackageManager.Client.Search(packageInfo.name),
|
|
OnSearchPackageCompleted);
|
|
}
|
|
|
|
static PackageManager.PackageInfo FindPackageInfo(Assembly assembly)
|
|
{
|
|
PackageManager.PackageInfo packageInfo =
|
|
PackageManager.PackageInfo.FindForAssembly(assembly);
|
|
|
|
if (packageInfo == null)
|
|
{
|
|
mLog.DebugFormat("No package found for {0} (dev env plugin)", assembly);
|
|
return null;
|
|
}
|
|
|
|
if (packageInfo.name != NAME)
|
|
{
|
|
mLog.ErrorFormat("Package {0} doesn't match with {1}", packageInfo.name, NAME);
|
|
return null;
|
|
}
|
|
|
|
mLog.DebugFormat("Package {0} version: {1}", NAME, Data.Version);
|
|
return packageInfo;
|
|
}
|
|
|
|
static void SearchPackageAsync(
|
|
VersionData versionData,
|
|
PackageManager.Requests.SearchRequest searchRequest,
|
|
Action<VersionData, PackageManager.PackageInfo> onCompleted)
|
|
{
|
|
EditorDispatcher.Dispatch(delegate
|
|
{
|
|
if (!searchRequest.IsCompleted)
|
|
{
|
|
SearchPackageAsync(versionData, searchRequest, onCompleted);
|
|
return;
|
|
}
|
|
|
|
if (searchRequest.Status != PackageManager.StatusCode.Success)
|
|
{
|
|
mLog.ErrorFormat("Search failed: {0}", searchRequest.Error.message);
|
|
return;
|
|
}
|
|
|
|
// As we are requesting the data of a single package,
|
|
// we should only ever get a single result, but the API returns a list
|
|
PackageManager.PackageInfo packageInfo = searchRequest.Result.FirstOrDefault();
|
|
if (packageInfo == null)
|
|
{
|
|
mLog.ErrorFormat("Search returned no results for package {0}", NAME);
|
|
return;
|
|
}
|
|
|
|
if (packageInfo.name != NAME)
|
|
{
|
|
mLog.ErrorFormat("Package {0} doesn't match with {1}", packageInfo.name, NAME);
|
|
return;
|
|
}
|
|
|
|
onCompleted(versionData, packageInfo);
|
|
});
|
|
}
|
|
|
|
static void OnSearchPackageCompleted(
|
|
VersionData versionData,
|
|
PackageManager.PackageInfo packageInfo)
|
|
{
|
|
versionData.SetLatestVersion(packageInfo.versions.latest);
|
|
}
|
|
|
|
static readonly ILog mLog = PlasticApp.GetLogger("PackageInfo");
|
|
}
|
|
}
|