OSDN Git Service

AppliStation-GUI,最初の右クリック時に「インストール先のフォルダー」がパッケージ選択せずとも出るようになっていたのを修正
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages / PackageListsManager.cs
index fa60078..2fedc2b 100644 (file)
@@ -1,4 +1,4 @@
-using System;\r
+using System;\r
 using System.IO;\r
 using System.Collections.Generic;\r
 using NaGet.Packages;\r
@@ -6,35 +6,53 @@ using NaGet.Packages.Install;
 \r
 namespace NaGet.Packages\r
 {\r
+       /// <summary>\r
+       /// パッケージリスト達をひとまとめにして管理する\r
+       /// </summary>\r
        public class PackageListsManager\r
        {\r
                internal PackageList<Package> availablePkgList;\r
                internal PackageList<InstalledPackage> installedPkgList;\r
                internal PackageList<InstalledPackage> systemInstalledPkgList;\r
                \r
+               /// <summary>\r
+               /// ファイルリストから読み込まれたパッケージのリスト\r
+               /// </summary>\r
                public PackageList<Package> AvailablePkgList {\r
                        get { return availablePkgList; }\r
                }\r
                \r
+               /// <summary>\r
+               /// 本ソフトウェアを介してインストールされたパッケージのリスト\r
+               /// </summary>\r
                public PackageList<InstalledPackage> InstalledPkgList {\r
                        get { return installedPkgList; }\r
                }\r
                \r
+               /// <summary>\r
+               /// システムから検出されたパッケージのリスト\r
+               /// </summary>\r
                public PackageList<InstalledPackage> SystemInstalledPkgList {\r
                        get { return systemInstalledPkgList; }\r
                }\r
                \r
+               /// <summary>\r
+               /// インストールログ\r
+               /// </summary>\r
                private List<InstallationLog> systemInstalledLogList;\r
                \r
+               /// <summary>\r
+               /// 初期化をする。ファイル群を読み込んで更新がなされる。\r
+               /// </summary>\r
                public PackageListsManager()\r
                {\r
                        LoadPackageLists();\r
                }\r
                \r
-               #region \83t\83@\83C\83\8b\93Ç\82Ý\8f\91\82«\r
+               #region ファイル読み書き\r
                \r
                /// <summary>\r
-               /// \83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\8dX\90V\82·\82é\r
+               /// ファイルを読み込んで更新する\r
                /// </summary>\r
                public void LoadPackageLists()\r
                {\r
@@ -67,23 +85,42 @@ namespace NaGet.Packages
                        }\r
                }\r
                \r
+               /// <summary>\r
+               /// ファイルリストから読み込まれたパッケージのリスト\r
+               /// をファイルに書き込む。\r
+               /// </summary>\r
                public void SaveAvailablePackageList()\r
                {\r
                        NaGet.Utils.PutSerializeObject(NaGet.Env.PackageListFile, availablePkgList);\r
                }\r
+               /// <summary>\r
+               /// 本ソフトウェアを介してインストールされたパッケージのリスト\r
+               /// をファイルに書き込む。\r
+               /// </summary>\r
                public void SaveInstalledPackageList()\r
                {\r
                        NaGet.Utils.PutSerializeObject(NaGet.Env.ArchiveInstalledPackageListFile, installedPkgList);\r
                }\r
+               /// <summary>\r
+               /// システムから検出されたパッケージのリスト\r
+               /// をファイルに書き込む。\r
+               /// </summary>\r
                public void SaveSystemInstalledPackageList()\r
                {\r
                        NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageListFile, systemInstalledPkgList);\r
                }\r
+               /// <summary>\r
+               /// インストールログ\r
+               /// をファイルに書き込む。\r
+               /// </summary>\r
                public void SaveSystemInstalledLogList()\r
                {\r
                        NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageLogFile, systemInstalledLogList);\r
                }\r
                \r
