From a406078aab09b3c7a9ad9b886e340e633251c16e Mon Sep 17 00:00:00 2001 From: ttp Date: Mon, 13 Jun 2011 00:06:43 +0900 Subject: [PATCH] =?utf8?q?AppliStation-All,=E3=82=A4=E3=83=B3=E3=82=B9?= =?utf8?q?=E3=83=88=E3=83=BC=E3=83=AB=E5=87=A6=E7=90=86=E3=82=92=E6=96=B0?= =?utf8?q?=E6=96=B9=E5=BC=8F=EF=BC=88NaGetInstall2=EF=BC=89=E3=81=AB?= =?utf8?q?=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- AppliStation/PackageListViewForm.cs | 2 +- all-get/Main.cs | 59 +------- na-get-lib/NaGet.SubCommands/NaGetInstall2.cs | 202 ++++++++++++++++++++++++++ na-get-lib/na-get-lib.csproj | 1 + 4 files changed, 208 insertions(+), 56 deletions(-) create mode 100644 na-get-lib/NaGet.SubCommands/NaGetInstall2.cs diff --git a/AppliStation/PackageListViewForm.cs b/AppliStation/PackageListViewForm.cs index ba4e5c5..a66d9a6 100644 --- a/AppliStation/PackageListViewForm.cs +++ b/AppliStation/PackageListViewForm.cs @@ -416,7 +416,7 @@ namespace AppliStation { AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer(); prog.Shown += delegate(object sender2, EventArgs e2) { - NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts); + NaGet.SubCommands.NaGetInstall2 tasks = new NaGet.SubCommands.NaGetInstall2(pkgListsMan, insts); prog.SetTaskSet(tasks); prog.Refresh(); prog.StartTaskSet(); diff --git a/all-get/Main.cs b/all-get/Main.cs index d34737a..d69d548 100644 --- a/all-get/Main.cs +++ b/all-get/Main.cs @@ -311,13 +311,6 @@ namespace AllGet installations = new Installation[downloadList.Count]; for (int i = 0; i < installations.Length; i++) { installations[i] = new Installation(downloadList[i]); - - installations[i].Silent = silent; // サイレントインストールのフラグの設定 - - if (! installations[i].IsInstallablePackage()) { - Console.WriteLine("E: Can not install package {0} to your PC.", installations[i].ToString()); - Environment.Exit(1); - } } } @@ -335,54 +328,10 @@ namespace AllGet Environment.Exit(0); } - NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListMan, installations); - tasks.TaskQueryRaised += delegate(object sender, NaGetTaskQueryArgs e) { - char result = '\u0000'; - if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) { - result = AllGet.Util.Query(e.Message + " [y/R/n]?", "yrn", 'r'); - } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) { - result = AllGet.Util.Query(e.Message + " [R/n]?", "rn", 'r'); - } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) { - result = AllGet.Util.Query(e.Message + " [Y]?", "y", 'y'); - } else { - result = AllGet.Util.Query(e.Message + " [Y/n]?", "yn", 'y'); - } - - switch (result) { - case 'y': - return NaGetTaskQueryResult.CONTINUE; - case 'n': - return NaGetTaskQueryResult.CANCEL; - case 'r': - return NaGetTaskQueryResult.RETRY; - default: - return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY; - } - }; - tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { - switch (e.Type) { -// case NaGetTaskSetEventType.COMPLETED_TASKSET -// break; - case TaskEventType.COMPLETED: - Console.WriteLine("Done."); - break; - case TaskEventType.STARTED_SUBTASK: - Console.Write(" " + e.TaskMessage); - break; - case TaskEventType.COMPLETED_SUBTASK: - Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent); - break; - case TaskEventType.INFO: - Console.WriteLine(" " + e.TaskMessage); - break; - case TaskEventType.ERROR: - case TaskEventType.WARNING: - Console.WriteLine(" [Error] " + e.TaskMessage); - break; - } - }; - DownloadListener dl = new DownloadListener(); - tasks.Downloader.DownloadEventRaised += dl.OnDownload; + NaGet.SubCommands.NaGetInstall2 tasks = new NaGet.SubCommands.NaGetInstall2(pkgListMan, installations); + tasks.TaskEventRaised += TaskSetEventHandlers.OnTaskSetEvent; + tasks.SubTaskEventRaised += TaskSetEventHandlers.OnDownloadSubTaskEvent; + tasks.TaskQueryRaised += TaskSetEventHandlers.OnTaskQueryEvent; tasks.Run(); } diff --git a/na-get-lib/NaGet.SubCommands/NaGetInstall2.cs b/na-get-lib/NaGet.SubCommands/NaGetInstall2.cs new file mode 100644 index 0000000..7cf9cbe --- /dev/null +++ b/na-get-lib/NaGet.SubCommands/NaGetInstall2.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using NaGet.Packages; +using NaGet.Packages.Install; +using NaGet.SubCommands; +using NaGet.SubCommands.SubTask; +using NaGet.Tasks; +using NaGet.InteropServices; + +namespace NaGet.SubCommands +{ + /// + /// インストール処理 + /// + public class NaGetInstall2 : NaGetTaskSet2 + { + private IList installations; + + private DownloadScannerService scanner; + + private PackageListsManager pkgListMan; + + /// + /// コンストラクタ + /// + /// インストールするパッケージ + public NaGetInstall2(PackageListsManager pkgListMan, Package[] pkgs) + : this(pkgListMan, Installation.ConvertInstallations(pkgs)) + { + } + + /// + /// コンストラクタ + /// + /// インストール処理の配列 + public NaGetInstall2(PackageListsManager pkgMan, IList insts) + { + pkgListMan = pkgMan; + installations = insts; + + scanner = new DownloadScannerService(); + scanner.Init(); + + initializeSubTasks(); + } + + private void initializeSubTasks() + { + // taskセットの初期化 + initSubTask(); + foreach (Installation inst in installations) { + VirusScanSubTask scanSTask = new VirusScanSubTask(scanner, inst.InstallerFile, inst.InstallerURL); + + if (! inst.Downloaded) { + DownloadSubTask dlSTask = new DownloadSubTask(inst.InstallerURL, inst.InstallerFile); + + dlSTask.TaskEventRaised += delegate(object sender, TaskEventArgs e) { + if (e.Type == TaskEventType.COMPLETED) { + scanSTask.TargetFilePath = inst.InstallerFile; + } + }; + + registSubTask(string.Format("ダウンロード: {0}", inst), + dlSTask); + } + registSubTask(string.Format("ウイルススキャン: {0}", inst), + scanSTask); + } + registSubTask("インストーラーの検証", + new VerifyInstallerFileSubTask(installations)); + foreach (Installation inst in installations) { + bool isSilentInstall = (inst.Silent && inst.IsSupportsSilent); + string msg = string.Format("インストール: {0}{1}", + inst.ToString(), + (isSilentInstall)? " (サイレントインストール)" : string.Empty); + registSubTask(msg, + new FunctionalSubTask(runInstall, inst)); + } + registSubTask("インストール済みのソフトリスト更新", + new LocalUpdateSubTask(pkgListMan)); + } + + public override void Run() + { + NotifyStarted(); + RaiseTaskSetEvent(TaskEventType.STARTED, string.Empty); + + try { + while (hasMoreSubTask) { + bool canGoToNextSubTask = true; + + RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, currentSubTaskName); + currentSubTask.Run(); + RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, currentSubTaskName); + + if (runCheckVerify() == false) { + canGoToNextSubTask = false; + initializeSubTasks(); + NotifyGoToSubTask(0); // 最初からやり直し。 + } + if (cancelCalled) { + throw new TaskCanceledException("cancel is called"); + } + + if (canGoToNextSubTask) { + NotifyGoToNextSubTask(); + } + } + } catch (TaskCanceledException) { + cancelCalled = true; + } catch (Exception e) { + RaiseTaskSetEvent(TaskEventType.ERROR, e.Message); + } + + if (cancelCalled) { + NotifyCancelled(); + RaiseTaskSetEvent(TaskEventType.CANCELED, "キャンセルされました"); + } else { + NotifyCompleted(); + RaiseTaskSetEvent(TaskEventType.COMPLETED, string.Empty); + } + } + + private bool runCheckVerify() + { + bool ret = true; + + if (currentSubTask is VerifyInstallerFileSubTask) { + VerifyInstallerFileSubTask verifySTask = currentSubTask as VerifyInstallerFileSubTask; + if (verifySTask.InvalidInstallers != null && verifySTask.InvalidInstallers.Count > 0) { + System.Text.StringBuilder invalidInstallerNames = new System.Text.StringBuilder(); + foreach (Installation invalidInst in verifySTask.InvalidInstallers) { + invalidInstallerNames.AppendFormat(" - {0}\n", invalidInst.ToString()); + } + + string msg = string.Format("以下の{0}個のパッケージでファイルが壊れている可能性があります。\n{1}\n強制的にインストールを続行しますか?", + verifySTask.InvalidInstallers.Count, invalidInstallerNames.ToString()); + NaGetTaskQueryResult result = NaGetTaskQueryResult.CANCEL; + + if (!cancelCalled) { + result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE + | NaGetTaskQueryResult.RETRY + | NaGetTaskQueryResult.CANCEL); + } + + switch (result) { + case NaGetTaskQueryResult.CONTINUE: + RaiseTaskSetEvent(TaskEventType.WARNING, "ハッシュの非整合を無視してインストールを継続"); + ret = true; + break; + case NaGetTaskQueryResult.RETRY: + RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行"); + + foreach (Installation invalidInst in verifySTask.InvalidInstallers) { + invalidInst.RemoveDownloadedFile(); + } + ret = false; + break; + case NaGetTaskQueryResult.CANCEL: + case NaGetTaskQueryResult.CANCELED_AUTOMATICALLY: + default: + ret = false; + throw new TaskCanceledException("処理の継続のキャンセルが選択されました"); + } + } + } + + return ret; + } + + private void runInstall(object uninstObj) + { + Installation inst = (Installation) uninstObj; + + if (! inst.IsInstallablePackage()) { + string msg = string.Format("{0}はインストールすることができません", inst.ToString()); + throw new ApplicationException(msg); + } + + inst.ErrorDataReceived += this.ReceivedErrorData; + inst.OutputDataReceived += this.ReceivedOutputData; + int exitCode = inst.Install(); + if (exitCode != 0) { + RaiseTaskSetEvent(TaskEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode); + } + + pkgListMan.WriteInstallationLog(inst); + } + + public override bool Cancelable { + get { + return !cancelCalled && Running && isDuringDownloading; + } + } + + private bool isDuringDownloading { + get { + return Running && (currentSubTask is DownloadSubTask); + } + } + } +} diff --git a/na-get-lib/na-get-lib.csproj b/na-get-lib/na-get-lib.csproj index c8c7cbe..572fc26 100644 --- a/na-get-lib/na-get-lib.csproj +++ b/na-get-lib/na-get-lib.csproj @@ -77,6 +77,7 @@ + -- 2.11.0