Modrith api optional changelog (#5197)

This commit is contained in:
Alexandru Ionut Tripon 2026-03-17 08:50:37 +00:00 committed by GitHub
commit c7d43f1685
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 322 additions and 198 deletions

View file

@ -297,3 +297,46 @@ auto Resource::getOriginalFileName() const -> QString
fileName.chop(9);
return fileName;
}
QDebug operator<<(QDebug debug, ResourceType type)
{
switch (type) {
case ResourceType::ZIPFILE:
debug << "ZIPFILE";
break;
case ResourceType::SINGLEFILE:
debug << "SINGLEFILE";
break;
case ResourceType::FOLDER:
debug << "FOLDER";
break;
case ResourceType::LITEMOD:
debug << "LITEMOD";
break;
case ResourceType::UNKNOWN:
default:
debug << "UNKNOWN";
break;
};
return debug;
}
QDebug operator<<(QDebug debug, ResourceStatus status)
{
switch (status) {
case ResourceStatus::INSTALLED:
debug << "INSTALLED";
break;
case ResourceStatus::NOT_INSTALLED:
debug << "NOT_INSTALLED";
break;
case ResourceStatus::NO_METADATA:
debug << "NO_METADATA";
break;
case ResourceStatus::UNKNOWN:
default:
debug << "UNKNOWN";
break;
};
return debug;
}

View file

