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); } }
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"); }
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); }
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); }