123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- using System;
- using System.Diagnostics;
- using System.IO;
-
- using Codice.Client.Common.EventTracking;
- using Codice.CM.Common;
- using Codice.LogWrapper;
- using Codice.Utils;
- using Unity.PlasticSCM.Editor.Views;
-
- namespace Unity.PlasticSCM.Editor.Tool
- {
- internal static class LaunchTool
- {
- public interface IShowDownloadPlasticExeWindow
- {
- bool Show(
- WorkspaceInfo wkInfo,
- bool isGluonMode,
- string installCloudFrom,
- string installEnterpriseFrom,
- string cancelInstallFrom);
- bool Show(
- RepositorySpec repSpec,
- bool isGluonMode,
- string installCloudFrom,
- string installEnterpriseFrom,
- string cancelInstallFrom);
- }
-
- public interface IProcessExecutor
- {
- Process ExecuteGUI(
- string program,
- string args,
- string commandFileArg,
- string commandFileName,
- int processId);
- Process ExecuteWindowsGUI(
- string program,
- string args,
- int processId);
- Process ExecuteProcess(string program, string args);
- }
-
- internal static void OpenGUIForMode(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- WorkspaceInfo wkInfo,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- wkInfo,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenGUI,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenGUI,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenGUI))
- return;
-
- mLog.DebugFormat(
- "Opening GUI on wkPath '{0}'.",
- wkInfo.ClientPath);
-
- TrackFeatureUseEvent.For(
- PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
- isGluonMode ?
- TrackFeatureUseEvent.Features.LaunchGluonTool :
- TrackFeatureUseEvent.Features.LaunchPlasticTool);
-
- if (isGluonMode)
- {
- Process gluonProcess = processExecutor.ExecuteGUI(
- PlasticInstallPath.GetGluonExePath(),
- string.Format(
- ToolConstants.Gluon.GUI_WK_EXPLORER_ARG,
- wkInfo.ClientPath),
- ToolConstants.Gluon.GUI_COMMAND_FILE_ARG,
- ToolConstants.Gluon.GUI_COMMAND_FILE,
- mGluonProcessId);
-
- if (gluonProcess != null)
- mGluonProcessId = gluonProcess.Id;
-
- return;
- }
-
- if (PlatformIdentifier.IsMac())
- {
- Process plasticProcess = processExecutor.ExecuteGUI(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(
- ToolConstants.Plastic.GUI_MACOS_WK_EXPLORER_ARG,
- wkInfo.ClientPath),
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE_ARG,
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE,
- mPlasticProcessId);
-
- if (plasticProcess != null)
- mPlasticProcessId = plasticProcess.Id;
-
- return;
- }
-
- processExecutor.ExecuteProcess(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(
- ToolConstants.Plastic.GUI_WINDOWS_WK_ARG,
- wkInfo.ClientPath));
- }
-
- internal static void OpenBranchExplorer(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- WorkspaceInfo wkInfo,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- wkInfo,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenBranchExplorer,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenBranchExplorer,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenBranchExplorer))
- return;
-
- mLog.DebugFormat(
- "Opening Branch Explorer on wkPath '{0}'.",
- wkInfo.ClientPath);
-
- TrackFeatureUseEvent.For(
- PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
- TrackFeatureUseEvent.Features.LaunchBranchExplorer);
-
- if (PlatformIdentifier.IsMac())
- {
- Process plasticProcess = processExecutor.ExecuteGUI(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(
- ToolConstants.Plastic.GUI_MACOS_BREX_ARG,
- wkInfo.ClientPath),
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE_ARG,
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE,
- mPlasticProcessId);
-
- if (plasticProcess != null)
- mPlasticProcessId = plasticProcess.Id;
-
- return;
- }
-
- Process brexProcess = processExecutor.ExecuteWindowsGUI(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(
- ToolConstants.Plastic.GUI_WINDOWS_BREX_ARG,
- wkInfo.ClientPath),
- mBrexProcessId);
-
- if (brexProcess != null)
- mBrexProcessId = brexProcess.Id;
- }
-
- internal static void OpenChangesetDiffs(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- RepositorySpec repSpec,
- string fullChangesetSpec,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- repSpec,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenChangesetDiffs,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenChangesetDiffs,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenChangesetDiffs))
- return;
-
- mLog.DebugFormat(
- "Launching changeset diffs for '{0}'",
- fullChangesetSpec);
-
- string exePath = (isGluonMode) ?
- PlasticInstallPath.GetGluonExePath() :
- PlasticInstallPath.GetPlasticExePath();
-
- string changesetDiffArg = (isGluonMode) ?
- ToolConstants.Gluon.GUI_CHANGESET_DIFF_ARG :
- ToolConstants.Plastic.GUI_CHANGESET_DIFF_ARG;
-
- processExecutor.ExecuteProcess(exePath,
- string.Format(
- changesetDiffArg, fullChangesetSpec));
- }
-
- internal static void OpenSelectedChangesetsDiffs(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- RepositorySpec repSpec,
- string srcFullChangesetSpec,
- string dstFullChangesetSpec,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- repSpec,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenSelectedChangesetsDiffs,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenSelectedChangesetsDiffs,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenSelectedChangesetsDiffs))
- return;
-
- mLog.DebugFormat(
- "Launching selected changesets diffs for '{0}' and '{1}'",
- srcFullChangesetSpec,
- dstFullChangesetSpec);
-
- string exePath = (isGluonMode) ?
- PlasticInstallPath.GetGluonExePath() :
- PlasticInstallPath.GetPlasticExePath();
-
- string selectedChangesetsDiffArgs = (isGluonMode) ?
- ToolConstants.Gluon.GUI_SELECTED_CHANGESETS_DIFF_ARGS :
- ToolConstants.Plastic.GUI_SELECTED_CHANGESETS_DIFF_ARGS;
-
- processExecutor.ExecuteProcess(exePath,
- string.Format(
- selectedChangesetsDiffArgs,
- srcFullChangesetSpec,
- dstFullChangesetSpec));
- }
-
- internal static void OpenBranchDiffs(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- RepositorySpec repSpec,
- string fullBranchSpec,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- repSpec,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenBranchDiff,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenBranchDiff,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenBranchDiff))
- return;
-
- mLog.DebugFormat(
- "Launching branch diffs for '{0}'",
- fullBranchSpec);
-
- string exePath = (isGluonMode) ?
- PlasticInstallPath.GetGluonExePath() :
- PlasticInstallPath.GetPlasticExePath();
-
- string branchDiffArg = (isGluonMode) ?
- ToolConstants.Gluon.GUI_BRANCH_DIFF_ARG :
- ToolConstants.Plastic.GUI_BRANCH_DIFF_ARG;
-
- processExecutor.ExecuteProcess(exePath,
- string.Format(
- branchDiffArg, fullBranchSpec));
- }
-
- internal static void OpenWorkspaceConfiguration(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- WorkspaceInfo wkInfo,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- wkInfo,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenWorkspaceConfiguration,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenWorkspaceConfiguration,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenWorkspaceConfiguration))
- return;
-
- mLog.DebugFormat(
- "Opening Workspace Configuration on wkPath '{0}'.",
- wkInfo.ClientPath);
-
- TrackFeatureUseEvent.For(
- PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
- TrackFeatureUseEvent.Features.LaunchPartialConfigure);
-
- Process gluonProcess = processExecutor.ExecuteGUI(
- PlasticInstallPath.GetGluonExePath(),
- string.Format(
- ToolConstants.Gluon.GUI_WK_CONFIGURATION_ARG,
- wkInfo.ClientPath),
- ToolConstants.Gluon.GUI_COMMAND_FILE_ARG,
- ToolConstants.Gluon.GUI_COMMAND_FILE,
- mGluonProcessId);
-
- if (gluonProcess == null)
- return;
-
- mGluonProcessId = gluonProcess.Id;
- }
-
- internal static void OpenMerge(
- IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- IProcessExecutor processExecutor,
- WorkspaceInfo wkInfo,
- bool isGluonMode)
- {
- if (showDownloadPlasticExeWindow.Show(
- wkInfo,
- isGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromOpenMerge,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromOpenMerge,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromOpenMerge))
- return;
-
- mLog.DebugFormat(
- "Opening Merge on wkPath '{0}'.",
- wkInfo.ClientPath);
-
- if (PlatformIdentifier.IsMac())
- {
- Process plasticProcess = processExecutor.ExecuteGUI(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(ToolConstants.Plastic.GUI_MACOS_MERGE_ARG, wkInfo.ClientPath),
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE_ARG,
- ToolConstants.Plastic.GUI_MACOS_COMMAND_FILE,
- mPlasticProcessId);
-
- if (plasticProcess != null)
- mPlasticProcessId = plasticProcess.Id;
-
- return;
- }
-
- processExecutor.ExecuteProcess(
- PlasticInstallPath.GetPlasticExePath(),
- string.Format(ToolConstants.Plastic.GUI_WINDOWS_MERGE_ARG, wkInfo.ClientPath));
- }
-
- static int mPlasticProcessId = -1;
- static int mGluonProcessId = -1;
- static int mBrexProcessId = -1;
-
- static readonly ILog mLog = PlasticApp.GetLogger("LaunchTool");
-
- internal class ShowDownloadPlasticExeWindow : LaunchTool.IShowDownloadPlasticExeWindow
- {
- bool LaunchTool.IShowDownloadPlasticExeWindow.Show(
- WorkspaceInfo wkInfo,
- bool isGluonMode,
- string installCloudFrom,
- string installEnterpriseFrom,
- string cancelInstallFrom)
- {
- RepositorySpec repSpec = PlasticGui.Plastic.API.GetRepositorySpec(wkInfo);
-
- return ((LaunchTool.IShowDownloadPlasticExeWindow)this).Show(
- repSpec,
- isGluonMode,
- installCloudFrom,
- installEnterpriseFrom,
- cancelInstallFrom);
- }
-
- bool LaunchTool.IShowDownloadPlasticExeWindow.Show(
- RepositorySpec repSpec,
- bool isGluonMode,
- string installCloudFrom,
- string installEnterpriseFrom,
- string cancelInstallFrom)
- {
- if (IsExeAvailable.ForMode(isGluonMode))
- return false;
-
- DownloadPlasticExeWindow.ShowWindow(
- repSpec,
- isGluonMode,
- installCloudFrom,
- installEnterpriseFrom,
- cancelInstallFrom);
-
- return true;
- }
- }
-
- internal class ProcessExecutor : LaunchTool.IProcessExecutor
- {
- Process LaunchTool.IProcessExecutor.ExecuteGUI(
- string program,
- string args,
- string commandFileArg,
- string commandFileName,
- int processId)
- {
- string commandFile = Path.Combine(
- Path.GetTempPath(), commandFileName);
-
- Process process = GetGUIProcess(program, processId);
-
- if (process == null)
- {
- mLog.DebugFormat("Executing {0} (new process).", program);
-
- return ((LaunchTool.IProcessExecutor)this).ExecuteProcess(
- program, args + string.Format(commandFileArg, commandFile));
- }
-
- mLog.DebugFormat("Executing {0} (reuse process pid:{1}).", program, processId);
-
- using (StreamWriter writer = new StreamWriter(new FileStream(
- commandFile, FileMode.Append, FileAccess.Write, FileShare.Read)))
- {
- writer.WriteLine(args);
- }
-
- return process;
- }
-
- Process LaunchTool.IProcessExecutor.ExecuteWindowsGUI(
- string program,
- string args,
- int processId)
- {
- Process process = GetGUIProcess(program, processId);
-
- if (process == null)
- {
- mLog.DebugFormat("Executing {0} (new process).", program);
-
- return ((LaunchTool.IProcessExecutor)this).ExecuteProcess(program, args);
- }
-
- mLog.DebugFormat("Not executing {0} (existing process pid:{1}).", program, processId);
-
- BringWindowToFront.ForWindowsProcess(process.Id);
-
- return process;
- }
-
- Process LaunchTool.IProcessExecutor.ExecuteProcess(string program, string args)
- {
- mLog.DebugFormat("Execute process: '{0} {1}'", program, args);
-
- Process process = BuildProcess(program, args);
-
- try
- {
- process.Start();
-
- return process;
- }
- catch (Exception ex)
- {
- mLog.ErrorFormat("Couldn't execute the program {0}: {1}",
- program, ex.Message);
- mLog.DebugFormat("Stack trace: {0}",
- ex.StackTrace);
-
- return null;
- }
- }
-
- Process BuildProcess(string program, string args)
- {
- Process result = new Process();
- result.StartInfo.FileName = program;
- result.StartInfo.Arguments = args;
- result.StartInfo.CreateNoWindow = false;
- return result;
- }
-
- Process GetGUIProcess(string program, int processId)
- {
- if (processId == -1)
- return null;
-
- mLog.DebugFormat("Checking {0} process [pid:{1}].", program, processId);
-
- try
- {
- Process process = Process.GetProcessById(processId);
-
- if (process == null)
- return null;
-
- return process.HasExited ? null : process;
- }
- catch
- {
- // process is not running
- return null;
- }
- }
-
- readonly ILog mLog = PlasticApp.GetLogger("ProcessExecutor");
- }
- }
- }
|