From d85eaf2edae90955423cdfde2784ed9e36dd941c Mon Sep 17 00:00:00 2001 From: ttp Date: Sun, 21 Sep 2008 10:06:37 +0000 Subject: [PATCH] =?utf8?q?na-get-lib,r981=E3=81=A7=E5=85=A5=E3=81=A3?= =?utf8?q?=E3=81=9F=E3=83=90=E3=82=B0=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * 依存関係で間違ったソフトに解決される。 * 正規表現化するときにMatchは部分一致ということを忘れていた。 git-svn-id: http://localhost/svn/AppliStation/trunk@982 34ed2c89-c49f-4a4b-abdb-c318350108cf --- .../NaGet.Packages.Install/DependeciesResolver.cs | 23 +++++- na-get-lib/NaGet.Packages/Package.cs | 34 +++++++-- na-get-lib/NaGet.Packages/PackageList.cs | 85 ++++++++++++---------- na-get-lib/NaGet.Packages/PackageListsManager.cs | 12 --- 4 files changed, 93 insertions(+), 61 deletions(-) diff --git a/na-get-lib/NaGet.Packages.Install/DependeciesResolver.cs b/na-get-lib/NaGet.Packages.Install/DependeciesResolver.cs index f9e7ad6..5d1b32c 100644 --- a/na-get-lib/NaGet.Packages.Install/DependeciesResolver.cs +++ b/na-get-lib/NaGet.Packages.Install/DependeciesResolver.cs @@ -44,14 +44,29 @@ namespace NaGet.Packages.Install List reqInsts = new List(); foreach (Entry entry in DeleteDuplicatedEntries(CreateRequiresEntries(insts))) { - if (!pkgListsMan.IsInstalledFor(entry)) { + List instPkgs = NaGet.Utils.MeargeList( + pkgListsMan.installedPkgList.GetPackagesForEntry(entry), + pkgListsMan.systemInstalledPkgList.GetPackagesForEntry(entry) + ); + + if (instPkgs.Count <= 0) { if (Array.Exists(insts, delegate(Installation inst) { - return inst.InstalledPackage.Name == entry.Name; + return entry.Match(inst.InstalledPackage); })) { continue; } else { - Package pkg = pkgListsMan.AvailablePkgList.GetPackageForEntry(entry); - reqInsts.Add(new Installation(pkg)); + VersionComparetor vc = new VersionComparetor(); + Package pkgToBeInstall = null; + + foreach (Package pkg in pkgListsMan.availablePkgList.GetPackagesForEntry(entry)) { + if ((pkgToBeInstall == null) || (vc.Compare(pkgToBeInstall.Version, pkg.Version) > 0)) { + pkgToBeInstall = pkg; + } + } + + if (pkgToBeInstall != null) { + reqInsts.Add(new Installation(pkgToBeInstall)); + } } } } diff --git a/na-get-lib/NaGet.Packages/Package.cs b/na-get-lib/NaGet.Packages/Package.cs index bc5ec42..3cfd8e6 100644 --- a/na-get-lib/NaGet.Packages/Package.cs +++ b/na-get-lib/NaGet.Packages/Package.cs @@ -140,14 +140,6 @@ namespace NaGet.Packages /// public struct Entry { - public Entry(string name, string flags, string version) - { - Name = name; - Flags = flags; - Version = version; - } - - /// /// パッケージ名 /// @@ -163,6 +155,32 @@ namespace NaGet.Packages /// [XmlAttribute] public string Version; + + public Entry(string name, string flags, string version) + { + Name = name; + Flags = flags; + Version = version; + } + public bool Match(Package pkg) + { + System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex( + (System.Text.RegularExpressions.Regex.IsMatch(Name, "^/.*/$"))? + Name.Substring(1, Name.Length-2) : + string.Format("^{0}$", System.Text.RegularExpressions.Regex.Escape(Name)) + , System.Text.RegularExpressions.RegexOptions.Singleline); + + if (regex.IsMatch(pkg.Name)) { + if (string.IsNullOrEmpty(Version)) { + return true; + } else { + // TODO Flagの内容は現在のところ無視 + return pkg.Version == Version; + } + } else { + return false; + } + } } public class Installer diff --git a/na-get-lib/NaGet.Packages/PackageList.cs b/na-get-lib/NaGet.Packages/PackageList.cs index 5aa1aa4..4de4b18 100644 --- a/na-get-lib/NaGet.Packages/PackageList.cs +++ b/na-get-lib/NaGet.Packages/PackageList.cs @@ -95,6 +95,10 @@ namespace NaGet.Packages packageArrayList.Remove(package); } + #region パッケージ検索 + + #region 検索用Predicate + /// /// パッケージを検索をする際のPredicateを返す /// @@ -110,6 +114,38 @@ namespace NaGet.Packages } /// + /// パッケージ名で検索をする際のPredicateを返す + /// + /// + /// パッケージ名 + /// + /// + /// Predicate + /// + protected internal static Predicate GetPredicateForPackageName(string name) + { + return delegate(TPackage package) { + return package.Name == name; + }; + } + + /// + /// エントリで検索をする際のPredicateを返す + /// + /// + /// エントリ + /// + /// + /// Predicate + /// + protected internal static Predicate GetPredicateForEntry(Entry entry) + { + return entry.Match; + } + + #endregion + + /// /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。 /// /// 検索条件のPredicate @@ -130,22 +166,6 @@ namespace NaGet.Packages } /// - /// パッケージ名で検索をする際のPredicateを返す - /// - /// - /// パッケージ名 - /// - /// - /// Predicate - /// - protected internal static Predicate GetPredicateForPackageName(string name) - { - return delegate(TPackage package) { - return package.Name == name; - }; - } - - /// /// 指定した名前に対応するパッケージを返す /// /// 検索にかけるパッケージ名 @@ -176,30 +196,21 @@ namespace NaGet.Packages /// /// パッケージ参照エントリが対応するパッケージを返す /// - /// 現在の実装では、名前でしか存在確認をしていない。 /// 検索にかけるパッケージ参照エントリ public TPackage GetPackageForEntry(Entry entry) { - System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex( - (System.Text.RegularExpressions.Regex.IsMatch(entry.Name, "^/.*/$"))? - entry.Name.Substring(1, entry.Name.Length-2) : - System.Text.RegularExpressions.Regex.Escape(entry.Name) - ); - - return packageArrayList.Find( - (Predicate) delegate(TPackage pkg){ - if (regex.IsMatch(pkg.Name)) { - if (string.IsNullOrEmpty(entry.Version)) { - return true; - } else { - // TODO Flagの内容は現在のところ無視 - return pkg.Version == entry.Version; - } - } else { - return false; - } - } - ); + return packageArrayList.Find(GetPredicateForEntry(entry)); } + + /// + /// パッケージ参照エントリが対応するパッケージをすべて返す + /// + /// 検索にかけるパッケージ参照エントリ + public IEnumerable GetPackagesForEntry(Entry entry) + { + return packageArrayList.FindAll(GetPredicateForEntry(entry)); + } + + #endregion } } diff --git a/na-get-lib/NaGet.Packages/PackageListsManager.cs b/na-get-lib/NaGet.Packages/PackageListsManager.cs index af10c01..d5b1d43 100644 --- a/na-get-lib/NaGet.Packages/PackageListsManager.cs +++ b/na-get-lib/NaGet.Packages/PackageListsManager.cs @@ -217,18 +217,6 @@ namespace NaGet.Packages ); } - /// - /// 与えられたパッケージ参照エントリに対応するパッケージはインストール済みか否かを返す - /// - /// - /// パッケージ参照エントリ - /// 対応するパッケージがインストール済みならばtrue - public bool IsInstalledFor(Entry entry) - { - return (installedPkgList.GetPackageForEntry(entry) != null) || - (systemInstalledPkgList.GetPackageForEntry(entry) != null); - } - #endregion #region インストールログ関連 -- 2.11.0