-using System;\r
+using System;\r
using System.IO;\r
using System.Collections.Generic;\r
using NaGet.Packages;\r
\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
}\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
\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
}\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