OSDN Git Service

na-get-lib,exeのインストーラもパッケージリストの<SilentInstallArguments>要素を指定することでサイレントインストールできるようにした。
[applistation/AppliStation.git] / na-get-lib / NaGet.SubCommands / NaGetInstall.cs
index 3d01139..e000ff7 100644 (file)
@@ -63,12 +63,108 @@ namespace NaGet.SubCommands
                        \r
                        TaskSetNames = taskSetNames.ToArray();\r
                }\r
-               \r
+                               \r
                public override void Run()\r
                {\r
-                       currentTaskSetIndex ++;\r
+                       currentTaskSetIndex = 0;\r
                        RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\8aJ\8en");\r
                        \r
+                       {\r
+                               // \83n\83b\83V\83\85\94ñ\93K\8d\87\82È\83C\83\93\83X\83g\81[\83\89\82Ì\95\\r
+                               System.Collections.Generic.List<Installation> invalidInstallers = null;\r
+                               \r
+                               while (invalidInstallers == null || invalidInstallers.Count > 0) {\r
+                                       currentTaskSetIndex = 0;\r
+                                       packageInstallerDownloaded = false;\r
+                                       \r
+                                       runDownloadInstallers();\r
+                                       if (done) return; // \82à\82µrunDownloadInstallers()\93à\82Å\83G\83\89\81[\8fI\97¹\82µ\82Ä\82¢\82½\82È\82ç\8fI\97¹\r
+                                       \r
+                                       packageInstallerDownloaded = true;\r
+                                       \r
+                                       // \83n\83b\83V\83\85\82Ì\89ó\82ê\82Ä\82¢\82é\83C\83\93\83X\83g\81[\83\89\82ð\8eæ\93¾\r
+                                       invalidInstallers = runCheckHashForInstaller();\r
+                                       \r
+                                       // \83n\83b\83V\83\85\82ª\89ó\82ê\82Ä\82¢\82é\82Æ\82«\82Ì\91Î\8dô\r
+                                       if (invalidInstallers.Count > 0) {\r
+                                               string msg = string.Format("{0}\8cÂ\82Ì\83p\83b\83P\81[\83W\82Å\83t\83@\83C\83\8b\82ª\89ó\82ê\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\n\8b­\90§\93I\82É\83C\83\93\83X\83g\81[\83\8b\82ð\91±\8ds\82µ\82Ü\82·\82©?",\r
+                                                                          invalidInstallers.Count);\r
+                                               NaGetTaskQueryResult result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE\r
+                                                                                                    | NaGetTaskQueryResult.RETRY\r
+                                                                                                    | NaGetTaskQueryResult.CANCEL);\r
+                                               \r
+                                               switch (result) {\r
+                                                       case NaGetTaskQueryResult.CONTINUE:\r
+                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83n\83b\83V\83\85\82Ì\94ñ\90®\8d\87\82ð\96³\8e\8b\82µ\82Ä\83C\83\93\83X\83g\81[\83\8b\82ð\8cp\91±");\r
+                                                               invalidInstallers.Clear(); // \83n\83b\83V\83\85\94ñ\93K\8d\87\83p\83b\83P\81[\83W\82ð\8b­\90§\93I\82É\96\95\8fÁ\r
+                                                               break;\r
+                                                       case NaGetTaskQueryResult.RETRY:\r
+                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\83_\83E\83\93\83\8d\81[\83h\8f\88\97\9d\82ð\8dÄ\8e\8e\8ds");\r
+                                                               \r
+                                                               foreach (Installation invalidInst in invalidInstallers) {\r
+                                                                       invalidInst.RemoveDownloadedFile();\r
+                                                               }\r
+                                                               \r
+                                                               break;\r
+                                                       //case NaGetTaskQueryResult.CANCEL:\r
+                                                       default:\r
+                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "\83p\83b\83P\81[\83W\82Ì\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½");\r
+                                                               done = true;\r
+                                                               return;\r
+                                               }\r
+                                       }\r
+                                       currentTaskSetIndex ++;\r
+                               }\r
+                       }\r
+                       \r
+                       foreach (Installation inst in Installations) {\r
+                               string installTaskMsg = inst.ToString();\r
+                               if (inst.Silent && (!inst.SupportsSilentOnly)) {\r
+                                       installTaskMsg += " (\83T\83C\83\8c\83\93\83g\83C\83\93\83X\83g\81[\83\8b)";\r
+                               }\r
+                               \r
+                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, installTaskMsg);\r
+                               \r
+                               try {\r
+                                       \r
+                                       inst.ErrorDataReceived += this.ReceivedErrorData;\r
+                                       inst.OutputDataReceived += this.ReceivedOutputData;\r
+                                       int exitCode = inst.Install();\r
+                                       if (exitCode != 0) {\r
+                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83C\83\93\83X\83g\81[\83\89\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
+                                       }\r
+                                       \r
+                                       pkgListMan.WriteInstallationLog(inst);\r
+                               } catch (Exception e) {\r
+                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+                                       done = true;\r
+                                       return;\r
+                               }\r
+                               currentTaskSetIndex ++;\r
+                               \r
+                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, installTaskMsg);\r
+                               \r
+                               if (cancelCalled) {\r
+                                       RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "\83p\83b\83P\81[\83W\82Ì\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½");\r
+                                       done = true;\r
+                                       return;\r
+                               }\r
+                       }\r
+                       pkgListMan.SaveSystemInstalledLogList(); // \83\8d\83O\82Ì\83R\83~\83b\83g\r
+                       \r
+                       runLocalUpdate();\r
+                       \r
+                       done = true;\r
+                       \r
+                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "\8fI\97¹", 100);\r
+               }\r
+               \r
+               \r
+               /// <summary>\r
+               /// \8f\88\97\9d\93à\97e\82Ì\83_\83E\83\93\83\8d\81[\83h\95\94\95ª\82Ì\83T\83u\83\8b\81[\83`\83\93\r
+               /// </summary>\r
+               private void runDownloadInstallers()\r
+               {\r
                        foreach (Installation inst in Installations) {\r
                                if (! inst.IsInstallablePackage()) {\r
                                        string msg = string.Format("{0}\82Í\83C\83\93\83X\83g\81[\83\8b\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82¹\82ñ", inst.ToString());\r
@@ -110,70 +206,34 @@ namespace NaGet.SubCommands
                                        RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}\82Ì\83C\83\93\83X\83g\81[\83\89\82ð\90³\8fí\82É\83_\83E\83\93\83\8d\81[\83h\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½", inst.ToString()));\r
                                }\r
                        }\r
+               }\r
+               \r
+               /// <summary>\r
+               /// \83_\83E\83\93\83\8d\81[\83h\82µ\82½\83p\83b\83P\81[\83W\82ª\90®\8d\87\82µ\82½\82©\94Û\82©\83n\83b\83V\83\85\82Å\83`\83F\83b\83N\r
+               /// </summary>\r
+               /// <returns>\90®\8d\87\82µ\82È\82©\82Á\82½\83C\83\93\83X\83g\81[\83\89\82Ì\83\8a\83X\83g</returns>\r
+               private System.Collections.Generic.List<Installation> runCheckHashForInstaller()\r
+               {\r
+                       System.Collections.Generic.List<Installation> invalidInstallers = new System.Collections.Generic.List<Installation>();\r
                        \r
-                       packageInstallerDownloaded = true;\r
-                       \r
-                       {\r
-                               bool invalid = false;\r
-                               int i = 0;\r
-                               foreach (Installation inst in Installations) {\r
-                                       float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;\r
-                                       \r
-                                       if (inst.GetRegisteredHashCount() > 0) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString(), percent);\r
-                                               \r
-                                               if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
-                                                       invalid = true;\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\8c\9f\8fØ: "+inst.ToString() + " \94ñ\90®\8d\87", percent);\r
-                                               } else {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString() + " OK", percent);\r
-                                               }\r
-                                       }\r
-                                       i++;\r
-                               }\r
-                               \r
-                               // TODO \83n\83b\83V\83\85\82ª\89ó\82ê\82Ä\82¢\82é\82Æ\82«\82Ì\91Î\8dô\r
-//                             if (invalid && (! AllGet.Util.Confirm("Some packages do not match hash value. Are you really sure to install them [yN]?", false) )) {\r
-//                                     Console.WriteLine("Abort.");\r
-//                                     Environment.Exit(0);\r
-//                             }\r
-                               currentTaskSetIndex ++;\r
-                       }\r
-                       \r
+                       int i = 0;\r
                        foreach (Installation inst in Installations) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, inst.ToString());\r
