Hi! VisualSVN release 1.6.3 is available.
*Fixed: VisualSVN crashes with T4 Toolbox. You can download it from our site: http://www.visualsvn.com/visualsvn/download/. On Sat, Mar 7, 2009 at 10:20 PM, Kyle Baley <kyle.ba...@gmail.com> wrote: > > I had a chance to test this and I'm no longer getting any errors. > Seems to work! Thanks. > > > On Mar 2, 4:12 am, VisualSVN Support <supp...@visualsvn.com> wrote: >> Hi Kyle! >> >> We're trying to enable VisualSVN to support T4Tollbox template. Please >> try this special development >> build:http://www.visualsvn.com/files/VisualSVN-1.6.2.18026.msi >> >> Note that this is not an official release and it's intended for >> testing of new features only. >> >> Please let us know if you will find any problems with that build. >> >> Looking forward for your feedback. >> >> On Mon, Feb 2, 2009 at 5:25 PM, Kyle Baley <kyle.ba...@gmail.com> wrote: >> >> > Danil, >> >> > Apologies for not checking in. Thought I was getting e-mail alerts on >> > this. >> >> > Windows 2008 Server (running as a desktop) >> > Visual Studio 2008 (version 9.0.30729.1 SP) >> > Visual SVN 1.6.1 >> > T4Toolbox 9.1.20.1 (current as of today) >> >> > The reproduction scripts will be hard to explain as I didn't build >> > them myself. I think the three templates at the bottom should do it >> > but basically, any template that calls RenderToFile seems to start the >> > whole thing. >> >> > I mentioned the AppDomain problem in the T4Toolbox discussion board. >> > Both the creator and myself are confused, though he seems to have a >> > better grasp of the problem. Here's an excerpt of his comment: >> >> > "I followed the ActiveWriter thread and don't understand how their >> > patch can work. How can the EnvDTE code executing on the thread pool >> > in a temporary appdomain be marshalled to the default appdomain? The >> > EnvDTE code doesn't have this problem with Visual SourceSafe and Team >> > Foundation Server source control providers." >> >> > Here is the template that launches the template generation: >> >> > -------------------------------- >> >> > <#@ template language="C#" hostspecific="True" debug="True" #> >> > <#@ import namespace="System.Collections.Specialized" #> >> > <#@ output extension="txt" #> >> > <#@ include file="T4Toolbox.tt" #> >> > <#@ include file="ScaffoldingGenerator.tt" #> >> >> > <# >> > /////////////////////////////////////////////////// >> > // Set your domain object details below and simply save this file to >> > auto-generate the scaffolding >> >> > // Domain name should be PascalCaseSingular >> > string domainObjectName = "Artist"; >> >> > // Properties should be name/value pairs representing the property- >> > name/data-type of the properties; property names should be PascalCase >> > NameValueCollection properties = new NameValueCollection(); >> > properties.Add("Title", "string"); >> > properties.Add("Artist", "string"); >> > properties.Add("Album", "string"); >> > properties.Add("Genre", "string"); >> >> > /////////////////////////////////////////////////// >> >> > ScaffoldingGenerator generator = new ScaffoldingGenerator( >> > @"e:\code\Suvius\Flamingo\", "Flamingo", domainObjectName, >> > properties); >> >> > generator.Run(); >> > #> >> >> > -------------------------------- >> >> > Here is the generator template: >> >> > <#@ include file="Pluralizer.tt" #> >> > <#@ include file="ScaffoldingEnums.tt" #> >> > <#@ include file="./Templates/BaseTemplate.tt" #> >> > <#@ include file="./Templates/Controllers/ControllerTemplate.tt" #> >> > <#@ include file="./Templates/Core/DomainObjectTemplate.tt" #> >> > <#@ include file="./Templates/Data/NHibernateMaps/ClassMapTemplate.tt" >> > #> >> > <#@ include file="./Templates/Tests/Controllers/ >> > ControllerTestsTemplate.tt" #> >> > <#@ include file="./Templates/Tests/Core/DomainObjectTestsTemplate.tt" >> > #> >> > <#@ include file="./Templates/Web/Views/DomainObjectFormTemplate.tt" >> > #> >> > <#@ include file="./Templates/Web/Views/CreateTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/EditTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/IndexTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/IndexCodeBehindTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/IndexDesignerTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/ShowTemplate.tt" #> >> > <#@ include file="./Templates/Web/Views/GeneralCodeBehindTemplate.tt" >> > #> >> > <#@ include file="./Templates/Web/Views/GeneralDesignerTemplate.tt" #> >> > <#@ import namespace="System.IO" #> >> >> > <#+ >> > public class ScaffoldingGenerator : Generator >> > { >> > public ScaffoldingGenerator(string projectRootPath, string >> > solutionName, string domainObjectName, NameValueCollection properties) >> > : this(projectRootPath, solutionName, domainObjectName, >> > properties, >> > null) { } >> >> > public ScaffoldingGenerator(string projectRootPath, string >> > solutionName, string domainObjectName, NameValueCollection properties, >> > ArtifactToGenerate[] artifactsToGenerate) { >> > this.solutionRootFolder = projectRootPath + "app\\"; >> > this.scaffoldingOutputFolder = projectRootPath + "tools\ >> > \CrudScaffolding\\"; >> > this.testsRootFolder = projectRootPath + "tests\\"; >> > this.logsPath = projectRootPath + "logs\\"; >> >> > this.solutionName = solutionName; >> > this.domainObjectName = domainObjectName; >> > this.properties = properties; >> > this.artifactsToGenerate = artifactsToGenerate; >> > } >> >> > protected override void RunCore() { >> > // Get rid of the existing generation log >> > File.Delete(logsPath + LOG_FILE_NAME); >> >> > GenerateClassMap(); >> > } >> >> > private void GenerateClassMap() { >> > string fileName = domainObjectName + "Map.cs"; >> > string targetPath = solutionRootFolder + solutionName + >> > ".Data\ >> > \NHibernateMaps\\"; >> >> > if (DidRequestToGenerate(ArtifactToGenerate.ClassMap)) { >> > if (! Directory.Exists(targetPath)) { >> > Directory.CreateDirectory(targetPath); >> >> > Log("Added directory " + targetPath); >> > } >> >> > if (! File.Exists(targetPath + fileName)) { >> > ClassMapTemplate classMapTemplate = >> > new ClassMapTemplate(solutionName, >> > domainObjectName, properties); >> > classMapTemplate.RenderToFile(fileName); >> >> > File.Move(scaffoldingOutputFolder + >> > fileName, targetPath + >> > fileName); >> >> > Log("Added file " + targetPath + fileName); >> > } >> > else { >> > Log("File already exists " + targetPath + >> > fileName); >> > } >> > } >> > else { >> > Log("Skipped generation of class map"); >> > } >> > } >> >> > private string DomainObjectNamePlural { >> > get { >> > return Pluralizer.ToPlural(domainObjectName); >> > } >> > } >> >> > private void Log(string message) { >> > StreamWriter streamWriter = File.AppendText(logsPath + >> > LOG_FILE_NAME); >> > streamWriter.WriteLine(DateTime.Now.ToLongTimeString() + >> > "\t" + >> > message); >> > streamWriter.Close(); >> > } >> >> > private readonly string logsPath; >> > private readonly string testsRootFolder; >> > private readonly string scaffoldingOutputFolder; >> > private readonly string solutionRootFolder; >> > private readonly ArtifactToGenerate[] artifactsToGenerate; >> > private readonly string solutionName; >> > private readonly string domainObjectName; >> > private readonly NameValueCollection properties; >> > private const string LOG_FILE_NAME = "CrudScaffolding.log"; >> > } >> > #> >> >> > ------------------------------ >> > And here is the actual template that is used to generate the class: >> >> > <#@ import namespace="System.Collections" #> >> >> > <#+ >> > public class ClassMapTemplate : BaseTemplate >> > { >> > public ClassMapTemplate(string solutionName, string >> > domainObjectName, >> > NameValueCollection properties) >> > : base(solutionName, domainObjectName, properties) { } >> >> > protected override void RenderCore() >> > { >> > #> >> > using <#= SolutionName #>.Core; >> > using FluentNHibernate; >> > using FluentNHibernate.Mapping; >> > using SharpArch.Data.NHibernate.FluentNHibernate; >> >> > namespace <#= SolutionName #>.Data.NHibernateMappings >> > { >> > public class <#= DomainObjectName #>Map : ClassMap<<#= >> > DomainObjectName #>>, IMapGenerator >> > { >> > public <#= DomainObjectName #>Map() { >> > WithTable("<#= DomainObjectNamePlural #>"); >> >> > Id(x => x.ID) >> > .WithUnsavedValue(0) >> > .GeneratedBy.Identity(); >> >> > <#+ >> > PushIndent("\t\t\t"); >> >> > foreach (string propertyName in Properties.AllKeys >> > ) { >> > WriteLine("Map(x => x." + propertyName + >> > ");"); >> > } >> >> > PopIndent(); >> > #> >> > } >> >> > #region IMapGenerator Members >> >> > public System.Xml.XmlDocument Generate() { >> > return CreateMapping(new MappingVisitor()); >> > } >> >> > #endregion >> > } >> > } >> > <#+ >> > } >> > } >> > #> >> >> > On Jan 9, 4:51 am, "VisualSVN Team" <supp...@visualsvn.com> wrote: >> >> Hello! >> >> >> Thanks for your interest in VisualSVN! >> >> >> > I'm getting a VisualSVN error when I try to run a T4 template that >> >> > usesT4Toolbox(www.codeplex.com/T4Toolbox). >> >> >> Could you please provide us with detailed information about your >> >> configuration? What >> >> ... >> >> read more » > -- With best regards, Olga Dolidze VisualSVN Support