- string line;
-
- if (filename == null)
- throw new ArgumentNullException ("filename");
- if (arguments == null)
- throw new ArgumentNullException ("arguments");
-
- process = new Process ();
- process.StartInfo.Arguments = arguments;
- process.StartInfo.CreateNoWindow = true;
- process.StartInfo.FileName = filename;
- process.StartInfo.RedirectStandardError = true;
- process.StartInfo.RedirectStandardOutput = true;
- process.StartInfo.UseShellExecute = false;
-
- Log.LogMessage (MessageImportance.Low, String.Format ("Tool {0} execution started with arguments: {1}",
- filename, arguments));
-
- process.Start ();
- process.WaitForExit ();
-
- exitCode = process.ExitCode;
-
- while ((line = process.StandardError.ReadLine ()) != null) {
- LogEventsFromTextOutput (line, MessageImportance.Normal);
+ if (pathToTool == null)
+ throw new ArgumentNullException ("pathToTool");
+
+ string responseFileName;
+ responseFileName = null;
+ toolOutput = new StringBuilder ();
+
+ try {
+ string responseFileSwitch = String.Empty;
+ if (!String.IsNullOrEmpty (responseFileCommands)) {
+ responseFileName = Path.GetTempFileName ();
+ File.WriteAllText (responseFileName, responseFileCommands);
+ responseFileSwitch = GetResponseFileSwitch (responseFileName);
+ }
+
+ var pinfo = GetProcessStartInfo (pathToTool, commandLineCommands, responseFileSwitch);
+ LogToolCommand (String.Format ("Tool {0} execution started with arguments: {1} {2}",
+ pinfo.FileName, commandLineCommands, responseFileCommands));
+
+ var pendingLineFragmentOutput = new StringBuilder ();
+ var pendingLineFragmentError = new StringBuilder ();
+ var environmentOverride = GetAndLogEnvironmentVariables ();
+ try {
+ // When StartProcess returns, the process has already .Start()'ed
+ // If we subscribe to the events after that, then for processes that
+ // finish executing before we can subscribe, we won't get the output/err
+ // events at all!
+ ProcessWrapper pw = ProcessService.StartProcess (pinfo,
+ (_, msg) => ProcessLine (pendingLineFragmentOutput, msg, StandardOutputLoggingImportance),
+ (_, msg) => ProcessLine (pendingLineFragmentError, msg, StandardErrorLoggingImportance),
+ null,
+ environmentOverride);
+
+ pw.WaitForOutput (timeout == Int32.MaxValue ? Int32.MaxValue : timeout);
+
+ // Process any remaining line
+ ProcessLine (pendingLineFragmentOutput, StandardOutputLoggingImportance, true);
+ ProcessLine (pendingLineFragmentError, StandardErrorLoggingImportance, true);
+
+ exitCode = pw.ExitCode;
+ pw.Dispose ();
+ } catch (System.ComponentModel.Win32Exception e) {
+ Log.LogError ("Error executing tool '{0}': {1}", pathToTool, e.Message);
+ return -1;
+ }
+
+ if (typeLoadException)
+ ProcessTypeLoadException ();
+
+ pendingLineFragmentOutput.Length = 0;
+ pendingLineFragmentError.Length = 0;
+
+ Log.LogMessage (MessageImportance.Low, "Tool {0} execution finished.", pathToTool);
+ return exitCode;
+ } finally {
+ DeleteTempFile (responseFileName);