3 using System.Collections.Generic;
\r
4 using NaGet.Packages;
\r
5 using NaGet.Packages.Install;
\r
7 namespace NaGet.Packages
\r
10 /// パッケージリスト達をひとまとめにして管理する
\r
12 public class PackageListsManager
\r
14 internal PackageList<Package> availablePkgList;
\r
15 internal PackageList<InstalledPackage> installedPkgList;
\r
16 internal PackageList<InstalledPackage> systemInstalledPkgList;
\r
19 /// ファイルリストから読み込まれたパッケージのリスト
\r
21 public PackageList<Package> AvailablePkgList {
\r
22 get { return availablePkgList; }
\r
26 /// 本ソフトウェアを介してインストールされたパッケージのリスト
\r
28 public PackageList<InstalledPackage> InstalledPkgList {
\r
29 get { return installedPkgList; }
\r
33 /// システムから検出されたパッケージのリスト
\r
35 public PackageList<InstalledPackage> SystemInstalledPkgList {
\r
36 get { return systemInstalledPkgList; }
\r
42 private List<InstallationLog> systemInstalledLogList;
\r
45 /// 初期化をする。ファイル群を読み込んで更新がなされる。
\r
47 public PackageListsManager()
\r
57 public void LoadPackageLists()
\r
60 availablePkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(NaGet.Env.PackageListFile);
\r
61 } catch (FileNotFoundException) {
\r
62 availablePkgList = new PackageList<Package>();
\r
66 installedPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.ArchiveInstalledPackageListFile);
\r
67 } catch (FileNotFoundException) {
\r
68 installedPkgList = new PackageList<InstalledPackage>();
\r
72 systemInstalledPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.SystemInstalledPackageListFile);
\r
73 } catch (FileNotFoundException) {
\r
74 systemInstalledPkgList = new PackageList<InstalledPackage>();
\r
78 systemInstalledLogList = new List<InstallationLog>();
\r
80 systemInstalledLogList.AddRange(
\r
81 NaGet.Utils.GetDeserializedObject<InstallationLog[]>(NaGet.Env.SystemInstalledPackageLogFile)
\r
83 } catch (Exception) {
\r
89 /// ファイルリストから読み込まれたパッケージのリスト
\r
92 public void SaveAvailablePackageList()
\r
94 NaGet.Utils.PutSerializeObject(NaGet.Env.PackageListFile, availablePkgList);
\r
97 /// 本ソフトウェアを介してインストールされたパッケージのリスト
\r
100 public void SaveInstalledPackageList()
\r
102 NaGet.Utils.PutSerializeObject(NaGet.Env.ArchiveInstalledPackageListFile, installedPkgList);
\r
105 /// システムから検出されたパッケージのリスト
\r
108 public void SaveSystemInstalledPackageList()
\r
110 NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageListFile, systemInstalledPkgList);
\r
116 public void SaveSystemInstalledLogList()
\r
118 NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageLogFile, systemInstalledLogList);
\r
122 /// 本オブジェクトの保有しているパッケージ情報の全てをファイルに書き出す。
\r
124 public void CommitToFile()
\r
126 SaveAvailablePackageList();
\r
127 SaveInstalledPackageList();
\r
128 SaveSystemInstalledPackageList();
\r
130 SaveSystemInstalledLogList();
\r
135 #region パッケージインストール検知関連
\r
138 /// 本ソフトウェアを介してインストールされたパッケージを検出する。
\r
139 /// 具体的には<see cref="NaGet.Env.ArchiveProgramFiles" />
\r
140 /// で指定されたフォルダの下を見る。
\r
142 public void DetectInstalledPkgs()
\r
144 PackageList<InstalledPackage> pkgList = new PackageList<InstalledPackage>();
\r
145 if (Directory.Exists(NaGet.Env.ArchiveProgramFiles)) {
\r
146 foreach (string path in NaGet.Utils.ExtendWildcardFile(NaGet.Env.ArchiveProgramFiles, Path.Combine("*", ".applistation.package.xml"))) {
\r
147 pkgList.AddPackage(NaGet.Utils.GetDeserializedObject<InstalledPackage>(path));
\r
149 this.installedPkgList = pkgList;
\r
154 /// レジストリから、コンピュータにインストールされたパッケージを検出し、
\r
155 /// インストールトリストに登録(更新)をする。このとき、
\r
156 /// インストールのログを見て可能な限りパッケージ情報を補完する。
\r
158 public void DetectSystemInstalledPkgs()
\r
160 List<InstalledPackage> installedPkgList = new List<InstalledPackage>();
\r
161 installedPkgList.AddRange(RegistriedUninstallers.DetectInstalledPackages(availablePkgList));
\r
163 // インストールのログを見て可能な限りパッケージ情報を補完する。
\r
164 for (int i = 0; i < installedPkgList.Count; i++) {
\r
165 InstalledPackage pkg = installedPkgList[i];
\r
166 int count = installedPkgList.FindAll(PackageList<InstalledPackage>.GetPredicateForPackageName(pkg.Name)).Count;
\r
168 foreach (InstallationLog log in systemInstalledLogList.FindAll(createPackageNamePredicator(pkg))) {
\r
169 // 1. バージョンがアンインストール情報から取得できなかったときは無条件で登録
\r
170 // 2. 同一名パッケージがない場合は無条件で登録
\r
171 // 3. 複数個同一パッケージがインストールされている場合は、バージョン比較して登録。
\r
172 if (string.IsNullOrEmpty(pkg.Version) ||
\r
174 log.Package.Version == pkg.Version) {
\r
176 // 補完したパッケージ情報への差し替え
\r
177 UninstallInformation pkgUninstInfo = pkg.UninstallInfo;
\r
178 NaGet.Utils.FieldCopy((Package) log.Package, ref pkg);
\r
179 pkg.UninstallInfo = pkgUninstInfo;
\r
180 if (pkg.UninstallInfo.InstallDate == null) { // インストール日時の補完
\r
181 pkg.UninstallInfo.InstallDate = log.Date;
\r
188 this.systemInstalledPkgList.Packages = installedPkgList.ToArray();
\r
193 #region パッケージ便利メソッド
\r
196 /// 全て(すなわち、本ソフトウェアを介してインストールされたものと、
\r
197 /// システムにインストールされたもの)のインストールされたパッケージを返す便利メソッド
\r
199 /// <returns>全てのインストールされたパッケージのイテレータ</returns>
\r
200 public IEnumerable<InstalledPackage> GetAllInstalledPackages()
\r
202 return NaGet.Utils.MeargeEnumerable<InstalledPackage>(
\r
203 installedPkgList.GetEnumerator(),
\r
204 systemInstalledPkgList.GetEnumerator()
\r
209 /// 全てのパッケージをイテレータで返す便利メソッド。
\r
211 /// <returns>パッケージのイテレータ</returns>
\r
212 public IEnumerable<Package> GetAllPackages()
\r
214 return NaGet.Utils.MeargeEnumerable<Package>(
\r
215 availablePkgList.GetEnumerator(),
\r
216 (IEnumerator<Package>) GetAllInstalledPackages().GetEnumerator()
\r
225 /// 指定パッケージ名に対応するログを判定するPredicate
\r
227 /// <param name="pkg">判定する指定パッケージ</param>
\r
228 /// <returns>Predicate</returns>
\r
229 private Predicate<InstallationLog> createPackageNamePredicator(Package pkg)
\r
231 return delegate(InstallationLog log) {
\r
232 return log.Package.Name == pkg.Name;
\r
237 /// インストールログにインストール情報を追加する。
\r
238 /// ファイルへの書き込みは行われない。
\r
240 /// <remarks>過去の同一パッケージ名のログは消去される</remarks>
\r
241 /// <param name="inst">書き込むインストール情報</param>
\r
242 public void WriteInstallationLog(Installation inst)
\r
245 systemInstalledLogList.RemoveAll(createPackageNamePredicator(inst.InstalledPackage));
\r
247 InstallationLog newLog = new InstallationLog();
\r
248 newLog.Date = DateTime.Now;
\r
249 newLog.Package = inst.InstalledPackage;
\r
251 systemInstalledLogList.Add(newLog);
\r