2 using System.Collections.Generic;
10 internal class Package : IEquatable<Package>
12 static public bool ShouldProposeLatestVersions
25 public static bool AddRemoveOperationInProgress
27 get {
return addRemoveOperationInstance !=
null && !addRemoveOperationInstance.IsCompleted; }
30 internal const string packageManagerUIName =
"com.unity.package-manager-ui";
31 private readonly
string packageName;
32 private IEnumerable<PackageInfo> source;
34 internal Package(
string packageName, IEnumerable<PackageInfo> infos)
36 if (
string.IsNullOrEmpty(packageName))
37 throw new ArgumentException(
"Cannot be empty or null",
"packageName");
40 throw new ArgumentException(
"Cannot be empty",
"infos");
42 this.packageName = packageName;
46 internal void UpdateSource(IEnumerable<PackageInfo> source)
49 #if UNITY_2018_3_OR_NEWER 50 if (IsPackageManagerUI)
51 this.source = this.source.Where(p => p !=
null && p.Version.Major >= 2);
55 public PackageInfo Current {
get {
return Versions.FirstOrDefault(package => package.IsCurrent); } }
63 if (ShouldProposeLatestVersions)
67 var current = Current;
68 if (current !=
null && current.IsVersionLocked)
72 var verified = Verified;
73 var latestRelease = LatestRelease;
74 var latestPreview = Versions.LastOrDefault(package => package.IsPreview);
75 var candidates =
new List<PackageInfo>
80 }.Where(package => package !=
null && (current ==
null || current == package || current.Version < package.Version)).ToList();
82 if (candidates.Contains(verified))
84 if ((current ==
null || !current.IsVerified ) && candidates.Contains(latestRelease))
86 if ((current ==
null || current.IsPreview) && candidates.Contains(latestPreview))
90 return current ?? Latest;
102 var versions = Versions.Where(package => package.Version.Major == Current.Version.Major && package.Version.Minor == Current.Version.Minor);
104 return versions.LastOrDefault();
109 internal PackageInfo Latest {
get {
return Versions.FirstOrDefault(package => package.IsLatest) ?? Versions.LastOrDefault(); } }
112 internal PackageInfo VersionToDisplay {
get {
return Current ?? LatestUpdate; } }
115 internal IEnumerable<PackageInfo> Versions {
get {
return source.OrderBy(package => package.Version); } }
118 internal IEnumerable<PackageInfo> ReleaseVersions
120 get {
return Versions.Where(package => !package.IsPreRelease); }
123 internal PackageInfo LatestRelease {
get {
return ReleaseVersions.LastOrDefault();}}
124 internal PackageInfo Verified {
get {
return Versions.FirstOrDefault(package => package.IsVerified);}}
126 internal bool IsAfterCurrentVersion(
PackageInfo packageInfo) {
return Current ==
null || (packageInfo !=
null && packageInfo.Version > Current.Version); }
128 internal bool IsBuiltIn {
get {
return Versions.Any() && Versions.First().IsBuiltIn; }}
130 public string Name {
get {
return packageName; } }
132 public bool IsPackageManagerUI
134 get {
return Name == packageManagerUIName; }
137 public bool Equals(
Package other)
142 return packageName == other.packageName;
145 public override int GetHashCode()
147 return packageName.GetHashCode();
153 private Action OnAddOperationFinalizedEvent;
157 if (packageInfo == Current || AddRemoveOperationInProgress)
160 var operation = OperationFactory.Instance.CreateAddOperation();
161 addRemoveOperationInstance = operation;
162 OnAddOperationFinalizedEvent = () =>
164 AddSignal.Operation =
null;
165 operation.OnOperationFinalized -= OnAddOperationFinalizedEvent;
169 operation.OnOperationFinalized += OnAddOperationFinalizedEvent;
171 AddSignal.SetOperation(operation);
172 operation.AddPackageAsync(packageInfo);
175 internal void Update()
180 internal static void AddFromLocalDisk(
string path)
182 if (AddRemoveOperationInProgress)
186 if (
null == packageJson)
188 Debug.LogError(
string.Format(
"Invalid package path: cannot find \"{0}\".", path));
192 var operation = OperationFactory.Instance.CreateAddOperation();
193 addRemoveOperationInstance = operation;
194 operation.AddPackageAsync(packageJson.PackageInfo);
200 private Action OnRemoveOperationFinalizedEvent;
204 if (Current ==
null || AddRemoveOperationInProgress)
207 var operation = OperationFactory.Instance.CreateRemoveOperation();
208 addRemoveOperationInstance = operation;
209 OnRemoveOperationFinalizedEvent = () =>
211 RemoveSignal.Operation =
null;
212 operation.OnOperationFinalized -= OnRemoveOperationFinalizedEvent;
216 operation.OnOperationFinalized += OnRemoveOperationFinalizedEvent;
217 RemoveSignal.SetOperation(operation);
219 operation.RemovePackageAsync(Current);