summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLostDragonist <lost.dragonist@gmail.com>2019-03-22 21:26:50 -0500
committerLostDragonist <lost.dragonist@gmail.com>2019-03-22 21:26:50 -0500
commit6dd246363e538d7730ff0eec3c23338553ca1392 (patch)
tree79c4ed55ef8f44bab41457db09e9dc17a33cbb3c /src/shared
parent1f50d61ecb236b3ff72e650c1fb45aba448a5bc5 (diff)
Fix origin determination for the case of a lower priority, loose files mod being added after a higher priority, archived files mod.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/directoryentry.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index 8fc63188..1179110a 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -238,20 +238,30 @@ void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &arc
if (m_Parent != nullptr) {
m_Parent->propagateOrigin(origin);
}
+
+ // If this file has no previous origin, this mod is now the origin with no alternatives
if (m_Origin == -1) {
m_Origin = origin;
m_FileTime = fileTime;
m_Archive = std::pair<std::wstring, int>(archive, order);
- } else if ((m_Parent != nullptr)
- && (m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority())
- && (archive.size() == 0 || m_Archive.first.size() > 0 )) {
+ }
+
+ // If this mod has a higher priority than the origin mod OR
+ // this mod has a loose file and the origin mod has an archived file,
+ // this mod is now the origin and the previous origin is the first alternative
+ else if ((m_Parent != nullptr)
+ && ((m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority())
+ || (archive.size() == 0 && m_Archive.first.size() > 0 ))) {
if (std::find_if(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::pair<std::wstring, int>> &i) -> bool { return i.first == m_Origin; }) == m_Alternatives.end()) {
m_Alternatives.push_back(std::pair<int, std::pair<std::wstring, int>>(m_Origin, m_Archive));
}
m_Origin = origin;
m_FileTime = fileTime;
m_Archive = std::pair<std::wstring, int>(archive, order);
- } else {
+ }
+
+ // This mod is just an alternative
+ else {
bool found = false;
if (m_Origin == origin) {
// already an origin