2 using NaGet.Packages.Install;
\r
3 using NaGet.Packages;
\r
6 namespace NaGet.SubCommands
\r
8 public class NaGetInstall : NaGetTaskSet
\r
10 private bool done = false;
\r
12 private int currentTaskSetIndex = -1;
\r
14 private PackageListsManager pkgListMan;
\r
17 /// ダウンロードに使うダウンローダオブジェクト
\r
19 public Downloader Downloader {
\r
21 if (downloader == null) {
\r
22 downloader = new Downloader();
\r
28 private Downloader downloader;
\r
30 private bool packageInstallerDownloaded = false;
\r
32 public override bool Cancelable {
\r
33 get { return ! done; }
\r
39 public Installation[] Installations;
\r
44 /// <param name="pkgs">インストールするパッケージ</param>
\r
45 public NaGetInstall(PackageListsManager pkgListMan, Package[] pkgs)
\r
46 : this(pkgListMan, Installation.ConvertInstallations(pkgs))
\r
53 /// <param name="installations">インストール処理の配列</param>
\r
54 public NaGetInstall(PackageListsManager pkgMan, Installation[] installations)
\r
56 pkgListMan = pkgMan;
\r
58 Installations = installations;
\r
59 initializeMainTaskSetNames();
\r
62 private void initializeMainTaskSetNames()
\r
64 System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();
\r
66 for (int i =0; i < Installations.Length; i++) {
\r
67 taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));
\r
69 taskSetNames.Add("インストーラの検証");
\r
70 for (int i =0; i < Installations.Length; i++) {
\r
71 taskSetNames.Add(string.Format("インストール: {0}", Installations[i].ToString()));
\r
73 taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));
\r
74 taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));
\r
76 TaskSetNames = taskSetNames.ToArray();
\r
79 public override void Run()
\r
81 currentTaskSetIndex = 0;
\r
82 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "インストール処理開始");
\r
86 System.Collections.Generic.List<Installation> invalidInstallers = null;
\r
88 while (invalidInstallers == null || invalidInstallers.Count > 0) {
\r
89 currentTaskSetIndex = 0;
\r
90 packageInstallerDownloaded = false;
\r
92 runDownloadInstallers();
\r
93 if (done) return; // もしrunDownloadInstallers()内でエラー終了していたなら終了
\r
95 packageInstallerDownloaded = true;
\r
97 // ハッシュの壊れているインストーラを取得
\r
98 invalidInstallers = runCheckHashForInstaller();
\r
101 if (invalidInstallers.Count > 0) {
\r
102 string msg = string.Format("{0}個のパッケージでファイルが壊れている可能性があります\n強制的にインストールを続行しますか?",
\r
103 invalidInstallers.Count);
\r
104 NaGetTaskQueryResult result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE
\r
105 | NaGetTaskQueryResult.RETRY
\r
106 | NaGetTaskQueryResult.CANCEL);
\r
109 case NaGetTaskQueryResult.CONTINUE:
\r
110 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ハッシュの非整合を無視してインストールを継続");
\r
111 invalidInstallers.Clear(); // ハッシュ非適合パッケージを強制的に抹消
\r
113 case NaGetTaskQueryResult.RETRY:
\r
114 RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロード処理を再試行");
\r
116 foreach (Installation invalidInst in invalidInstallers) {
\r
117 invalidInst.RemoveDownloadedFile();
\r
121 //case NaGetTaskQueryResult.CANCEL:
\r
123 RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");
\r
128 currentTaskSetIndex ++;
\r
132 foreach (Installation inst in Installations) {
\r
133 string installTaskMsg = inst.ToString();
\r
134 if (inst.Silent && (!inst.SupportsSilentOnly)) {
\r
135 installTaskMsg += " (サイレントインストール)";
\r
138 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, installTaskMsg);
\r
142 inst.ErrorDataReceived += this.ReceivedErrorData;
\r
143 inst.OutputDataReceived += this.ReceivedOutputData;
\r
144 int exitCode = inst.Install();
\r
145 if (exitCode != 0) {
\r
146 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "インストールが正常に終えていない可能性があります。インストーラの終了コード:"+exitCode);
\r
149 pkgListMan.WriteInstallationLog(inst);
\r
150 } catch (Exception e) {
\r
151 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);
\r
155 currentTaskSetIndex ++;
\r
157 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, installTaskMsg);
\r
159 if (cancelCalled) {
\r
160 RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");
\r
165 pkgListMan.SaveSystemInstalledLogList(); // ログのコミット
\r
171 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);
\r
176 /// 処理内容のダウンロード部分のサブルーチン
\r
178 private void runDownloadInstallers()
\r
180 foreach (Installation inst in Installations) {
\r
181 if (! inst.IsInstallablePackage()) {
\r
182 string msg = string.Format("{0}はインストールすることができません", inst.ToString());
\r
184 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg);
\r
189 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, inst.ToString());
\r
191 if (! inst.Downloaded) {
\r
193 inst.Download(Downloader);
\r
194 } catch (NaGetTaskCanceledException) {
\r
195 RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラのダウンロード処理がキャンセルされました");
\r
198 } catch (System.Net.WebException e) {
\r
199 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);
\r
200 if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {
\r
201 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。");
\r
203 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");
\r
207 } catch (Exception e) {
\r
208 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);
\r
213 currentTaskSetIndex ++;
\r
215 if (inst.Downloaded) { // 正常終了
\r
216 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, inst.ToString());
\r
217 } else { // インストールが完了せずに終わった=失敗=エラー
\r
218 RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラを正常にダウンロードできませんでした", inst.ToString()));
\r
224 /// ダウンロードしたパッケージが整合したか否かハッシュでチェック
\r
226 /// <returns>整合しなかったインストーラのリスト</returns>
\r
227 private System.Collections.Generic.List<Installation> runCheckHashForInstaller()
\r
229 System.Collections.Generic.List<Installation> invalidInstallers = new System.Collections.Generic.List<Installation>();
\r
232 foreach (Installation inst in Installations) {
\r
233 float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;
\r
235 if (inst.GetRegisteredHashCount() > 0) {
\r
236 RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString(), percent);
\r
238 if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {
\r
239 invalidInstallers.Add(inst);
\r
240 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);
\r
242 RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString() + " OK", percent);
\r
248 return invalidInstallers;
\r
251 private void runLocalUpdate()
\r
254 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
\r
255 pkgListMan.DetectInstalledPkgs();
\r
256 pkgListMan.SaveInstalledPackageList();
\r
257 currentTaskSetIndex++;
\r
258 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);
\r
260 // システムにインストールされているリストの更新
\r
261 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
\r
262 pkgListMan.DetectSystemInstalledPkgs();
\r
263 pkgListMan.SaveSystemInstalledPackageList();
\r
264 currentTaskSetIndex++;
\r
265 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);
\r
268 public override bool Done {
\r
269 get { return done; }
\r
272 public override int CurrentTaskSetIndex {
\r
273 get { return currentTaskSetIndex; }
\r
276 private bool cancelCalled = false;
\r
278 public override bool Cancel()
\r
280 cancelCalled = true;
\r
281 if (! packageInstallerDownloaded) {
\r
282 return Downloader.Cancel();
\r
283 } else return true;
\r