public void HarderStillPath() { Node <string> a = new Node <string>("A"); Node <string> b = new Node <string>("B"); Node <string> c = new Node <string>("C"); Node <string> d = new Node <string>("D"); Node <string> e = new Node <string>("E"); a.Dependencies.Add(b); a.Dependencies.Add(c); a.Dependencies.Add(d); a.Dependencies.Add(e); List <Node <string> > list = new List <Node <string> >(); list.Add(a); list.Add(b); list.Add(c); list.Add(d); list.Add(e); DepthFirstSearch <string> sort = new DepthFirstSearch <string>(list); Stack <Node <string> > results = sort.GetDependencyPath(a.Identity); foreach (Node <string> node in results) { Console.WriteLine(node.Identity); } Assert.AreEqual(results.Count, 5); }
public void MissingTarget() { Node <string> a = new Node <string>("A"); Node <string> b = new Node <string>("B"); Node <string> c = new Node <string>("C"); Node <string> d = new Node <string>("D"); Node <string> e = new Node <string>("E"); a.Dependencies.Add(b); a.Dependencies.Add(c); a.Dependencies.Add(d); a.Dependencies.Add(e); List <Node <string> > list = new List <Node <string> >(); list.Add(a); list.Add(b); list.Add(c); list.Add(d); list.Add(e); DepthFirstSearch <string> sort = new DepthFirstSearch <string>(list); Stack <Node <string> > results = sort.GetDependencyPath("F"); Assert.AreEqual(results.Count, 0); }
public void SimplePath() { Node <string> a = new Node <string>("A"); Node <string> b = new Node <string>("B"); Node <string> c = new Node <string>("C"); Node <string> d = new Node <string>("D"); a.Dependencies.Add(b); b.Dependencies.Add(c); c.Dependencies.Add(d); List <Node <string> > list = new List <Node <string> >(); list.Add(a); list.Add(b); list.Add(c); list.Add(d); DepthFirstSearch <string> sort = new DepthFirstSearch <string>(list); Stack <Node <string> > results = sort.GetDependencyPath(a.Identity); Assert.AreEqual(results.Count, 4); Assert.IsTrue(d.Identity.Equals(results.Pop().Identity)); Assert.IsTrue(c.Identity.Equals(results.Pop().Identity)); Assert.IsTrue(b.Identity.Equals(results.Pop().Identity)); Assert.IsTrue(a.Identity.Equals(results.Pop().Identity)); }
/// <summary> /// Renders the configuration specified. /// </summary> /// <returns></returns> public bool Render() { LogUtilities.LogSettings(config, log); nodeList = new List <Node <string> >(); Boolean returnCode = true; if (File.Exists(config.ConfigFile)) { log.LogMessage("Reading in configuration file..."); RenderConfig renderConfig = ReadConfigurationFile(); if (renderConfig != null) { //HACK We should be using a deep copy so that all this becomes "variableStack = dependencyStack.Clone();" //Get the list of nodes nodeList = GenerateNodeList(renderConfig, log); if (SearchForNodeByIdentity(nodeList, config.Configuration) == null) { throw new ApplicationException("Could not find Configuration : " + config.Configuration); } List <Node <string> > n2 = GenerateNodeList(renderConfig, log); //Generate the dependency path DepthFirstSearch <string> dfs = new DepthFirstSearch <string>(nodeList); DepthFirstSearch <string> dfs2 = new DepthFirstSearch <string>(n2); dependencyStack = dfs.GetDependencyPath(config.Configuration); //HACK Need to write a deep copy Queue Clone to get rid of this... variableStack = dfs2.GetDependencyPath(config.Configuration); } if (Directory.Exists(config.OutputDirectory)) { if (config.DeleteOutputDirectory) { log.LogMessage("Deleting and recreating output directory..."); Directory.Delete(config.OutputDirectory, true); Directory.CreateDirectory(config.OutputDirectory); } } else { log.LogMessage("Creating output directory..."); Directory.CreateDirectory(config.OutputDirectory); } //Create a queue of mods to run and a queue of EnvironmentVariables to implement //Variables have to be put in place before the mods... log.LogMessage("Building dependency queue..."); Queue <Configuration> configsToRun = CreateConfigProcessQueue(renderConfig, dependencyStack); //HACK This is ugly, needs a deep copy here.... Queue <Configuration> envQueue = CreateConfigProcessQueue(renderConfig, variableStack); while (envQueue.Count > 0) { Configuration varConfig = envQueue.Dequeue(); //First, we need to get all the Variables and create them. foreach (EnvironmentVariable variable in varConfig.EnvironmentVariables) { Environment.SetEnvironmentVariable(variable.variable, variable.Value); } } while (configsToRun.Count > 0) { Configuration currentConfig = configsToRun.Dequeue(); log.LogMessage(MessageImportance.High, "Running modification: " + currentConfig.Name); if (currentConfig.TargetFiles != null) { if (!currentConfig.Apply(config, log)) { log.LogError("Failed to apply configuration: " + currentConfig.Name); returnCode = false; } } } } else { log.LogError("Could not find configuration file: " + config.ConfigFile); returnCode = false; } //Let 'em know if (returnCode) { log.LogMessage(MessageImportance.High, "Configuration rendered!"); } else { log.LogError("Failed to render configuration."); } return(returnCode); }
/// <summary> /// Renders the configuration specified. /// </summary> /// <returns></returns> public bool Render() { LogUtilities.LogSettings(config,log); nodeList = new List<Node<string>>(); Boolean returnCode = true; if (File.Exists(config.ConfigFile)) { log.LogMessage("Reading in configuration file..."); RenderConfig renderConfig = ReadConfigurationFile(); if (renderConfig != null) { //HACK We should be using a deep copy so that all this becomes "variableStack = dependencyStack.Clone();" //Get the list of nodes nodeList = GenerateNodeList(renderConfig, log); if (SearchForNodeByIdentity(nodeList, config.Configuration) == null) { throw new ApplicationException("Could not find Configuration : " + config.Configuration); } List<Node<string>> n2 = GenerateNodeList(renderConfig, log); //Generate the dependency path DepthFirstSearch<string> dfs = new DepthFirstSearch<string>(nodeList); DepthFirstSearch<string> dfs2 = new DepthFirstSearch<string>(n2); dependencyStack = dfs.GetDependencyPath(config.Configuration); //HACK Need to write a deep copy Queue Clone to get rid of this... variableStack = dfs2.GetDependencyPath(config.Configuration); } if (Directory.Exists(config.OutputDirectory)) { if (config.DeleteOutputDirectory) { log.LogMessage("Deleting and recreating output directory..."); Directory.Delete(config.OutputDirectory, true); Directory.CreateDirectory(config.OutputDirectory); } } else { log.LogMessage("Creating output directory..."); Directory.CreateDirectory(config.OutputDirectory); } //Create a queue of mods to run and a queue of EnvironmentVariables to implement //Variables have to be put in place before the mods... log.LogMessage("Building dependency queue..."); Queue<Configuration> configsToRun = CreateConfigProcessQueue(renderConfig, dependencyStack); //HACK This is ugly, needs a deep copy here.... Queue<Configuration> envQueue = CreateConfigProcessQueue(renderConfig, variableStack); while (envQueue.Count > 0) { Configuration varConfig = envQueue.Dequeue(); //First, we need to get all the Variables and create them. foreach (EnvironmentVariable variable in varConfig.EnvironmentVariables) { Environment.SetEnvironmentVariable(variable.variable, variable.Value); } } while (configsToRun.Count > 0) { Configuration currentConfig = configsToRun.Dequeue(); log.LogMessage(MessageImportance.High, "Running modification: " + currentConfig.Name); if (currentConfig.TargetFiles != null) { if (!currentConfig.Apply(config, log)) { log.LogError("Failed to apply configuration: " + currentConfig.Name); returnCode = false; } } } } else { log.LogError("Could not find configuration file: " + config.ConfigFile); returnCode = false; } //Let 'em know if (returnCode) { log.LogMessage(MessageImportance.High, "Configuration rendered!"); } else { log.LogError("Failed to render configuration."); } return returnCode; }