+               /// <summary>\r
+               /// 本オブジェクトの保有しているパッケージ情報の全てをファイルに書き出す。\r
+               /// </summary>\r
                public void CommitToFile()\r
                {\r
                        SaveAvailablePackageList();\r
@@ -95,8 +132,13 @@ namespace NaGet.Packages
                \r
                #endregion\r
                \r
-               #region \83p\83b\83P\81[\83W\83C\83\93\83X\83g\81[\83\8b\8c\9f\92m\8aÖ\98A\r
+               #region パッケージインストール検知関連\r
                \r
+               /// <summary>\r
+               /// 本ソフトウェアを介してインストールされたパッケージを検出する。\r
+               /// 具体的には<see cref="NaGet.Env.ArchiveProgramFiles" />\r
+               /// で指定されたフォルダーの下を見る。\r
+               /// </summary>\r
                public void DetectInstalledPkgs()\r
                {\r
                        PackageList<InstalledPackage> pkgList = new PackageList<InstalledPackage>();\r
@@ -108,71 +150,99 @@ namespace NaGet.Packages
                        }\r
                }\r
                \r
+               /// <summary>\r
+               /// レジストリから、コンピュータにインストールされたパッケージを検出し、\r
+               /// インストールトリストに登録(更新)をする。このとき、\r
+               /// インストールのログを見て可能な限りパッケージ情報を補完する。\r
+               /// </summary>\r
                public void DetectSystemInstalledPkgs()\r
                {\r
-                       PackageList<InstalledPackage> installedPkgList = new PackageList<InstalledPackage>();\r
-                       foreach (InstalledPackage pkg in RegistriedUninstallers.DetectInstalledPackages(availablePkgList)) {\r
-                               InstallationLog log = this.GetLogFor(pkg);\r
-                               if (log != null) {\r
-                                       InstalledPackage pkg2 = new InstalledPackage();\r
-                                       NaGet.Utils.FieldCopy((Package) log.Package, ref pkg2);\r
-                                       pkg2.UninstallInfo = pkg.UninstallInfo;\r
-                                       \r
-                                       installedPkgList.AddPackage(pkg2);\r
-                               } else {\r
-                                       installedPkgList.AddPackage(pkg);\r
+                       List<InstalledPackage> installedPkgList = new List<InstalledPackage>();\r
+                       installedPkgList.AddRange(RegistriedUninstallers.DetectInstalledPackages(availablePkgList));\r
+                       \r
+                       // インストールのログを見て可能な限りパッケージ情報を補完する。\r
+                       for (int i = 0; i < installedPkgList.Count; i++) {\r
+                               InstalledPackage pkg = installedPkgList[i];                             \r
+                               int count = installedPkgList.FindAll(PackageList<InstalledPackage>.GetPredicateForPackageName(pkg.Name)).Count;\r
+\r
+                               foreach (InstallationLog log in systemInstalledLogList.FindAll(createPackageNamePredicator(pkg))) {\r
+                                       // 1. バージョンがアンインストール情報から取得できなかったときは無条件で登録\r
+                                       // 2. 同一名パッケージがない場合は無条件で登録\r
+                                       // 3. 複数個同一パッケージがインストールされている場合は、バージョン比較して登録。\r
+                                       if (string.IsNullOrEmpty(pkg.Version) ||\r
+                                           count < 2 ||\r
+                                           log.Package.Version == pkg.Version) {\r
+                                               \r
+                                               // 補完したパッケージ情報への差し替え\r
+                                               UninstallInformation pkgUninstInfo = pkg.UninstallInfo;\r
+                                               NaGet.Utils.FieldCopy((Package) log.Package, ref pkg);\r
+                                               pkg.UninstallInfo = pkgUninstInfo;\r
+                                               if (pkg.UninstallInfo.InstallDate == null) { // インストール日時の補完\r
+                                                       pkg.UninstallInfo.InstallDate = log.Date;\r
+                                               }\r
+                                               \r
+                                               break;\r
+                                       }\r
                                }\r
                        }\r
-                       this.systemInstalledPkgList = installedPkgList;\r
+                       \r
+                       this.systemInstalledPkgList.SetPackages(installedPkgList);\r
                }\r
                \r
                #endregion\r
                \r
-               #region \83p\83b\83P\81[\83W\95Ö\97\98\83\81\83\\83b\83h\r
+               #region パッケージ便利メソッド\r
                \r
+               /// <summary>\r
+               /// 全て(すなわち、本ソフトウェアを介してインストールされたものと、\r
+               /// システムにインストールされたもの)のインストールされたパッケージを返す便利メソッド\r
+               /// </summary>\r
+               /// <returns>全てのインストールされたパッケージのイテレータ</returns>\r
                public IEnumerable<InstalledPackage> GetAllInstalledPackages()\r
                {\r
-                       foreach (InstalledPackage pkg in installedPkgList.Packages) {\r
-                               yield return pkg;\r
-                       }\r
-                       foreach (InstalledPackage pkg in systemInstalledPkgList.Packages) {\r
-                               yield return pkg;\r
-                       }\r
+                       return NaGet.Utils.MergeEnumerable<InstalledPackage>(\r
+                               installedPkgList.GetEnumerator(),\r
+                               systemInstalledPkgList.GetEnumerator()\r
+                       );\r
                }\r
                \r
                /// <summary>\r
-               /// \91S\82Ä\82Ì\83p\83b\83P\81[\83W\82ð\83C\83e\83\8c\81[\83^\82Å\95Ô\82·\95Ö\97\98\83\81\83\\83b\83h\81B\r
+               /// 全てのパッケージをイテレータで返す便利メソッド。\r
                /// </summary>\r
-               /// <returns>\83p\83b\83P\81[\83W\82Ì\83C\83e\83\8c\81[\83^</returns>\r
+               /// <returns>パッケージのイテレータ</returns>\r
                public IEnumerable<Package> GetAllPackages()\r
                {\r
-                       foreach (Package pkg in availablePkgList.Packages) {\r
-                               yield return pkg;\r
-                       }\r
-                       foreach (Package pkg in GetAllInstalledPackages()) {\r
-                               yield return pkg;\r
-                       }\r
+                       return NaGet.Utils.MergeEnumerable<Package>(\r
+                               availablePkgList.GetEnumerator(),\r
+                               (IEnumerator<Package>) GetAllInstalledPackages().GetEnumerator()\r
+                       );\r
                }\r
                \r
                #endregion\r
                \r
-               #region \83C\83\93\83X\83g\81[\83\8b\83\8d\83O\8aÖ\98A\r
+               #region インストールログ関連\r
                \r
-               private Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
+               /// <summary>\r
+               /// 指定パッケージ名に対応するログを判定するPredicate\r
+               /// </summary>\r
+               /// <param name="pkg">判定する指定パッケージ</param>\r
+               /// <returns>Predicate</returns>\r
+               private static Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
                {\r
                        return delegate(InstallationLog log) {\r
                                return log.Package.Name == pkg.Name;\r
                        };\r
                }\r
                \r
-               public InstallationLog GetLogFor(Package pkg)\r
-               {\r
-                       return systemInstalledLogList.Find(createPackageNamePredicator(pkg));\r
-               }\r
-               \r
+               /// <summary>\r
+               /// インストールログにインストール情報を追加する。\r
+               /// ファイルへの書き込みは行われない。\r
+               /// </summary>\r
+               /// <remarks>過去の同一パッケージ名のログは消去される</remarks>\r
+               /// <param name="inst">書き込むインストール情報</param>\r
                public void WriteInstallationLog(Installation inst)\r
                {\r
-                       // \8fd\95¡\82Í\8dí\8f\9c\r
+                       // 重複は削除\r
                        systemInstalledLogList.RemoveAll(createPackageNamePredicator(inst.InstalledPackage));\r
                        \r
                        InstallationLog newLog = new InstallationLog();\r