<Compile Include="src\Program.cs" />\r
<Compile Include="Properties\AssemblyInfo.cs" />\r
</ItemGroup>\r
+ <ItemGroup>\r
+ <None Include="App.config" />\r
+ </ItemGroup>\r
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
Other similar extension points exist, see Microsoft.Common.targets.\r
using System;\r
using System.Collections.Generic;\r
+using System.Diagnostics;\r
using System.IO;\r
using System.Reflection;\r
using System.Linq;\r
+using System.Text;\r
+using System.Threading;\r
\r
namespace JetBrains.TeamCity.NuGetRunner\r
{\r
}\r
}\r
\r
- public int Run(string[] argz)\r
+ public int Run(IEnumerable<string> argz)\r
{\r
CallEvents(myStartEvents);\r
\r
try\r
{\r
- var result = myNuGetAssembly.EntryPoint.Invoke(null, new[] {argz});\r
+ var process = Process.Start(new ProcessStartInfo\r
+ {\r
+ FileName = myNuGetExe,\r
+ //TODO use escapring safe escaping here.\r
+ Arguments = string.Join(" ", argz.Select(x=>x.IndexOfAny(" \t\n\r".ToCharArray()) >=0 ? "\"" + x + "\"" : x)),\r
+ UseShellExecute = false,\r
+ RedirectStandardInput = true, \r
+ RedirectStandardError = true, \r
+ RedirectStandardOutput = true\r
+ });\r
\r
- if (result is int)\r
- return (int) result;\r
+ process.StandardInput.Close();\r
+ Func<StreamReader, TextWriter, Thread> readOutput = (si, so) =>\r
+ {\r
+ var th = new Thread(delegate()\r
+ {\r
+ int i;\r
+ while ((i = si.Read()) >= 0) so.Write((char)i); \r
+ }) { Name = "Process output reader " + process.Id };\r
+ th.Start();\r
+ return th;\r
+ };\r
+\r
+ var t1 = readOutput(process.StandardOutput, Console.Out);\r
+ var t2 = readOutput(process.StandardError, Console.Error);\r
+ \r
+ process.WaitForExit();\r
\r
- return 0;\r
- } finally\r
+ t1.Join(TimeSpan.FromMinutes(5));\r
+ t2.Join(TimeSpan.FromMinutes(5));\r
+\r
+ return process.ExitCode;\r
+ /*AppDomain dom = AppDomain.CreateDomain("NuGet Launcher Domain");\r
+ var result = dom.ExecuteAssembly(myNuGetExe, argz);\r
+ return result is int ? (int) result : 0;*/\r
+ }\r
+ finally\r
{\r
CallEvents(myFinishEvents);\r
}\r