public void TestRelaxNesting(bool forParallel) { using (var env = new TestEnvironment()) { env.CreateRepo("A", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep> { new Dep("B"), new Dep("C", null, "client") }) } }); env.CreateRepo("B", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep> { new Dep("C") }) } }); env.CreateRepo("C", new Dictionary <string, DepsData> { { "full-build > client *default", new DepsData(null, new List <Dep>()) }, { "client", new DepsData(null, new List <Dep>()) } }); Helper.SetWorkspace(env.RemoteWorkspace); Directory.CreateDirectory(Path.Combine(env.RemoteWorkspace, ".cement")); var modulesOrder = new BuildPreparer(Log).GetModulesOrder("A", null); Assert.IsFalse(modulesOrder.BuildOrder.Contains(new Dep("C/client"))); Assert.IsTrue(modulesOrder.BuildOrder.Contains(new Dep("C", null, "full-build"))); Assert.IsTrue(modulesOrder.BuildOrder.Contains(new Dep("A", null, "full-build"))); Assert.IsTrue(modulesOrder.BuildOrder.Contains(new Dep("B", null, "full-build"))); Assert.AreEqual(3, modulesOrder.BuildOrder.Count); } }
public void TestTopSortNoCycle() { var graph = new Dictionary <Dep, List <Dep> > { { new Dep("A/full-build"), new List <Dep> { new Dep("B/full-build"), new Dep("C/client") } }, { new Dep("B/full-build"), new List <Dep> { new Dep("D/full-build"), new Dep("E/full-build") } }, { new Dep("C/full-build"), new List <Dep> { new Dep("D/full-build") } }, { new Dep("C/client"), new List <Dep> { new Dep("D/client") } }, { new Dep("D/full-build"), new List <Dep> { new Dep("E/full-build") } }, { new Dep("D/client"), new List <Dep>() }, { new Dep("E/full-build"), new List <Dep>() } }; Assert.AreEqual(new[] { new Dep("E/full-build"), new Dep("D/full-build"), new Dep("B/full-build"), new Dep("D/client"), new Dep("C/client"), new Dep("A/full-build") }, BuildPreparer.GetTopologicallySortedGraph(graph, "A", "full-build").ToArray()); }
public void TestNestingNeedBuildBoth(bool forParallel) { using (var env = new TestEnvironment()) { env.CreateRepo("A", new Dictionary <string, DepsData> { { "client", new DepsData(null, new List <Dep>()) }, { "full-build > client *default", new DepsData(null, new List <Dep> { new Dep("X") }) } }); env.CreateRepo("X", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("A", null, "client") }) } }); Helper.SetWorkspace(env.RemoteWorkspace); Directory.CreateDirectory(Path.Combine(env.RemoteWorkspace, ".cement")); var modulesOrder = new BuildPreparer(Log).GetModulesOrder("A", null); CollectionAssert.AreEqual(new List <Dep> { new Dep("A", null, "client"), new Dep("X", null, "full-build"), new Dep("A", null, "full-build") }, modulesOrder.BuildOrder); } }
public void TestNestingLotChildren(bool forParallel) { using (var env = new TestEnvironment()) { env.CreateRepo("A", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("C1"), new Dep("C2"), new Dep("C3"), new Dep("P1") }) } }); env.CreateRepo("C1", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("X/child1") }) } }); env.CreateRepo("C2", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("X/child2") }) } }); env.CreateRepo("C3", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("X/child3") }) } }); env.CreateRepo("P1", new Dictionary <string, DepsData> { { "full-build", new DepsData(null, new List <Dep> { new Dep("X/parent1") }) } }); env.CreateRepo("X", new Dictionary <string, DepsData> { { "child1", new DepsData(null, new List <Dep>()) }, { "child2 > child1", new DepsData(null, new List <Dep>()) }, { "child3 > child1", new DepsData(null, new List <Dep>()) }, { "parent1 > child1, child2", new DepsData(null, new List <Dep>()) }, { "parent2 > parent1, child3", new DepsData(null, new List <Dep>()) } }); Helper.SetWorkspace(env.RemoteWorkspace); Directory.CreateDirectory(Path.Combine(env.RemoteWorkspace, ".cement")); var modulesOrder = new BuildPreparer(Log).GetModulesOrder("A", null); var xDeps = modulesOrder.BuildOrder.Where(d => d.Name == "X").ToList(); Assert.IsTrue(xDeps.Any(d => d.Name == "X" && d.Configuration == "parent1")); Assert.IsTrue(xDeps.Any(d => d.Name == "X" && d.Configuration == "child3")); } }
private List <string> GetAllInstallFilesFromTree() { if (allInstallFilesFromTree != null) { return(allInstallFilesFromTree); } var deps = BuildPreparer.BuildConfigsGraph(rootModuleName, "full-build"); var usedModules = deps.Select(dep => dep.Key.Name).Distinct().ToList(); allInstallFilesFromTree = usedModules.SelectMany(GetAllInstallFiles).ToList(); return(allInstallFilesFromTree); }
protected override int Execute() { var cwd = Directory.GetCurrentDirectory(); var moduleName = Path.GetFileName(cwd); configuration = configuration ?? "full-build"; if (!new ConfigurationParser(new FileInfo(cwd)).ConfigurationExists(configuration)) { ConsoleWriter.Shared.WriteError($"Configuration '{configuration}' was not found in {moduleName}."); return(-1); } var cleanerLogger = LogManager.GetLogger <Cleaner>(); var shellRunner = new ShellRunner(LogManager.GetLogger <ShellRunner>()); var consoleWriter = ConsoleWriter.Shared; var cleaner = new Cleaner(cleanerLogger, shellRunner, consoleWriter); var buildYamlScriptsMaker = new BuildYamlScriptsMaker(); var builder = new ModuleBuilder(Log, buildSettings, buildYamlScriptsMaker); var builderInitTask = Task.Run(() => builder.Init()); var modulesOrder = new BuildPreparer(Log).GetModulesOrder(moduleName, configuration); var builtStorage = BuildInfoStorage.Deserialize(); builtStorage.RemoveBuildInfo(moduleName); builderInitTask.Wait(); var module = new Dep(moduleName, null, configuration); if (FeatureFlags.CleanBeforeBuild || buildSettings.CleanBeforeBuild) { if (cleaner.IsNetStandard(module)) { cleaner.Clean(module); } } BuildDepsCommand.TryNugetRestore(new List <Dep> { module }, builder); if (!builder.Build(module)) { builtStorage.Save(); return(-1); } builtStorage.AddBuiltModule(module, modulesOrder.CurrentCommitHashes); builtStorage.Save(); return(0); }
protected override int Execute() { var cwd = Directory.GetCurrentDirectory(); var moduleName = Path.GetFileName(cwd); configuration = string.IsNullOrEmpty(configuration) ? "full-build" : configuration; var cleanerLogger = LogManager.GetLogger <Cleaner>(); var shellRunner = new ShellRunner(LogManager.GetLogger <ShellRunner>()); var consoleWriter = ConsoleWriter.Shared; var cleaner = new Cleaner(cleanerLogger, shellRunner, consoleWriter); var buildYamlScriptsMaker = new BuildYamlScriptsMaker(); var builder = new ModuleBuilder(Log, buildSettings, buildYamlScriptsMaker); var builderInitTask = Task.Run(() => builder.Init()); var modulesOrder = new BuildPreparer(Log).GetModulesOrder(moduleName, configuration ?? "full-build"); var modulesToBuild = modulesOrder.UpdatedModules; if (rebuild) { modulesToBuild = modulesOrder.BuildOrder.ToList(); } if (modulesToBuild.Count > 0 && modulesToBuild[modulesToBuild.Count - 1].Name == moduleName) { modulesToBuild.RemoveAt(modulesToBuild.Count - 1); //remove root } var builtStorage = BuildInfoStorage.Deserialize(); foreach (var dep in modulesToBuild) { builtStorage.RemoveBuildInfo(dep.Name); } builderInitTask.Wait(); if (FeatureFlags.CleanBeforeBuild || buildSettings.CleanBeforeBuild) { TryCleanModules(modulesToBuild, cleaner); } TryNugetRestore(modulesToBuild, builder); var isSuccessful = parallel ? BuildDepsParallel(modulesOrder, builtStorage, modulesToBuild, builder) : BuildDepsSequential(modulesOrder, builtStorage, modulesToBuild, builder); return(isSuccessful ? 0 : -1); }
public void TestBuildOrderCycle() { var graph = new Dictionary <Dep, List <Dep> > { { new Dep("A/full-build"), new List <Dep> { new Dep("B/full-build") } }, { new Dep("B/full-build"), new List <Dep> { new Dep("C/full-build") } }, { new Dep("C/full-build"), new List <Dep> { new Dep("D/full-build") } }, { new Dep("D/full-build"), new List <Dep> { new Dep("A/full-build") } } }; Assert.Throws <CementException>(() => BuildPreparer.GetTopologicallySortedGraph(graph, "A", "full-build")); }
public void TestConfigGraph() { using (var env = new TestEnvironment()) { env.CreateRepo("A", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep> { new Dep("B"), new Dep("C", null, "client") }) } }); env.CreateRepo("B", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep> { new Dep("D") }) } }); env.CreateRepo("C", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep> { new Dep("D") }) }, { "client", new DepsData(null, new List <Dep> { new Dep("D", null, "client") }) } }); env.CreateRepo("D", new Dictionary <string, DepsData> { { "full-build *default", new DepsData(null, new List <Dep>()) }, { "client", new DepsData(null, new List <Dep>()) } }); Helper.SetWorkspace(env.RemoteWorkspace); var result = BuildPreparer.BuildConfigsGraph("A", null); Assert.AreEqual(new[] { new Dep("B", null, "full-build"), new Dep("C/client") }, result[new Dep("A", null, "full-build")].ToArray()); Assert.AreEqual(new[] { new Dep("D", null, "full-build") }, result[new Dep("B", null, "full-build")].ToArray()); Assert.AreEqual(new Dep[] { }, result[new Dep("D", null, "full-build")].ToArray()); Assert.AreEqual(new[] { new Dep("D/client") }, result[new Dep("C/client")].ToArray()); Assert.AreEqual(new string[] { }, result[new Dep("D/client")].ToArray()); } }
protected override int Execute() { var cwd = Directory.GetCurrentDirectory(); var moduleName = Path.GetFileName(cwd); configuration = string.IsNullOrEmpty(configuration) ? "full-build" : configuration; var builder = new ModuleBuilder(Log, buildSettings); var builderInitTask = Task.Run(() => builder.Init()); var modulesOrder = new BuildPreparer(Log).GetModulesOrder(moduleName, configuration ?? "full-build"); var modulesToBuild = modulesOrder.UpdatedModules; if (rebuild) { modulesToBuild = modulesOrder.BuildOrder.ToList(); } if (modulesToBuild.Count > 0 && modulesToBuild[modulesToBuild.Count - 1].Name == moduleName) { modulesToBuild.RemoveAt(modulesToBuild.Count - 1); //remove root } var builtStorage = BuiltInfoStorage.Deserialize(); foreach (var dep in modulesToBuild) { builtStorage.RemoveBuildInfo(dep.Name); } builderInitTask.Wait(); TryNugetRestore(modulesToBuild, builder); var isSuccessful = parallel ? BuildDepsParallel(modulesOrder, builtStorage, modulesToBuild, builder) : BuildDepsSequential(modulesOrder, builtStorage, modulesToBuild, builder); return(isSuccessful ? 0 : -1); }
protected override int Execute() { var cwd = Directory.GetCurrentDirectory(); var moduleName = Path.GetFileName(cwd); configuration = configuration ?? "full-build"; if (!new ConfigurationParser(new FileInfo(cwd)).ConfigurationExists(configuration)) { ConsoleWriter.WriteError($"Configuration '{configuration}' was not found in {moduleName}."); return(-1); } var builder = new ModuleBuilder(Log, buildSettings); var builderInitTask = Task.Run(() => builder.Init()); var modulesOrder = new BuildPreparer(Log).GetModulesOrder(moduleName, configuration); var builtStorage = BuiltInfoStorage.Deserialize(); builtStorage.RemoveBuildInfo(moduleName); builderInitTask.Wait(); var module = new Dep(moduleName, null, configuration); BuildDeps.TryNugetRestore(new List <Dep> { module }, builder); if (!builder.Build(module)) { builtStorage.Save(); return(-1); } builtStorage.AddBuiltModule(module, modulesOrder.CurrentCommitHashes); builtStorage.Save(); return(0); }