using System;
using System.Collections.Generic;
using System.Reflection;
using NaGet.Packages;
namespace NaGet.Packages.Install
{
///
/// 更新ソフトを探す
///
public sealed class UpgradeFinder
{
private UpgradeFinder()
{
}
private static Package getUpgradePkg(Package pkg, PackageList pkgList, PackageList instPkgList, string[] exclude, IComparer verComp)
{
Package avaiablePkg = pkgList.GetPackageForName(pkg.Name);
bool canUpgrade = false;
if (avaiablePkg != null) {
if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&
instPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {
canUpgrade = true;
if (Array.IndexOf(exclude, pkg.Name) >= 0) {
canUpgrade = false;
}
}
}
return (canUpgrade)? avaiablePkg : null;
}
public static IEnumerable GetUpgradePackages(PackageListsManager pkgListMan)
{
PackageList packageList = pkgListMan.AvailablePkgList;
string[] exclude = NaGet.Env.ExcludeUpdatePackageNames ?? new string[0];
VersionComparetor verComp = new VersionComparetor();
foreach (InstalledPackage pkg in pkgListMan.InstalledPkgList) {
Package availablePkg = getUpgradePkg(pkg, packageList, pkgListMan.InstalledPkgList, exclude, verComp);
if (availablePkg != null) { // if it has an upgrade, yield
yield return availablePkg;
}
}
foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList) {
Package availablePkg = getUpgradePkg(pkg, packageList, pkgListMan.SystemInstalledPkgList, exclude, verComp);
if (availablePkg != null) { // if it has an upgrade, yield
yield return availablePkg;
}
}
}
}
}