+                               float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;\r
                                \r
-                               try {\r
-                                       inst.ErrorDataReceived += this.ReceivedErrorData;\r
-                                       inst.OutputDataReceived += this.ReceivedOutputData;\r
-                                       int exitCode = inst.Install();\r
-                                       if (exitCode != 0) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83C\83\93\83X\83g\81[\83\89\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
-                                       }\r
+                               if (inst.GetRegisteredHashCount() > 0) {\r
+                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString(), percent);\r
                                        \r
-                                       pkgListMan.WriteInstallationLog(inst);\r
-                               } catch (Exception e) {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
-                                       done = true;\r
-                                       return;\r
-                               }\r
-                               currentTaskSetIndex ++;\r
-                               \r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, inst.ToString());\r
-                               \r
-                               if (cancelCalled) {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "\83p\83b\83P\81[\83W\82Ì\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½");\r
-                                       done = true;\r
-                                       return;\r
+                                       if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
+                                               invalidInstallers.Add(inst);\r
+                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\8c\9f\8fØ: "+inst.ToString() + " \94ñ\90®\8d\87", percent);\r
+                                       } else {\r
+                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString() + " OK", percent);\r
+                                       }\r
                                }\r
+                               i++;\r
                        }\r
-                       pkgListMan.SaveSystemInstalledLogList(); // \83\8d\83O\82Ì\83R\83~\83b\83g\r
-                       \r
-                       runLocalUpdate();\r
                        \r
-                       done = true;\r
-                       \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "\8fI\97¹", 100);\r
+                       return invalidInstallers;\r
                }\r
                \r
                private void runLocalUpdate()\r