feat: add metadata get/delete via mod id
This is, in many cases, more reliable than name comparisons, so it's useful specially in cases where a mod changes name between versions Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
9a07ede615
commit
91a5c4bdcb
@ -46,8 +46,12 @@ ModDownloadTask::ModDownloadTask(ModPlatform::IndexedPack mod, ModPlatform::Inde
|
|||||||
void ModDownloadTask::downloadSucceeded()
|
void ModDownloadTask::downloadSucceeded()
|
||||||
{
|
{
|
||||||
m_filesNetJob.reset();
|
m_filesNetJob.reset();
|
||||||
if (!std::get<0>(to_delete).isEmpty())
|
auto name = std::get<0>(to_delete);
|
||||||
mods->uninstallMod(std::get<1>(to_delete), true);
|
if (!name.isEmpty()) {
|
||||||
|
// If they have the same name, we keep the metadata.
|
||||||
|
// This is a workaround for mods that change names between versions ;c
|
||||||
|
mods->uninstallMod(std::get<1>(to_delete), name == m_mod.name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModDownloadTask::downloadFailed(QString reason)
|
void ModDownloadTask::downloadFailed(QString reason)
|
||||||
|
@ -52,8 +52,18 @@ class Metadata {
|
|||||||
Packwiz::V1::deleteModIndex(index_dir, mod_name);
|
Packwiz::V1::deleteModIndex(index_dir, mod_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void remove(QDir& index_dir, QVariant& mod_id)
|
||||||
|
{
|
||||||
|
Packwiz::V1::deleteModIndex(index_dir, mod_id);
|
||||||
|
}
|
||||||
|
|
||||||
static auto get(QDir& index_dir, QString& mod_name) -> ModStruct
|
static auto get(QDir& index_dir, QString& mod_name) -> ModStruct
|
||||||
{
|
{
|
||||||
return Packwiz::V1::getIndexForMod(index_dir, mod_name);
|
return Packwiz::V1::getIndexForMod(index_dir, mod_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto get(QDir& index_dir, QVariant& mod_id) -> ModStruct
|
||||||
|
{
|
||||||
|
return Packwiz::V1::getIndexForMod(index_dir, mod_id);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -164,12 +164,8 @@ void Mod::setMetadata(Metadata::ModStruct* metadata)
|
|||||||
|
|
||||||
auto Mod::destroy(QDir& index_dir, bool preserve_metadata) -> bool
|
auto Mod::destroy(QDir& index_dir, bool preserve_metadata) -> bool
|
||||||
{
|
{
|
||||||
auto n = name();
|
if (!preserve_metadata && status() != ModStatus::NoMetadata)
|
||||||
// FIXME: This can fail to remove the metadata if the
|
Metadata::remove(index_dir, metadata()->mod_id());
|
||||||
// "ModMetadataDisabled" setting is on, since there could
|
|
||||||
// be a name mismatch!
|
|
||||||
if(!preserve_metadata)
|
|
||||||
Metadata::remove(index_dir, n);
|
|
||||||
|
|
||||||
m_type = MOD_UNKNOWN;
|
m_type = MOD_UNKNOWN;
|
||||||
return FS::deletePath(m_file.filePath());
|
return FS::deletePath(m_file.filePath());
|
||||||
|
@ -44,7 +44,7 @@ void LocalModUpdateTask::executeTask()
|
|||||||
{
|
{
|
||||||
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
|
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
|
||||||
|
|
||||||
auto old_metadata = Metadata::get(m_index_dir, m_mod.name);
|
auto old_metadata = Metadata::get(m_index_dir, m_mod.addonId);
|
||||||
if (old_metadata.isValid()) {
|
if (old_metadata.isValid()) {
|
||||||
emit hasOldMod(old_metadata.name, old_metadata.filename);
|
emit hasOldMod(old_metadata.name, old_metadata.filename);
|
||||||
}
|
}
|
||||||
|
@ -144,6 +144,9 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod)
|
|||||||
|
|
||||||
QFile index_file(index_dir.absoluteFilePath(real_fname));
|
QFile index_file(index_dir.absoluteFilePath(real_fname));
|
||||||
|
|
||||||
|
if (real_fname != normalized_fname)
|
||||||
|
index_file.rename(normalized_fname);
|
||||||
|
|
||||||
// There's already data on there!
|
// There's already data on there!
|
||||||
// TODO: We should do more stuff here, as the user is likely trying to
|
// TODO: We should do more stuff here, as the user is likely trying to
|
||||||
// override a file. In this case, check versions and ask the user what
|
// override a file. In this case, check versions and ask the user what
|
||||||
@ -196,16 +199,28 @@ void V1::deleteModIndex(QDir& index_dir, QString& mod_name)
|
|||||||
|
|
||||||
QFile index_file(index_dir.absoluteFilePath(real_fname));
|
QFile index_file(index_dir.absoluteFilePath(real_fname));
|
||||||
|
|
||||||
if(!index_file.exists()){
|
if (!index_file.exists()) {
|
||||||
qWarning() << QString("Tried to delete non-existent mod metadata for %1!").arg(mod_name);
|
qWarning() << QString("Tried to delete non-existent mod metadata for %1!").arg(mod_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!index_file.remove()){
|
if (!index_file.remove()) {
|
||||||
qWarning() << QString("Failed to remove metadata for mod %1!").arg(mod_name);
|
qWarning() << QString("Failed to remove metadata for mod %1!").arg(mod_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V1::deleteModIndex(QDir& index_dir, QVariant& mod_id)
|
||||||
|
{
|
||||||
|
for (auto& file_name : index_dir.entryList(QDir::Filter::Files)) {
|
||||||
|
auto mod = getIndexForMod(index_dir, file_name);
|
||||||
|
|
||||||
|
if (mod.mod_id() == mod_id) {
|
||||||
|
deleteModIndex(index_dir, mod.name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto V1::getIndexForMod(QDir& index_dir, QString& index_file_name) -> Mod
|
auto V1::getIndexForMod(QDir& index_dir, QString& index_file_name) -> Mod
|
||||||
{
|
{
|
||||||
Mod mod;
|
Mod mod;
|
||||||
@ -286,4 +301,16 @@ auto V1::getIndexForMod(QDir& index_dir, QString& index_file_name) -> Mod
|
|||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto V1::getIndexForMod(QDir& index_dir, QVariant& mod_id) -> Mod
|
||||||
|
{
|
||||||
|
for (auto& file_name : index_dir.entryList(QDir::Filter::Files)) {
|
||||||
|
auto mod = getIndexForMod(index_dir, file_name);
|
||||||
|
|
||||||
|
if (mod.mod_id() == mod_id)
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Packwiz
|
} // namespace Packwiz
|
||||||
|
@ -84,10 +84,18 @@ class V1 {
|
|||||||
/* Deletes the metadata for the mod with the given name. If the metadata doesn't exist, it does nothing. */
|
/* Deletes the metadata for the mod with the given name. If the metadata doesn't exist, it does nothing. */
|
||||||
static void deleteModIndex(QDir& index_dir, QString& mod_name);
|
static void deleteModIndex(QDir& index_dir, QString& mod_name);
|
||||||
|
|
||||||
|
/* Deletes the metadata for the mod with the given id. If the metadata doesn't exist, it does nothing. */
|
||||||
|
static void deleteModIndex(QDir& index_dir, QVariant& mod_id);
|
||||||
|
|
||||||
/* Gets the metadata for a mod with a particular name.
|
/* Gets the metadata for a mod with a particular name.
|
||||||
* If the mod doesn't have a metadata, it simply returns an empty Mod object.
|
* If the mod doesn't have a metadata, it simply returns an empty Mod object.
|
||||||
* */
|
* */
|
||||||
static auto getIndexForMod(QDir& index_dir, QString& index_file_name) -> Mod;
|
static auto getIndexForMod(QDir& index_dir, QString& index_file_name) -> Mod;
|
||||||
|
|
||||||
|
/* Gets the metadata for a mod with a particular id.
|
||||||
|
* If the mod doesn't have a metadata, it simply returns an empty Mod object.
|
||||||
|
* */
|
||||||
|
static auto getIndexForMod(QDir& index_dir, QVariant& mod_id) -> Mod;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Packwiz
|
} // namespace Packwiz
|
||||||
|
Loading…
Reference in New Issue
Block a user