@ -53,6 +53,8 @@ enum class ResourceType {
LITEMOD, //!< The resource is a litemod
};
QDebug operator<<(QDebug debug, ResourceType type);
enum class ResourceStatus {
INSTALLED, // Both JAR and Metadata are present
NOT_INSTALLED, // Only the Metadata is present
@ -60,6 +62,8 @@ enum class ResourceStatus {
UNKNOWN, // Default status
};
QDebug operator<<(QDebug debug, ResourceStatus status);
enum class SortType {
NAME,
DATE,
@ -134,7 +138,7 @@ class Resource : public QObject {
* = 0: 'this' is equal to 'other'
* < 0: 'this' comes before 'other'
*/
virtual int compare(Resource const& other, SortType type = SortType::NAME) const;
virtual int compare(const Resource& other, SortType type = SortType::NAME) const;
/** Returns whether the given filter should filter out 'this' (false),
* or if such filter includes the Resource (true).

View file

@ -74,13 +74,13 @@ void GetModDependenciesTask::prepare()
ModPlatform::Dependency GetModDependenciesTask::getOverride(const ModPlatform::Dependency& dep,
const ModPlatform::ResourceProvider providerName)
{
if (auto isQuilt = m_loaderType & ModPlatform::Quilt; isQuilt || m_loaderType & ModPlatform::Fabric) {
if (auto isQuilt = (m_loaderType & ModPlatform::Quilt) != 0U; isQuilt || (m_loaderType & ModPlatform::Fabric) != 0U) {
auto overide = ModPlatform::getOverrideDeps();
auto over = std::find_if(overide.cbegin(), overide.cend(), [dep, providerName, isQuilt](const auto& o) {
return o.provider == providerName && dep.addonId == (isQuilt ? o.fabric : o.quilt);
});
if (over != overide.cend()) {
return { isQuilt ? over->quilt : over->fabric, dep.type };
return { .addonId = isQuilt ? over->quilt : over->fabric, .type = dep.type, .version = "" };
}
}
return dep;
@ -91,40 +91,45 @@ QList<ModPlatform::Dependency> GetModDependenciesTask::getDependenciesForVersion
{
QList<ModPlatform::Dependency> c_dependencies;
for (auto ver_dep : version.dependencies) {
if (ver_dep.type != ModPlatform::DependencyType::REQUIRED)
if (ver_dep.type != ModPlatform::DependencyType::REQUIRED) {
continue;
}
ver_dep = getOverride(ver_dep, providerName);
auto isOnlyVersion = providerName == ModPlatform::ResourceProvider::MODRINTH && ver_dep.addonId.toString().isEmpty();
if (auto dep = std::find_if(c_dependencies.begin(), c_dependencies.end(),
[&ver_dep, isOnlyVersion](const ModPlatform::Dependency& i) {
return isOnlyVersion ? i.version == ver_dep.version : i.addonId == ver_dep.addonId;
});
dep != c_dependencies.end())
dep != c_dependencies.end()) {
continue; // check the current dependency list
}
if (auto dep = std::find_if(m_selected.begin(), m_selected.end(),
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<PackDependency> i) {
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<PackDependency>& i) {
return i->pack->provider == providerName && (isOnlyVersion ? i->version.version == ver_dep.version
: i->pack->addonId == ver_dep.addonId);
});
dep != m_selected.end())
dep != m_selected.end()) {
continue; // check the selected versions
}
if (auto dep = std::find_if(m_mods.begin(), m_mods.end(),
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<Metadata::ModStruct> i) {
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<Metadata::ModStruct>& i) {
return i->provider == providerName &&
(isOnlyVersion ? i->file_id == ver_dep.version : i->project_id == ver_dep.addonId);
});
dep != m_mods.end())
dep != m_mods.end()) {
continue; // check the existing mods
}
if (auto dep = std::find_if(m_pack_dependencies.begin(), m_pack_dependencies.end(),
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<PackDependency> i) {
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<PackDependency>& i) {
return i->pack->provider == providerName && (isOnlyVersion ? i->version.version == ver_dep.addonId
: i->pack->addonId == ver_dep.addonId);
});
dep != m_pack_dependencies.end()) // check loaded dependencies
dep != m_pack_dependencies.end()) { // check loaded dependencies
continue;
}
c_dependencies.append(ver_dep);
}
@ -180,9 +185,11 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
tasks->addTask(getProjectInfoTask(pDep));
}
ResourceAPI::DependencySearchArgs args = { dep, m_version, m_loaderType };
ResourceAPI::DependencySearchArgs args = {
.dependency = dep, .mcVersion = m_version, .loader = m_loaderType, .includeChangelog = true
};
ResourceAPI::Callback<ModPlatform::IndexedVersion> callbacks;
callbacks.on_fail = [](QString reason, int) {
callbacks.on_fail = [](const QString& reason, int) {
qCritical() << tr("A network error occurred. Could not load project dependencies:%1").arg(reason);
};
callbacks.on_succeed = [dep, provider, pDep, level, this](auto& pack) {
@ -191,10 +198,10 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
if (m_loaderType & ModPlatform::Quilt) { // falback for quilt
auto overide = ModPlatform::getOverrideDeps();
auto over = std::find_if(overide.cbegin(), overide.cend(),
[dep, provider](auto o) { return o.provider == provider && dep.addonId == o.quilt; });
[dep, provider](const auto& o) { return o.provider == provider && dep.addonId == o.quilt; });
if (over != overide.cend()) {
removePack(dep.addonId);
addTask(prepareDependencyTask({ over->fabric, dep.type }, provider, level));
addTask(prepareDependencyTask({ .addonId = over->fabric, .type = dep.type, .version = "" }, provider, level));
return;
}
}
@ -212,7 +219,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
}
if (dep.addonId.toString().isEmpty() && !pDep->version.addonId.toString().isEmpty()) {
pDep->pack->addonId = pDep->version.addonId;
auto dep_ = getOverride({ pDep->version.addonId, pDep->dependency.type }, provider);
auto dep_ = getOverride({ .addonId = pDep->version.addonId, .type = pDep->dependency.type, .version = "" }, provider);
if (dep_.addonId != pDep->version.addonId) {
removePack(pDep->version.addonId);
addTask(prepareDependencyTask(dep_, provider, level));
@ -224,7 +231,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
removePack(pDep->version.addonId);
return;
}
for (auto dep_ : getDependenciesForVersion(pDep->version, provider)) {
for (const auto& dep_ : getDependenciesForVersion(pDep->version, provider)) {
addTask(prepareDependencyTask(dep_, provider, level - 1));
}
};

View file

@ -23,6 +23,7 @@
#include <QVariant>
#include <functional>
#include <memory>
#include <utility>
#include "minecraft/mod/MetadataHandler.h"
#include "minecraft/mod/ModFolderModel.h"
@ -44,15 +45,11 @@ class GetModDependenciesTask : public SequentialTask {
ModPlatform::IndexedPack::Ptr pack;
ModPlatform::IndexedVersion version;
PackDependency() = default;
PackDependency(const ModPlatform::IndexedPack::Ptr p, const ModPlatform::IndexedVersion& v)
{
pack = p;
version = v;
}
PackDependency(ModPlatform::IndexedPack::Ptr p, ModPlatform::IndexedVersion v) : pack(std::move(p)), version(std::move(v)) {}
};
struct PackDependencyExtraInfo {
bool maybe_installed;
bool maybe_installed{};
QStringList required_by;
};
@ -62,12 +59,12 @@ class GetModDependenciesTask : public SequentialTask {
QHash<QString, PackDependencyExtraInfo> getExtraInfo();
private:
inline ResourceAPI* getAPI(ModPlatform::ResourceProvider provider)
ResourceAPI* getAPI(ModPlatform::ResourceProvider provider)
{
if (provider == ModPlatform::ResourceProvider::FLAME)
if (provider == ModPlatform::ResourceProvider::FLAME) {
return &m_flameAPI;
else
return &m_modrinthAPI;
}
return &m_modrinthAPI;
}
protected slots:

View file

@ -568,7 +568,7 @@ bool process(Mod& mod, ProcessingLevel level)
case ResourceType::LITEMOD:
return processLitemod(mod);
default:
qWarning() << "Invalid type for mod parse task!";
qWarning() << "Invalid type" << mod.type() << "for mod parse task!";
return false;
}
}