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; } } } } }