OSDN Git Service

na-get-lib,パッケージコレクションのパッケージが既にインストール済みの場合には処理しない処理が正常動作していなかった不具合を修正
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages.Install / Uninstallation.cs
index 997ffb4..cccf075 100644 (file)
@@ -66,9 +66,9 @@ namespace NaGet.Packages.Install
                }\r
                \r
                /// <summary>\r
-               /// アンインストーラ等を起動してアンインストール作業を行う\r
+               /// アンインストーラ等を起動してアンインストール作業を行う\r
                /// </summary>\r
-               /// <returns>アンインストーラの終了コード</returns>\r
+               /// <returns>ã\82¢ã\83³ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81®çµ\82äº\86ã\82³ã\83¼ã\83\89</returns>\r
                public int Uninstall()\r
                {\r
                        if (! Installed) {\r
@@ -81,14 +81,32 @@ namespace NaGet.Packages.Install
                                throw new ApplicationException(string.Format("Could not found {0}install script", Silent? "silent " : ""));\r
                        }\r
                        \r
-                       if (UninstalledPackage.UninstallInfo.WindowsInstaller &&\r
+                       if (UninstalledPackage.Type == InstallerType.ARCHIVE\r
+                          || UninstalledPackage.Type == InstallerType.ITSELF) {\r
+                               \r
+                                       string argument = string.Format("-x \"{0}\"", UninstalledPackage.Name);\r
+                                       using (Process hProcess = createExtractArchiveProcess(argument,\r
+                                                                              this.OutputDataReceived,\r
+                                                                              this.ErrorDataReceived)) {\r
+                                               \r
+                                               if (NaGet.Env.InstallProcessOnBackground) {\r
+                                                       try {\r
+                                                               hProcess.PriorityClass = ProcessPriorityClass.Idle;\r
+                                                       } catch (Exception) {}\r
+                                               }\r
+                                               \r
+                                               hProcess.WaitForExit();\r
+                                               \r
+                                               exitValue = hProcess.ExitCode;\r
+                                       }\r
+                       } else if (UninstalledPackage.UninstallInfo.WindowsInstaller &&\r
                            Regex.Match(uninstallString.Substring("MsiExec.exe /I".Length),\r
                                        @"^\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}$").Success) {\r
                                string guid = uninstallString.Substring("MsiExec.exe /I".Length);\r
                                using (Process hProcess = NaGet.Utils.ProcessStartWithOutputCapture(\r
                                        new ProcessStartInfo("msiexec", string.Format("/X{0}", guid)),\r
-                                       NaGet.Utils.ConvertToDataReceivedEventHandler(OutputDataReceived),\r
-                                       NaGet.Utils.ConvertToDataReceivedEventHandler(ErrorDataReceived)) ) {\r
+                                       this.OutputDataReceived,\r
+                                       this.ErrorDataReceived) ) {\r
                                        \r
                                        if (NaGet.Env.InstallProcessOnBackground) {\r
                                                try {\r
@@ -104,8 +122,8 @@ namespace NaGet.Packages.Install
                                // 単独のファイルの場合\r
                                using (Process hProcess = NaGet.Utils.ProcessStartWithOutputCapture(\r
                                        new ProcessStartInfo(uninstallString),\r
-                                       NaGet.Utils.ConvertToDataReceivedEventHandler(OutputDataReceived),\r
-                                       NaGet.Utils.ConvertToDataReceivedEventHandler(ErrorDataReceived)) ) {\r
+                                       this.OutputDataReceived,\r
+                                       this.ErrorDataReceived) ) {\r
                                        \r
                                        if (NaGet.Env.InstallProcessOnBackground) {\r
                                                try {\r
@@ -138,6 +156,34 @@ namespace NaGet.Packages.Install
                        return exitValue;\r
                }\r
                \r
+               /// <summary>\r
+               /// アーカイブファイルのアンインストールを行う\r
+               /// </summary>\r
+               /// <param name="archiveInstArgs">"archive-inst.exe"への引数</param>\r
+               /// <param name="outputReceived">標準出力用リスナ(null可)</param>\r
+               /// <param name="errorReceived">エラー出力用リスナ(null可)</param>\r
+               /// <returns>実行プロセス</returns>\r
+               private static Process createExtractArchiveProcess(string archiveInstArgs,\r
+                                                 EventHandler<NaGet.Utils.AnyDataEventArgs<string>> outputReceived,\r
+                                                 EventHandler<NaGet.Utils.AnyDataEventArgs<string>> errorReceived)\r
+               {\r
+                       string archiveInstExe = Path.GetFullPath("archive-inst.exe");\r
+                       if (! File.Exists(archiveInstExe)) {\r
+                               string errMsg = string.Format("\"{0}\" does not found!");\r
+                               throw new ApplicationException(errMsg,\r
+                                                              new FileNotFoundException(errMsg, archiveInstExe));\r
+                       }\r
+                       \r
+                       \r
+                       \r
+                       ProcessStartInfo procInfo = new ProcessStartInfo(archiveInstExe, archiveInstArgs);\r
+                       procInfo.UseShellExecute = false;\r
+                       procInfo.CreateNoWindow = true;\r
+                       procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
+                       \r
+                       return NaGet.Utils.ProcessStartWithOutputCapture(procInfo, outputReceived, errorReceived);\r
+               }\r
+               \r
                public override string ToString()\r
                {\r
                        return string.Format("{0}({1})", UninstalledPackage.Name, UninstalledPackage.Version);\r