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 -
>>
>
>

Reply via email to