コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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"));
            }
        }
コード例 #5
0
ファイル: RefFix.cs プロジェクト: Fr1z2r/cement
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
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);
        }
コード例 #8
0
        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"));
        }
コード例 #9
0
 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());
     }
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }