Exemplo n.º 1
0
        internal void BuildAll()
        {
            var modList = new List <LocalMod>();

            foreach (var modFolder in FindModSources())
            {
                modList.Add(ReadBuildInfo(modFolder));
            }

            //figure out which of the installed mods are required for building
            var installedMods = ModOrganizer.FindMods().Where(mod => !modList.Exists(m => m.Name == mod.Name)).ToList();

            var requiredFromInstall = new HashSet <LocalMod>();

            void Require(LocalMod mod, bool includeWeak)
            {
                foreach (var dep in mod.properties.RefNames(includeWeak))
                {
                    var depMod = installedMods.SingleOrDefault(m => m.Name == dep);
                    if (depMod != null && requiredFromInstall.Add(depMod))
                    {
                        Require(depMod, false);
                    }
                }
            }

            foreach (var mod in modList)
            {
                Require(mod, true);
            }

            modList.AddRange(requiredFromInstall);

            //sort and version check
            List <BuildingMod> modsToBuild;

            try {
                ModOrganizer.EnsureDependenciesExist(modList, true);
                ModOrganizer.EnsureTargetVersionsMet(modList);
                var sortedModList = ModOrganizer.Sort(modList);
                modsToBuild = sortedModList.OfType <BuildingMod>().ToList();
            }
            catch (ModSortingException e) {
                throw new BuildException(e.Message);
            }

            //build
            int num = 0;

            foreach (var mod in modsToBuild)
            {
                status.SetProgress(num++, modsToBuild.Count);
                Build(mod);
            }
        }
Exemplo n.º 2
0
        public void TestVersionRequirements()
        {
            //test version on missing mod
            var list1 = new List <LocalMod> {
                Make("A", refs: new[] { "[email protected]" })
            };

            ModOrganizer.EnsureTargetVersionsMet(list1);

            //test passed version check
            var list2 = new List <LocalMod> {
                Make("A", refs: new[] { "[email protected]" }),
                Make("B", version: "1.2")
            };

            ModOrganizer.EnsureTargetVersionsMet(list2);

            //test failed version check
            var list3 = new List <LocalMod> {
                Make("A", refs: new[] { "[email protected]" }),
                Make("B")
            };

            AssertModException(
                () => ModOrganizer.EnsureTargetVersionsMet(list3),
                new[] { "A" },
                "A requires version 1.2+ of B but version 1.0.0.0 is installed");

            //test one pass, two fail version check
            var list4 = new List <LocalMod> {
                Make("A"),
                Make("B", refs: new[] { "[email protected]" }),
                Make("C", refs: new[] { "[email protected]" }),
                Make("D", refs: new[] { "[email protected]" })
            };

            AssertModException(
                () => ModOrganizer.EnsureTargetVersionsMet(list4),
                new[] { "C", "D" },
                "C requires version 1.1+ of A but version 1.0.0.0 is installed\r\n" +
                "D requires version 1.0.0.1+ of A but version 1.0.0.0 is installed");

            //test weak version check (missing)
            var list5 = new List <LocalMod> {
                Make("A", weakRefs: new[] { "[email protected]" })
            };

            ModOrganizer.EnsureDependenciesExist(list5, false);
            ModOrganizer.EnsureTargetVersionsMet(list5);

            //test weak version check (too low)
            var list6 = new List <LocalMod> {
                Make("A", weakRefs: new[] { "[email protected]" }),
                Make("B")
            };

            AssertModException(
                () => ModOrganizer.EnsureTargetVersionsMet(list6),
                new[] { "A" },
                "A requires version 1.1+ of B but version 1.0.0.0 is installed");
        }
