public ICreationEffects GetCreationEffects(IEngineEnvironmentSettings environmentSettings, ITemplate templateData, IParameterSet parameters, IComponentManager componentManager, string targetDirectory) { RunnableProjectTemplate template = (RunnableProjectTemplate)templateData; ProcessMacros(environmentSettings, componentManager, template.Config.OperationConfig, parameters); IVariableCollection variables = VariableCollection.SetupVariables(environmentSettings, parameters, template.Config.OperationConfig.VariableSetup); template.Config.Evaluate(parameters, variables, template.ConfigFile); IOrchestrator basicOrchestrator = new Core.Util.Orchestrator(); RunnableProjectOrchestrator orchestrator = new RunnableProjectOrchestrator(basicOrchestrator); GlobalRunSpec runSpec = new GlobalRunSpec(template.TemplateSourceRoot, componentManager, parameters, variables, template.Config.OperationConfig, template.Config.SpecialOperationConfig, template.Config.LocalizationOperations, template.Config.IgnoreFileNames); List <IFileChange2> changes = new List <IFileChange2>(); foreach (FileSourceMatchInfo source in template.Config.Sources) { runSpec.SetupFileSource(source); changes.AddRange(orchestrator.GetFileChanges(runSpec, template.TemplateSourceRoot.DirectoryInfo(source.Source), targetDirectory, source.Target)); } return(new CreationEffects2 { FileChanges = changes, CreationResult = GetCreationResult(environmentSettings, template, variables) }); }
public Task <ICreationResult> CreateAsync(IEngineEnvironmentSettings environmentSettings, ITemplate templateData, IParameterSet parameters, IComponentManager componentManager, string targetDirectory) { RunnableProjectTemplate template = (RunnableProjectTemplate)templateData; ProcessMacros(environmentSettings, componentManager, template.Config.OperationConfig, parameters); IVariableCollection variables = VariableCollection.SetupVariables(environmentSettings, parameters, template.Config.OperationConfig.VariableSetup); template.Config.Evaluate(parameters, variables, template.ConfigFile); IOrchestrator basicOrchestrator = new Core.Util.Orchestrator(); RunnableProjectOrchestrator orchestrator = new RunnableProjectOrchestrator(basicOrchestrator); GlobalRunSpec runSpec = new GlobalRunSpec(template.TemplateSourceRoot, componentManager, parameters, variables, template.Config.OperationConfig, template.Config.SpecialOperationConfig, template.Config.LocalizationOperations, template.Config.PlaceholderFilename); foreach (FileSource source in template.Config.Sources) { runSpec.SetupFileSource(source); string target = Path.Combine(targetDirectory, source.Target); orchestrator.Run(runSpec, template.TemplateSourceRoot.DirectoryInfo(source.Source), target); } // todo: add anything else we'd want to report to the broker return(Task.FromResult <ICreationResult>(new CreationResult() { PostActions = PostAction.ListFromModel(environmentSettings, template.Config.PostActionModel, variables), PrimaryOutputs = CreationPath.ListFromModel(environmentSettings, template.Config.PrimaryOutputs, variables) })); }
public IReadOnlyList <IFileChange> GetFileChanges(IEngineEnvironmentSettings environmentSettings, ITemplate templateData, IParameterSet parameters, IComponentManager componentManager, string targetDirectory) { RunnableProjectTemplate template = (RunnableProjectTemplate)templateData; ProcessMacros(environmentSettings, componentManager, template.Config.OperationConfig, parameters); IVariableCollection variables = VariableCollection.SetupVariables(environmentSettings, parameters, template.Config.OperationConfig.VariableSetup); template.Config.Evaluate(parameters, variables, template.ConfigFile); IOrchestrator basicOrchestrator = new Core.Util.Orchestrator(); RunnableProjectOrchestrator orchestrator = new RunnableProjectOrchestrator(basicOrchestrator); GlobalRunSpec runSpec = new GlobalRunSpec(template.TemplateSourceRoot, componentManager, parameters, variables, template.Config.OperationConfig, template.Config.SpecialOperationConfig, template.Config.LocalizationOperations, template.Config.PlaceholderFilename); List <IFileChange> changes = new List <IFileChange>(); foreach (FileSource source in template.Config.Sources) { runSpec.SetupFileSource(source); string target = Path.Combine(targetDirectory, source.Target); changes.AddRange(orchestrator.GetFileChanges(runSpec, template.TemplateSourceRoot.DirectoryInfo(source.Source), target)); } return(changes); }
public bool TryGetTemplateFromConfigInfo(IFileSystemInfo config, out ITemplate template, IFileSystemInfo localeConfig = null, IFile hostTemplateConfigFile = null) { IFile file = config as IFile; if (file == null) { template = null; return(false); } IFile localeFile = localeConfig as IFile; try { JObject srcObject = ReadJObjectFromIFile(file); JObject localeSourceObject = null; if (localeFile != null) { localeSourceObject = ReadJObjectFromIFile(localeFile); } SimpleConfigModel templateModel = SimpleConfigModel.FromJObject(file.MountPoint.EnvironmentSettings, srcObject, localeSourceObject); template = new RunnableProjectTemplate(srcObject, this, file, templateModel, null, hostTemplateConfigFile); return(true); } catch (Exception ex) { ITemplateEngineHost host = config.MountPoint.EnvironmentSettings.Host; host.LogMessage($"Error reading template from file: {file.FullPath} | Error = {ex.ToString()}"); } template = null; return(false); }
public bool TryGetTemplateFromConfigInfo(IFileSystemInfo templateFileConfig, out ITemplate template, IFileSystemInfo localeFileConfig = null, IFile hostTemplateConfigFile = null, string baselineName = null) { IFile templateFile = templateFileConfig as IFile; if (templateFile == null) { template = null; return(false); } IFile localeFile = localeFileConfig as IFile; ITemplateEngineHost host = templateFileConfig.MountPoint.EnvironmentSettings.Host; try { JObject baseSrcObject = ReadJObjectFromIFile(templateFile); JObject srcObject = MergeAdditionalConfiguration(baseSrcObject, templateFileConfig); JObject localeSourceObject = null; if (localeFile != null) { localeSourceObject = ReadJObjectFromIFile(localeFile); } ISimpleConfigModifiers configModifiers = new SimpleConfigModifiers() { BaselineName = baselineName }; SimpleConfigModel templateModel = SimpleConfigModel.FromJObject(templateFile.MountPoint.EnvironmentSettings, srcObject, configModifiers, localeSourceObject); if (!PerformTemplateValidation(templateModel, templateFile, host)) { template = null; return(false); } if (!CheckGeneratorVersionRequiredByTemplate(templateModel.GeneratorVersions)) { // template isn't compatible with this generator version template = null; return(false); } RunnableProjectTemplate runnableProjectTemplate = new RunnableProjectTemplate(srcObject, this, templateFile, templateModel, null, hostTemplateConfigFile); if (!AreAllTemplatePathsValid(templateModel, runnableProjectTemplate)) { template = null; return(false); } template = runnableProjectTemplate; return(true); } catch (Exception ex) { host.LogMessage($"Error reading template from file: {templateFile.FullPath} | Error = {ex.Message}"); } template = null; return(false); }
public Task Create(ITemplate template, IParameterSet parameters) { RunnableProjectTemplate tmplt = (RunnableProjectTemplate)template; RunnableProjectOrchestrator o = new RunnableProjectOrchestrator(); GlobalRunSpec configRunSpec = new GlobalRunSpec(new FileSource(), tmplt.ConfigFile.Parent, parameters, tmplt.Config.Config, tmplt.Config.Special); IOperationProvider[] providers = configRunSpec.Operations.ToArray(); foreach (KeyValuePair <IPathMatcher, IRunSpec> special in configRunSpec.Special) { if (special.Key.IsMatch(".netnew.json")) { providers = special.Value.GetOperations(providers).ToArray(); break; } } IRunnableProjectConfig m = tmplt.Config.ReprocessWithParameters(parameters, configRunSpec.RootVariableCollection, tmplt.ConfigFile, providers); foreach (FileSource source in m.Sources) { GlobalRunSpec runSpec = new GlobalRunSpec(source, tmplt.ConfigFile.Parent, parameters, m.Config, m.Special); string target = Path.Combine(Directory.GetCurrentDirectory(), source.Target); o.Run(runSpec, tmplt.ConfigFile.Parent.GetDirectoryAtRelativePath(source.Source), target); } return(Task.FromResult(true)); }
public bool TryGetTemplateFromConfig(IFileSystemInfo config, out ITemplate template) { IFile file = config as IFile; if (file == null) { template = null; return(false); } try { JObject srcObject = ReadConfigModel(file); template = new RunnableProjectTemplate(srcObject, this, file, RunnableProjectConfigConverter.FromJObject(srcObject)); return(true); } catch { } template = null; return(false); }
/// <summary> /// Performs the dry-run of the template instantiation to evaluate the primary outputs, post actions to be applied and file changes to be made when executing the template with specified parameters. /// </summary> /// <param name="environmentSettings">environment settings</param> /// <param name="templateData">the template to be executed</param> /// <param name="parameters">the parameters to be used on template execution</param> /// <param name="componentManager">the instance of component manager</param> /// <param name="targetDirectory">the output path for the template</param> /// <returns>the primary outputs, post actions and file changes that will be made when executing the template with specified parameters.</returns> public ICreationEffects GetCreationEffects(IEngineEnvironmentSettings environmentSettings, ITemplate templateData, IParameterSet parameters, IComponentManager componentManager, string targetDirectory) { RunnableProjectTemplate template = (RunnableProjectTemplate)templateData; ProcessMacros(environmentSettings, componentManager, template.Config.OperationConfig, parameters); IVariableCollection variables = VariableCollection.SetupVariables(environmentSettings, parameters, template.Config.OperationConfig.VariableSetup); template.Config.Evaluate(parameters, variables, template.ConfigFile); IOrchestrator2 basicOrchestrator = new Core.Util.Orchestrator(); RunnableProjectOrchestrator orchestrator = new RunnableProjectOrchestrator(basicOrchestrator); GlobalRunSpec runSpec = new GlobalRunSpec(template.TemplateSourceRoot, componentManager, parameters, variables, template.Config.OperationConfig, template.Config.SpecialOperationConfig, template.Config.LocalizationOperations, template.Config.IgnoreFileNames); List <IFileChange2> changes = new List <IFileChange2>(); foreach (FileSourceMatchInfo source in template.Config.Sources) { runSpec.SetupFileSource(source); string target = Path.Combine(targetDirectory, source.Target); IReadOnlyList <IFileChange2> fileChanges = orchestrator.GetFileChanges(runSpec, template.TemplateSourceRoot.DirectoryInfo(source.Source), target); //source and target paths in the file changes are returned relative to source passed //GetCreationEffects method should return the source paths relative to template source root (location of .template.config folder) and target paths relative to output path and not relative to certain source //add source and target used to file changes to be returned as the result changes.AddRange( fileChanges.Select( fileChange => new FileChange( Path.Combine(source.Source, fileChange.SourceRelativePath), Path.Combine(source.Target, fileChange.TargetRelativePath), fileChange.ChangeKind, fileChange.Contents))); } return(new CreationEffects2 { FileChanges = changes, CreationResult = GetCreationResult(environmentSettings, template, variables) }); }
private IEnumerable <ITemplate> GetTemplatesFromDir(IConfiguredTemplateSource source, ITemplateSourceFolder folder) { foreach (ITemplateSourceEntry entry in folder.Children) { if (entry.Kind == TemplateSourceEntryKind.File && entry.Name.Equals(".netnew.json", StringComparison.OrdinalIgnoreCase)) { RunnableProjectTemplate tmp = null; try { ITemplateSourceFile file = (ITemplateSourceFile)entry; JObject srcObject = ReadConfigModel(file); tmp = new RunnableProjectTemplate(srcObject, this, source, file, srcObject.ToObject <IRunnableProjectConfig>(new JsonSerializer { Converters = { new RunnableProjectConfigConverter() } })); } catch { } if (tmp != null) { yield return(tmp); } } else if (entry.Kind == TemplateSourceEntryKind.Folder) { foreach (ITemplate template in GetTemplatesFromDir(source, (ITemplateSourceFolder)entry)) { yield return(template); } } } }
public Task <ICreationResult> CreateAsync(IEngineEnvironmentSettings environmentSettings, ITemplate templateData, IParameterSet parameters, IComponentManager componentManager, string targetDirectory) { RunnableProjectTemplate template = (RunnableProjectTemplate)templateData; ProcessMacros(environmentSettings, componentManager, template.Config.OperationConfig, parameters); IVariableCollection variables = VariableCollection.SetupVariables(environmentSettings, parameters, template.Config.OperationConfig.VariableSetup); template.Config.Evaluate(parameters, variables, template.ConfigFile); IOrchestrator basicOrchestrator = new Core.Util.Orchestrator(); RunnableProjectOrchestrator orchestrator = new RunnableProjectOrchestrator(basicOrchestrator); GlobalRunSpec runSpec = new GlobalRunSpec(template.TemplateSourceRoot, componentManager, parameters, variables, template.Config.OperationConfig, template.Config.SpecialOperationConfig, template.Config.LocalizationOperations, template.Config.IgnoreFileNames); foreach (FileSourceMatchInfo source in template.Config.Sources) { runSpec.SetupFileSource(source); string target = Path.Combine(targetDirectory, source.Target); orchestrator.Run(runSpec, template.TemplateSourceRoot.DirectoryInfo(source.Source), target); } return(Task.FromResult(GetCreationResult(environmentSettings, template, variables))); }
public IParameterSet GetParametersForTemplate(IEngineEnvironmentSettings environmentSettings, ITemplate template) { RunnableProjectTemplate tmplt = (RunnableProjectTemplate)template; return(new ParameterSet(tmplt.Config)); }
private static ICreationResult GetCreationResult(IEngineEnvironmentSettings environmentSettings, RunnableProjectTemplate template, IVariableCollection variables) { return(new CreationResult() { PostActions = PostAction.ListFromModel(environmentSettings, template.Config.PostActionModel, variables), PrimaryOutputs = CreationPath.ListFromModel(environmentSettings, template.Config.PrimaryOutputs, variables) }); }
public bool TryGetTemplateFromConfigInfo(IFileSystemInfo templateFileConfig, out ITemplate template, IFileSystemInfo localeFileConfig = null, IFile hostTemplateConfigFile = null, string baselineName = null) { IFile templateFile = templateFileConfig as IFile; if (templateFile == null) { template = null; return(false); } IFile localeFile = localeFileConfig as IFile; ITemplateEngineHost host = templateFileConfig.MountPoint.EnvironmentSettings.Host; try { JObject baseSrcObject = ReadJObjectFromIFile(templateFile); JObject srcObject = MergeAdditionalConfiguration(baseSrcObject, templateFileConfig); JObject localeSourceObject = null; if (localeFile != null) { localeSourceObject = ReadJObjectFromIFile(localeFile); } ISimpleConfigModifiers configModifiers = new SimpleConfigModifiers() { BaselineName = baselineName }; SimpleConfigModel templateModel = SimpleConfigModel.FromJObject(templateFile.MountPoint.EnvironmentSettings, srcObject, configModifiers, localeSourceObject); if (!PerformTemplateValidation(templateModel, templateFile, host)) { template = null; return(false); } if (!CheckGeneratorVersionRequiredByTemplate(templateModel.GeneratorVersions)) { // template isn't compatible with this generator version template = null; return(false); } RunnableProjectTemplate runnableProjectTemplate = new RunnableProjectTemplate(srcObject, this, templateFile, templateModel, null, hostTemplateConfigFile); if (!AreAllTemplatePathsValid(templateModel, runnableProjectTemplate)) { template = null; return(false); } // Record the timestamp of the template file so we // know to reload it if it changes if (templateFile.MountPoint.Info.MountPointFactoryId == FileSystemMountPointFactoryId && host.FileSystem is IFileLastWriteTimeSource timeSource) { var physicalPath = Path.Combine(templateFile.MountPoint.Info.Place, templateFile.FullPath.TrimStart('/')); runnableProjectTemplate.ConfigTimestampUtc = timeSource.GetLastWriteTimeUtc(physicalPath); } template = runnableProjectTemplate; return(true); } catch (Exception ex) { host.LogMessage($"Error reading template from file: {templateFile.FullPath} | Error = {ex.Message}"); } template = null; return(false); }
// TODO: localize the diagnostic strings // checks that all the template sources are under the template root, and they exist. internal bool AreAllTemplatePathsValid(IRunnableProjectConfig templateConfig, RunnableProjectTemplate runnableTemplate) { ITemplateEngineHost host = runnableTemplate.Source.EnvironmentSettings.Host; if (runnableTemplate.TemplateSourceRoot == null) { host.LogDiagnosticMessage(string.Empty, "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateRootOutsideInstallSource, runnableTemplate.Name), "Authoring"); return(false); } // check if any sources get out of the mount point bool allSourcesValid = true; foreach (FileSourceMatchInfo source in templateConfig.Sources) { try { IFile file = runnableTemplate.TemplateSourceRoot.FileInfo(source.Source); if (file?.Exists ?? false) { allSourcesValid = false; host.LogDiagnosticMessage(string.Empty, "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateNameDisplay, runnableTemplate.Name), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateSourceRoot, runnableTemplate.TemplateSourceRoot.FullPath), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_SourceMustBeDirectory, source.Source), "Authoring"); } else { IDirectory sourceRoot = runnableTemplate.TemplateSourceRoot.DirectoryInfo(source.Source); if (!(sourceRoot?.Exists ?? false)) { // non-existant directory allSourcesValid = false; host.LogDiagnosticMessage(string.Empty, "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateNameDisplay, runnableTemplate.Name), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateSourceRoot, runnableTemplate.TemplateSourceRoot.FullPath), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_SourceDoesNotExist, source.Source), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_SourceIsOutsideInstallSource, sourceRoot.FullPath), "Authoring"); } } } catch { // outside the mount point root // TODO: after the null ref exception in DirectoryInfo is fixed, change how this check works. allSourcesValid = false; host.LogDiagnosticMessage(string.Empty, "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateNameDisplay, runnableTemplate.Name), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateSourceRoot, runnableTemplate.TemplateSourceRoot.FullPath), "Authoring"); host.LogDiagnosticMessage(string.Format(LocalizableStrings.Authoring_TemplateRootOutsideInstallSource, source.Source), "Authoring"); } } return(allSourcesValid); }
public IParameterSet GetParametersForTemplate(ITemplate template) { RunnableProjectTemplate tmplt = (RunnableProjectTemplate)template; return(new ParameterSet(tmplt.Config)); }