refactor: dynamically get best version for intermediary mappings

This commit is contained in:
Sefa Eyeoglu 2022-02-20 20:22:12 +01:00
parent 9eb9ddc668
commit 9349232bd4
No known key found for this signature in database
GPG Key ID: C10411294912A422
2 changed files with 33 additions and 20 deletions

View File

@ -2,7 +2,6 @@
#include "PackProfile_p.h"
#include "PackProfile.h"
#include "Component.h"
#include "meta/Index.h"
#include "meta/VersionList.h"
#include "meta/Version.h"
@ -495,6 +494,31 @@ static bool getTrivialComponentChanges(const ComponentIndex & index, const Requi
return succeeded;
}
QString ComponentUpdateTask::findBestComponentVersion(const ComponentPtr component)
{
auto & components = d->m_list->d->components;
auto versions = component->getVersionList();
versions->load(d->netmode);
for (auto & version : versions->versions()) {
if (version->isRecommended()) { // only look at recommended versions
bool requirementsMet = true;
for (auto req : version->requires()) {
auto requirementMet = std::any_of(components.begin(), components.end(), [&req](ComponentPtr & cmp){
return cmp->getID() == req.uid && cmp->getVersion() == req.equalsVersion;
});
if (!requirementMet) {
requirementsMet = false;
}
}
if (requirementsMet) // return first recommended version that meets all requirements
return version->version();
}
}
return nullptr;
}
// FIXME, TODO: decouple dependency resolution from loading
// FIXME: This works directly with the PackProfile internals. It shouldn't! It needs richer data types than PackProfile uses.
// FIXME: throw all this away and use a graph
@ -591,27 +615,14 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly)
{
component->m_version = "3.1.2";
}
else if (add.uid == "net.fabricmc.intermediary")
{
auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){
return cmp->getID() == "net.minecraft";
});
if(minecraft != components.end()) {
component->m_version = (*minecraft)->getVersion();
}
}
else if (add.uid == "org.quiltmc.quilt-mappings")
{
auto minecraft = std::find_if(components.begin(), components.end(), [](ComponentPtr & cmp){
return cmp->getID() == "net.minecraft";
});
if(minecraft != components.end()) {
component->m_version = (*minecraft)->getVersion() + "+build.1";
}
}
}
// HACK HACK HACK HACK FIXME: this is a placeholder for deciding what version to use. For now, it is hardcoded.
// ############################################################################################################
// below is not ugly anymore
else if (add.uid == "net.fabricmc.intermediary" || add.uid == "org.quiltmc.quilt-mappings")
{
component->m_version = findBestComponentVersion(component);
}
}
}
component->m_dependencyOnly = true;
// FIXME: this should not work directly with the component list

View File

@ -2,6 +2,7 @@
#include "tasks/Task.h"
#include "net/Mode.h"
#include "Component.h"
#include <memory>
class PackProfile;
@ -26,6 +27,7 @@ protected:
private:
void loadComponents();
QString findBestComponentVersion(ComponentPtr component);
void resolveDependencies(bool checkOnly);
void remoteLoadSucceeded(size_t index);