OSDN Git Service

na-get,(JavaやGhostscriptなど)複数個インストールされるソフトに関して、バージョンが不正になるバグの対処。
authorttp <ttp@users.sourceforge.jp>
Sat, 14 Jun 2008 05:26:09 +0000 (05:26 +0000)
committerttp <ttp@users.sourceforge.jp>
Sat, 14 Jun 2008 05:26:09 +0000 (05:26 +0000)
それに伴うリストパッケージ類の改良。

git-svn-id: http://localhost/svn/AppliStation/trunk@923 34ed2c89-c49f-4a4b-abdb-c318350108cf

AppliStation/PackageListViewForm.cs
all-get/Main.cs
na-get-lib/NaGet.Packages.Install/InstallationLog.cs
na-get-lib/NaGet.Packages.Install/RegistriedUninstallers.cs
na-get-lib/NaGet.Packages/PackageList.cs
na-get-lib/NaGet.Packages/PackageListsManager.cs
na-get-lib/NaGet/Env.cs

index 017e58d..037cf86 100644 (file)
@@ -552,7 +552,7 @@ namespace AppliStation
                \r
                private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)\r
                {\r
-                       foreach (InstalledPackage pkg in installedPkgList.Packages) {\r
+                       foreach (InstalledPackage pkg in installedPkgList) {\r
                                Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);\r
                                \r
                                if (avaiablePkgList != null) {\r
index 08b6174..d21168a 100644 (file)
@@ -128,7 +128,7 @@ namespace AllGet
                        \r
                        VersionComparetor verComp = new VersionComparetor();\r
                        \r
-                       foreach (InstalledPackage pkg in pkgListMan.InstalledPkgList.Packages) {\r
+                       foreach (InstalledPackage pkg in pkgListMan.InstalledPkgList) {\r
                                Package avaiablePkg = packageList.GetPackageForName(pkg.Name);\r
                                \r
                                if (avaiablePkg != null) {\r
@@ -141,7 +141,7 @@ namespace AllGet
                                        Console.ResetColor();\r
                                }\r
                        }\r
-                       foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {\r
+                       foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList) {\r
                                Package avaiablePkg = packageList.GetPackageForName(pkg.Name);\r
                                \r
                                if (avaiablePkg != null) {\r
@@ -456,7 +456,7 @@ namespace AllGet
                \r
                public void FooBar()\r
                {\r
-                       foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {\r
+                       foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList) {\r
                                Console.WriteLine("{0} : {1}", pkg.Name, pkg.UninstallInfo.UninstallString);\r
                        }\r
                }\r
index ea967e6..72ac63a 100644 (file)
@@ -2,9 +2,18 @@ using System;
 \r
 namespace NaGet.Packages.Install\r
 {\r
-       public class InstallationLog\r
+       /// <summary>\r
+       /// \83C\83\93\83X\83g\81[\83\8b\83\8d\83O\82Ì\93à\97e\83f\81[\83^\r
+       /// </summary>\r
+       public struct InstallationLog\r
        {\r
+               /// <summary>\r
+               /// \83C\83\93\83X\83g\81[\83\8b\82ð\82µ\82½\93ú\95t\r
+               /// </summary>\r
                public DateTime Date;\r
+               /// <summary>\r
+               /// \83C\83\93\83X\83g\81[\83\8b\82³\82ê\82½\83p\83b\83P\81[\83W\82Ì\8fî\95ñ\r
+               /// </summary>\r
                public Package Package;\r
        }\r
 }\r
index 4a5ba65..ee5e03d 100644 (file)
@@ -105,10 +105,10 @@ namespace NaGet.Packages.Install
                /// <returns>\r
                /// インストール済みのパッケージを返すイテレータ\r
                /// </returns>\r
-               public static IEnumerable<InstalledPackage> DetectInstalledPackages(PackageList<Package> list)\r
+               public static IEnumerable<InstalledPackage> DetectInstalledPackages(PackageList<Package> pkgList)\r
                {\r
                        foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\r
-                               foreach (Package pkg in list.Packages) {\r
+                               foreach (Package pkg in pkgList) {\r
                                        if (pkg.Type != InstallerType.ARCHIVE && pkg.UninstallerKey != null) {\r
                                                Match match = Regex.Match(info.DisplayName, pkg.UninstallerKey);\r
                                                \r
index d4e69d9..ed5e921 100644 (file)
@@ -30,7 +30,7 @@ namespace NaGet.Packages
                }\r
 \r
                /// <summary>\r
-               /// 本リストが格納しているパッケージの配列\r
+               /// 本リストが格納しているパッケージのリスト\r
                /// </summary>\r
                [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
                public TPackage[] Packages\r
@@ -49,6 +49,15 @@ namespace NaGet.Packages
                                }\r
                        }\r
                }\r
+               \r
+               /// <summary>\r
+               /// 本リストが格納しているパッケージのイテレータを返す\r
+               /// </summary>\r
+               /// <returns>パッケージのイテレータ</returns>\r
+               public IEnumerator<TPackage> GetEnumerator()\r
+               {\r
+                       return packageArrayList.GetEnumerator();\r
+               }\r
 \r
                /// <summary>\r
                /// パッケージをリストに追加する\r
@@ -90,7 +99,7 @@ namespace NaGet.Packages
                /// パッケージを検索をする際のPredicateを返す \r
                /// </summary>\r
                /// <param name="key">検索キー</param>\r
-               protected static Predicate<TPackage> GetPredicateForSearch(string key)\r
+               protected internal static Predicate<TPackage> GetPredicateForSearch(string key)\r
                {\r
                        string lowerKey = key.ToLower();\r
                        return delegate(TPackage package) {\r
@@ -103,10 +112,21 @@ namespace NaGet.Packages
                /// <summary>\r
                /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
                /// </summary>\r
+               /// <param name="predicate">検索条件のPredicate</param>\r
+               /// <returns>マッチしたパッケージのイテレータ</returns>\r
+               protected internal IEnumerable<TPackage> Search(Predicate<TPackage> predicate)\r
+               {\r
+                       return packageArrayList.FindAll(predicate);\r
+               }\r
+               \r
+               /// <summary>\r
+               /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
+               /// </summary>\r
                /// <param name="key">検索キー</param>\r
+               /// <returns>マッチしたパッケージのイテレータ</returns>\r
                public IEnumerable<TPackage> Search(string key)\r
                {\r
-                       return packageArrayList.FindAll(GetPredicateForSearch(key));\r
+                       return Search(GetPredicateForSearch(key));\r
                }\r
                \r
                /// <summary>\r
@@ -118,7 +138,7 @@ namespace NaGet.Packages
                /// <returns>\r
                /// Predicate\r
                /// </returns>\r
-               protected static Predicate<TPackage> GetPredicateForPackageName(string name)\r
+               protected internal static Predicate<TPackage> GetPredicateForPackageName(string name)\r
                {\r
                        return delegate(TPackage package) {\r
                                return package.Name == name;\r
@@ -138,9 +158,9 @@ namespace NaGet.Packages
                /// 指定した名前に対応するパッケージを返す\r
                /// </summary>\r
                /// <param name="name">検索にかけるパッケージ名</param>\r
-               public TPackage[] GetPackagesForName(string name)\r
+               public IEnumerable<TPackage> GetPackagesForName(string name)\r
                {\r
-                       return packageArrayList.FindAll(GetPredicateForPackageName(name)).ToArray();\r
+                       return packageArrayList.FindAll(GetPredicateForPackageName(name));\r
                }\r
                \r
                /// <summary>\r
@@ -150,8 +170,7 @@ namespace NaGet.Packages
                /// <param name="version">検索にかけるパッケージのバージョン</param>\r
                public TPackage GetPackageForPackage(string name, string version)\r
                {\r
-                       TPackage[] pkgs = GetPackagesForName(name);\r
-                       foreach (TPackage tpkg in pkgs) {\r
+                       foreach (TPackage tpkg in GetPackagesForName(name)) {\r
                                if (tpkg.Version == version) {\r
                                        return tpkg;\r
                                }\r
index fa60078..b4f5806 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,45 +150,70 @@ 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
+                       this.systemInstalledPkgList.Packages = installedPkgList.ToArray();\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
+                       foreach (InstalledPackage pkg in installedPkgList) {\r
                                yield return pkg;\r
                        }\r
-                       foreach (InstalledPackage pkg in systemInstalledPkgList.Packages) {\r
+                       foreach (InstalledPackage pkg in systemInstalledPkgList) {\r
                                yield return pkg;\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
+                       foreach (Package pkg in availablePkgList) {\r
                                yield return pkg;\r
                        }\r
                        foreach (Package pkg in GetAllInstalledPackages()) {\r
@@ -156,8 +223,13 @@ namespace NaGet.Packages
                \r
                #endregion\r
                \r
-               #region \83C\83\93\83X\83g\81[\83\8b\83\8d\83O\8aÖ\98A\r
+               #region インストールログ関連\r
                \r
+               /// <summary>\r
+               /// 指定パッケージ名に対応するログを判定するPredicate\r
+               /// </summary>\r
+               /// <param name="pkg">判定する指定パッケージ</param>\r
+               /// <returns>Predicate</returns>\r
                private Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
                {\r
                        return delegate(InstallationLog log) {\r
@@ -165,14 +237,15 @@ namespace NaGet.Packages
                        };\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
index 17a98c3..579c9b8 100644 (file)
@@ -22,7 +22,7 @@ namespace NaGet
                public static readonly string ProviderListFile = "provider.list.txt";\r
 \r
                /// <summary>\r
-               /// ã\83\91ã\83\83ã\82±ã\83¼ã\82¸ã\83ªã\82¹ã\83\88ï¼\88ã\82­ã\83£ã\83\83ã\82·ã\83¥ï¼\89ç½®ã\81\8då ´ã\81®ã\83\91ã\82¹\r
+               /// ã\83\95ã\82¡ã\82¤ã\83«ã\83ªã\82¹ã\83\88ã\81\8bã\82\89読ã\81¿è¾¼ã\81¾ã\82\8cã\81\9fã\83\91ã\83\83ã\82±ã\83¼ã\82¸ã\81®ã\83ªã\82¹ã\83\88ã\83\95ã\82¡ã\82¤ã\83«\r
                /// </summary>\r
                public static readonly string PackageListFile = "packages.list.xml";\r
 \r