Exemplo n.º 3
0
        public void TestDependenciesExist()
        {
            //test A -> B
            var list1 = new List <LocalMod> {
                Make("A", refs: new[] { "B" }),
                Make("B"),
            };

            ModOrganizer.EnsureDependenciesExist(list1, false);

            //test A -> B (missing)
            var list2 = new List <LocalMod> {
                Make("A", refs: new[] { "B" })
            };

            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list2, false),
                new[] { "A" },
                "Missing mod: B required by A");

            //test multi reference
            var list3 = new List <LocalMod> {
                Make("A", refs: new[] { "B" }),
                Make("B"),
                Make("C", refs: new[] { "A" })
            };

            ModOrganizer.EnsureDependenciesExist(list3, false);

            //test one missing reference
            var list4 = new List <LocalMod> {
                Make("A", refs: new[] { "B" }),
                Make("B", refs: new[] { "C" })
            };

            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list4, false),
                new[] { "B" },
                "Missing mod: C required by B");

            //test weak reference (missing)
            var list5 = new List <LocalMod> {
                Make("A", weakRefs: new[] { "B" })
            };

            ModOrganizer.EnsureDependenciesExist(list5, false);
            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list5, true),
                new[] { "A" },
                "Missing mod: B required by A");

            //test weak reference (found)
            var list6 = new List <LocalMod> {
                Make("A", weakRefs: new[] { "B" }),
                Make("B")
            };

            ModOrganizer.EnsureDependenciesExist(list6, true);

            //test strong (found) and weak (missing)
            var list7 = new List <LocalMod> {
                Make("A", refs: new[] { "B" }),
                Make("B", weakRefs: new[] { "C" })
            };

            ModOrganizer.EnsureDependenciesExist(list7, false);
            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list7, true),
                new[] { "B" },
                "Missing mod: C required by B");

            //multi test case (missing)
            var list8 = new List <LocalMod> {
                Make("A", refs: new[] { "X" }),
                Make("B", refs: new[] { "Y" }),
                Make("C", refs: new[] { "D" }),
                Make("D", weakRefs: new[] { "E" }),
                Make("E", weakRefs: new[] { "Z" }),
                Make("F", weakRefs: new[] { "Z" })
            };

            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list8, false),
                new[] { "A", "B" },
                "Missing mod: X required by A\r\n" +
                "Missing mod: Y required by B");
            AssertModException(
                () => ModOrganizer.EnsureDependenciesExist(list8, true),
                new[] { "A", "B", "E", "F" },
                "Missing mod: X required by A\r\n" +
                "Missing mod: Y required by B\r\n" +
                "Missing mod: Z required by E\r\n" +
                "Missing mod: Z required by F");

            //multi test case (found)
            var list9 = new List <LocalMod> {
                Make("A", refs: new[] { "C" }),
                Make("B", refs: new[] { "C" }),
                Make("C", refs: new[] { "D" }),
                Make("D", weakRefs: new[] { "E" }),
                Make("E", weakRefs: new[] { "F" }),
                Make("F")
            };

            ModOrganizer.EnsureDependenciesExist(list9, false);
            ModOrganizer.EnsureDependenciesExist(list9, true);
        }
Exemplo n.º 4
0
        internal bool BuildAll(string[] modFolders)
        {
            var modList = new List <LocalMod>();

            //read mod sources folder
            foreach (var modFolder in modFolders)
            {
                var mod = ReadProperties(modFolder);
                if (mod == null)
                {
                    return(false);
                }

                modList.Add(mod);
            }

            //figure out which of the installed mods are required for building
            var installedMods = ModOrganizer.FindMods().Where(mod => !modList.Exists(m => m.Name == mod.Name)).ToList();

            var requiredFromInstall = new HashSet <LocalMod>();

            void Require(LocalMod mod)
            {
                foreach (var dep in mod.properties.RefNames(true))
                {
                    var depMod = installedMods.SingleOrDefault(m => m.Name == dep);
                    if (depMod != null && requiredFromInstall.Add(depMod))
                    {
                        Require(depMod);
                    }
                }
            }

            foreach (var mod in modList)
            {
                Require(mod);
            }

            modList.AddRange(requiredFromInstall);

            //sort and version check
            List <BuildingMod> modsToBuild;

            try
            {
                ModOrganizer.EnsureDependenciesExist(modList, true);
                ModOrganizer.EnsureTargetVersionsMet(modList);
                var sortedModList = ModOrganizer.Sort(modList);
                modsToBuild = sortedModList.OfType <BuildingMod>().ToList();
            }
            catch (ModSortingException e)
            {
                status.LogError(null, e.Message);
                return(false);
            }

            //build
            int num = 0;

            foreach (var mod in modsToBuild)
            {
                status.SetProgress(num++, modsToBuild.Count);
                if (!Build(mod))
                {
                    return(false);
                }
            }

            return(true);
        }