mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
+48
-12
@@ -472,12 +472,7 @@ namespace loot {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Calculating metadata difference for: " << name;
|
||||
Plugin p(*this);
|
||||
|
||||
p.Enabled(plugin.Enabled());
|
||||
if (priority != plugin.Priority()) {
|
||||
p.Priority(plugin.Priority());
|
||||
p.SetPriorityExplicit(plugin.IsPriorityExplicit());
|
||||
}
|
||||
else {
|
||||
if (priority == plugin.Priority()) {
|
||||
p.Priority(0);
|
||||
p.SetPriorityExplicit(false);
|
||||
}
|
||||
@@ -485,17 +480,17 @@ namespace loot {
|
||||
//Compare this plugin against the given plugin.
|
||||
set<File> files = plugin.LoadAfter();
|
||||
set<File> filesDiff;
|
||||
set_symmetric_difference(files.begin(), files.end(), loadAfter.begin(), loadAfter.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
set_symmetric_difference(loadAfter.begin(), loadAfter.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.LoadAfter(filesDiff);
|
||||
|
||||
filesDiff.clear();
|
||||
files = plugin.Reqs();
|
||||
set_symmetric_difference(files.begin(), files.end(), requirements.begin(), requirements.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
set_symmetric_difference(requirements.begin(), requirements.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.Reqs(filesDiff);
|
||||
|
||||
filesDiff.clear();
|
||||
files = plugin.Incs();
|
||||
set_symmetric_difference(files.begin(), files.end(), incompatibilities.begin(), incompatibilities.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
set_symmetric_difference(incompatibilities.begin(), incompatibilities.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.Incs(filesDiff);
|
||||
|
||||
list<Message> msgs1 = plugin.Messages();
|
||||
@@ -503,17 +498,58 @@ namespace loot {
|
||||
msgs1.sort();
|
||||
msgs2.sort();
|
||||
list<Message> mDiff;
|
||||
set_symmetric_difference(msgs1.begin(), msgs1.end(), msgs2.begin(), msgs2.end(), inserter(mDiff, mDiff.begin()));
|
||||
set_symmetric_difference(msgs2.begin(), msgs2.end(), msgs1.begin(), msgs1.end(), inserter(mDiff, mDiff.begin()));
|
||||
p.Messages(mDiff);
|
||||
|
||||
set<Tag> bashTags = plugin.Tags();
|
||||
set<Tag> tagDiff;
|
||||
set_symmetric_difference(bashTags.begin(), bashTags.end(), tags.begin(), tags.end(), inserter(tagDiff, tagDiff.begin()));
|
||||
set_symmetric_difference(tags.begin(), tags.end(), bashTags.begin(), bashTags.end(), inserter(tagDiff, tagDiff.begin()));
|
||||
p.Tags(tagDiff);
|
||||
|
||||
set<PluginDirtyInfo> dirtyInfo = plugin.DirtyInfo();
|
||||
set<PluginDirtyInfo> dirtDiff;
|
||||
set_symmetric_difference(dirtyInfo.begin(), dirtyInfo.end(), _dirtyInfo.begin(), _dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin()));
|
||||
set_symmetric_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin()));
|
||||
p.DirtyInfo(dirtDiff);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
Plugin Plugin::NewMetadata(const Plugin& plugin) const {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Comparing new metadata for: " << name;
|
||||
Plugin p(*this);
|
||||
|
||||
//Compare this plugin against the given plugin.
|
||||
set<File> files = plugin.LoadAfter();
|
||||
set<File> filesDiff;
|
||||
set_difference(loadAfter.begin(), loadAfter.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.LoadAfter(filesDiff);
|
||||
|
||||
filesDiff.clear();
|
||||
files = plugin.Reqs();
|
||||
set_difference(requirements.begin(), requirements.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.Reqs(filesDiff);
|
||||
|
||||
filesDiff.clear();
|
||||
files = plugin.Incs();
|
||||
set_difference(incompatibilities.begin(), incompatibilities.end(), files.begin(), files.end(), inserter(filesDiff, filesDiff.begin()));
|
||||
p.Incs(filesDiff);
|
||||
|
||||
list<Message> msgs1 = plugin.Messages();
|
||||
list<Message> msgs2 = messages;
|
||||
msgs1.sort();
|
||||
msgs2.sort();
|
||||
list<Message> mDiff;
|
||||
set_difference(msgs2.begin(), msgs2.end(), msgs1.begin(), msgs1.end(), inserter(mDiff, mDiff.begin()));
|
||||
p.Messages(mDiff);
|
||||
|
||||
set<Tag> bashTags = plugin.Tags();
|
||||
set<Tag> tagDiff;
|
||||
set_difference(tags.begin(), tags.end(), bashTags.begin(), bashTags.end(), inserter(tagDiff, tagDiff.begin()));
|
||||
p.Tags(tagDiff);
|
||||
|
||||
set<PluginDirtyInfo> dirtyInfo = plugin.DirtyInfo();
|
||||
set<PluginDirtyInfo> dirtDiff;
|
||||
set_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin()));
|
||||
p.DirtyInfo(dirtDiff);
|
||||
|
||||
return p;
|
||||
|
||||
@@ -172,10 +172,15 @@ namespace loot {
|
||||
void MergeMetadata(const Plugin& plugin);
|
||||
|
||||
//Returns the difference in metadata between the two plugins.
|
||||
//For 'enabled', use the given plugin's value.
|
||||
//For 'priority', use the given plugin's value, unless it is equal to this plugin's value, in which case return 0.
|
||||
//For 'enabled', use this plugin's value.
|
||||
//For 'priority', use 0 if the two plugin priorities are equal, and make it not explicit. Otherwise use this plugin's value.
|
||||
Plugin DiffMetadata(const Plugin& plugin) const;
|
||||
|
||||
// Returns metadata in this plugin not in the given plugin.
|
||||
//For 'enabled', use this plugin's value.
|
||||
//For 'priority', use 0 if the two plugin priorities are equal, and make it not explicit. Otherwise use this plugin's value.
|
||||
Plugin NewMetadata(const Plugin& plugin) const;
|
||||
|
||||
std::string Name() const;
|
||||
bool Enabled() const;
|
||||
int Priority() const;
|
||||
|
||||
@@ -485,6 +485,16 @@ namespace loot {
|
||||
if (pluginMetadata["userlist"]["dirty"])
|
||||
newUserlistEntry.DirtyInfo(pluginMetadata["userlist"]["dirty"].as<set<PluginDirtyInfo>>());
|
||||
|
||||
// For cleanliness, only data that does not duplicate masterlist and plugin data should be retained, so diff that.
|
||||
auto pluginIt = g_app_state.CurrentGame().plugins.find(boost::locale::to_lower(newUserlistEntry.Name()));
|
||||
if (pluginIt != g_app_state.CurrentGame().plugins.end()) {
|
||||
Plugin tempPlugin(pluginIt->second);
|
||||
tempPlugin.MergeMetadata(g_app_state.CurrentGame().masterlist.FindPlugin(newUserlistEntry));
|
||||
newUserlistEntry = newUserlistEntry.NewMetadata(tempPlugin);
|
||||
}
|
||||
else
|
||||
newUserlistEntry = newUserlistEntry.NewMetadata(g_app_state.CurrentGame().masterlist.FindPlugin(newUserlistEntry));
|
||||
|
||||
// Now replace existing userlist entry with the new one.
|
||||
if (!ulistPlugin.HasNameOnly()) {
|
||||
BOOST_LOG_TRIVIAL(trace) << "Replacing existing userlist entry with new metadata.";
|
||||
|
||||
Reference in New Issue
Block a user