I've filed the bug: http://jira.public.thoughtworks.org/browse/CCNET-1874
<http://jira.public.thoughtworks.org/browse/CCNET-1874>Which version of CC.Net was in use when the exception happened? On 25 April 2010 19:18, David Cameron <[email protected]> wrote: > I believe the problem is in using a dynamic parameter for the password. No > one had thought of this scenario so it isn't tested. Password uses a > PrivateString so that it is never printed out to log files. There is an > implicit cast String => PrivateString but it isn't triggering in your > scenario. This is a bug. > > I think the original problem was because CC.Net wouldn't be passing > anything to the standard-in of NAnt, therefore the .ReadLine() call would > block forever and your build would time out. > > Are you using triggers with your build, or is it force only? Having dynamic > parameters in your source control block will make polling for changes > impossible, I think. > > Dave > > > On 23 April 2010 10:35, Mike M <[email protected]> wrote: > >> Thanks for the input Phil. I was using an older version of CCNet and >> wasn't aware of dynamic parameters. They are exactly what I was >> looking for! I have run into a problem though. I am having trouble >> using dynamic parameters to prompt the user for logon details to SVN. >> My code is as follows: >> >> <project name="Test Project"> >> <webURL>xxx</webURL> >> <sourcecontrol type="svn"> >> <trunkUrl>xxx</trunkUrl> >> <workingDirectory>xxx</workingDirectory> >> <username>$[SVNUsername]</username> >> <password>$[SVNPassword]</password> >> <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable> >> </sourcecontrol> >> >> ... >> >> <parameters> >> <textParameter name="SVNUsername"> >> <description>SVN Username</description> >> <minimum>4</minimum> >> <maximum>20</maximum> >> <required>true</required> >> </textParameter> >> <textParameter name="SVNPassword"> >> <description>SVN Password</description> >> <minimum>4</minimum> >> <maximum>20</maximum> >> <required>true</required> >> </textParameter> >> </parameters> >> </project> >> >> However, I get the following error when I try to run a force build: >> >> [Test Project:ERROR] INTERNAL ERROR: Invalid cast from 'System.String' >> to 'ThoughtWorks.CruiseControl.Core.Util.PrivateString'. >> ---------- >> System.InvalidCastException: Invalid cast from 'System.String' to >> 'ThoughtWorks.CruiseControl.Core.Util.PrivateString'. >> at System.Convert.DefaultToType(IConvertible value, Type >> targetType, IFormatProvider provider) >> at System.String.System.IConvertible.ToType(Type type, >> IFormatProvider provider) >> at System.Convert.ChangeType(Object value, Type conversionType, >> IFormatProvider provider) >> at System.Convert.ChangeType(Object value, Type conversionType) >> at >> >> ThoughtWorks.CruiseControl.Core.Tasks.DynamicValueUtility.PropertyValue.ChangeFieldValue(Object >> value) >> at >> >> ThoughtWorks.CruiseControl.Core.Tasks.DynamicValueUtility.PropertyValue.ChangeProperty(Object >> value) >> at >> ThoughtWorks.CruiseControl.Core.Tasks.DirectDynamicValue.ApplyTo(Object >> value, Dictionary`2 parameters, IEnumerable`1 parameterDefinitions) >> at >> >> ThoughtWorks.CruiseControl.Core.Sourcecontrol.SourceControlBase.ApplyParameters(Dictionary`2 >> parameters, IEnumerable`1 parameterDefinitions) >> at >> ThoughtWorks.CruiseControl.Core.Project.Integrate(IntegrationRequest >> request) >> ---------- >> >> [Test Project:ERROR] INTERNAL ERROR: Invalid cast from 'System.String' >> to 'ThoughtWorks.CruiseControl.Core.Util.PrivateString'. >> ---------- >> System.InvalidCastException: Invalid cast from 'System.String' to >> 'ThoughtWorks.CruiseControl.Core.Util.PrivateString'. >> at System.Convert.DefaultToType(IConvertible value, Type >> targetType, IFormatProvider provider) >> at System.String.System.IConvertible.ToType(Type type, >> IFormatProvider provider) >> at System.Convert.ChangeType(Object value, Type conversionType, >> IFormatProvider provider) >> at System.Convert.ChangeType(Object value, Type conversionType) >> at >> >> ThoughtWorks.CruiseControl.Core.Tasks.DynamicValueUtility.PropertyValue.ChangeFieldValue(Object >> value) >> at >> >> ThoughtWorks.CruiseControl.Core.Tasks.DynamicValueUtility.PropertyValue.ChangeProperty(Object >> value) >> at >> ThoughtWorks.CruiseControl.Core.Tasks.DirectDynamicValue.ApplyTo(Object >> value, Dictionary`2 parameters, IEnumerable`1 parameterDefinitions) >> at >> >> ThoughtWorks.CruiseControl.Core.Sourcecontrol.SourceControlBase.ApplyParameters(Dictionary`2 >> parameters, IEnumerable`1 parameterDefinitions) >> at >> ThoughtWorks.CruiseControl.Core.Project.Integrate(IntegrationRequest >> request) >> at ThoughtWorks.CruiseControl.Core.ProjectIntegrator.Integrate() >> at ThoughtWorks.CruiseControl.Core.ProjectIntegrator.Run() >> ---------- >> >> Can anyone help me with fixing this? >> >> On Apr 23, 12:37 am, "Phil Sayers" <[email protected]> wrote: >> > Dynamic Parameters are your friend. >> http://confluence.public.thoughtworks.org/display/CCNET/Dynamic+Param... >> > >> > >> > >> > -----Original Message----- >> > From: [email protected] [mailto:[email protected]] >> On >> > >> > Behalf Of Mike M >> > Sent: Wednesday, April 21, 2010 11:49 PM >> > To: ccnet-user >> > Subject: [ccnet-user] CCNet + NAnt + C# >> > >> > Hi guys, >> > I have a C# script within my NAnt build file which allows me to accept >> > user input from the commandline. A truncutated excerpt of the NAnt >> > build file is: >> > ... >> > <property name="username" value="" /> >> > <property name="password" value="" /> >> > <property name="database" value="" /> >> > ... >> > <target name="menu"> >> > <script language="C#" mainclass="GetInput"> >> > <code> >> > <![CDATA[ >> > class GetInput >> > { >> > public static void ScriptMain(Project project) >> > { >> > Console.Clear(); >> > >> > >> Console.WriteLine("========================================================= >> > =========="); >> > Console.WriteLine("Welcome to the Compile and Deploy >> > Oracle Forms and Reports Facility"); >> > >> > >> Console.WriteLine("========================================================= >> > =========="); >> > Console.Write("Please enter username: "); >> > project.Properties["username"] = Console.ReadLine(); >> > Console.WriteLine(); >> > Console.Write("Please enter password: "); >> > project.Properties["password"] = Console.ReadLine(); >> > Console.WriteLine(); >> > Console.Write("Please enter database: "); >> > project.Properties["database"] = Console.ReadLine(); >> > Console.WriteLine(); >> > ... >> > ]]> >> > </code> >> > </script> >> > </target> >> > >> > When I run this build file from the commandline, it works perfectly. >> > However, when I call this build file from CCNet it does not work. The >> > only reason for this I can think of is that when CCNet calls the NAnt >> > script, it is not sure how to pass the C# script calls to the >> > System.Console class to the commandline. I'm not sure how to do this >> > though. >> > >> > I've also been playing around with the idea of the C# script opening a >> > new instance of cmd.exe and then trying to execute the remainder of >> > the script. From searches on Google, I found the following solution >> > that works as a C# class: >> > >> > using System; >> > using System.Windows.Forms; >> > using System.Text; >> > using System.IO; >> > using System.Runtime.InteropServices; >> > using Microsoft.Win32.SafeHandles; >> > class Program >> > { >> > [DllImport("kernel32.dll", >> > EntryPoint = "GetStdHandle", >> > SetLastError = true, >> > CharSet = CharSet.Auto, >> > CallingConvention = CallingConvention.StdCall)] >> > private static extern IntPtr GetStdHandle(int nStdHandle); >> > [DllImport("kernel32.dll", >> > EntryPoint = "AllocConsole", >> > SetLastError = true, >> > CharSet = CharSet.Auto, >> > CallingConvention = CallingConvention.StdCall)] >> > private static extern int AllocConsole(); >> > private const int STD_OUTPUT_HANDLE = -11; >> > private const int MY_CODE_PAGE = 437; >> > private static string deployment = "\\\\vm-osb-oasd\\sohaan"; >> > static void Main(string[] args) >> > { >> > AllocConsole(); >> > IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); >> > SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, >> > true); >> > FileStream fileStream = new FileStream(safeFileHandle, >> > FileAccess.Write); >> > Encoding encoding = >> > System.Text.Encoding.GetEncoding(MY_CODE_PAGE); >> > StreamWriter standardOutput = new StreamWriter(fileStream, >> > encoding); >> > standardOutput.AutoFlush = true; >> > Console.SetOut(standardOutput); >> > Console.Clear(); >> > >> > >> Console.WriteLine("========================================================= >> > =========="); >> > Console.WriteLine("Welcome to the Compile and Deploy Oracle >> > Forms and Reports Facility"); >> > >> > >> Console.WriteLine("========================================================= >> > =========="); >> > Console.Write("Please enter username: "); >> > string username = Console.ReadLine(); >> > .... >> > } >> > } >> > This works perfectly in a C# environment. However, I do not know how >> > to embed it within a NAnt script correctly...From what I know about >> > NAnt, I may need to create an extension, but am uncertain of how to go >> > about this. Can anyone help me out? >> > >> > -- >> > Subscription settings: >> http://groups.google.com/group/ccnet-user/subscribe?hl=en- Hide quoted >> text - >> > >> > - Show quoted text - >> > >
