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