OSDN Git Service

na-get-lib,依存関係解決関数群を微修正
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages.Install / DependeciesResolver.cs
index e41cb91..2df1836 100644 (file)
@@ -13,6 +13,13 @@ namespace NaGet.Packages.Install
                {\r
                }\r
                \r
+               /// <summary>\r
+               /// 依存解決済みInstallation配列を生成する\r
+               /// </summary>\r
+               /// <param name="insts">元のインストールリスト</param>\r
+               /// <param name="pkgListsMan">インストール確認などをおこなうパッケージリストのマネージャ</param>\r
+               /// <param name="resolved">解決済みInstallation配列</param>\r
+               /// <param name="dependencies">依存によって必要とされたInstallation配列。ない場合は空配列</param>\r
                public static void ResolveInstallations(Installation[] insts, PackageListsManager pkgListsMan, out Installation[] resolved, out Installation[] dependencies)\r
                {\r
                        List<Installation> depInsts;\r
@@ -36,23 +43,6 @@ namespace NaGet.Packages.Install
                {\r
                        List<Installation> reqInsts = new List<Installation>();\r
                        \r
-                       foreach (Entry entry in CreateRequiresEntries(insts, pkgListsMan)) {\r
-                               reqInsts.Add(new Installation(pkgListsMan.AvailablePkgList.GetPackageForEntry(entry)));\r
-                       }\r
-                       \r
-                       return reqInsts;\r
-               }\r
-               \r
-               \r
-               /// <summary>\r
-               /// Requires依存による依存パッケージの検索をし、それをパッケージ参照エントリのイテレータで返す。\r
-               /// 返されるイテレータは、インストール済み及び重複のパッケージは取り除かれている。\r
-               /// </summary>\r
-               /// <param name="insts">対象インストールリスト</param>\r
-               /// <param name="pkgListsMan">現在インストールされているか否かの判断に使われるパッケージリスト</param>\r
-               /// <returns>Requires依存による依存</returns>\r
-               public static IEnumerable<Entry> CreateRequiresEntries(Installation[] insts, PackageListsManager pkgListsMan)\r
-               {\r
                        foreach (Entry entry in DeleteDuplicatedEntries(CreateDependencyEntries(insts, "Requires"))) {\r
                                if (!pkgListsMan.IsInstalledFor(entry)) {                       \r
                                        if (Array.Exists(insts, delegate(Installation inst) {\r
@@ -60,10 +50,13 @@ namespace NaGet.Packages.Install
                                                         })) {\r
                                                continue;\r
                                        } else {\r
-                                               yield return entry;\r
+                                               Package pkg = pkgListsMan.AvailablePkgList.GetPackageForEntry(entry);\r
+                                               reqInsts.Add(new Installation(pkg));\r
                                        }\r
                                }\r
                        }\r
+                       \r
+                       return reqInsts;\r
                }\r
                \r
                /// <summary>\r
@@ -74,13 +67,13 @@ namespace NaGet.Packages.Install
                /// <returns>重複しているものを取り除いたエントリのイテレータ</returns>\r
                private static IEnumerable<Entry> DeleteDuplicatedEntries(IEnumerable<Entry> entries)\r
                {\r
-                       List<string> pkgNames = new List<string>();\r
+                       LinkedList<string> pkgNames = new LinkedList<string>();\r
                        \r
                        foreach (Entry entry in entries) {\r
-                               if (pkgNames.IndexOf(entry.Name) < 0) {\r
+                               if (! pkgNames.Contains(entry.Name)) {\r
                                        // 新出ならば返す\r
                                        yield return entry;\r
-                                       pkgNames.Add(entry.Name);\r
+                                       pkgNames.AddFirst(entry.Name);\r
                                }\r
                        }\r
                }\r