OSDN Git Service

Fix issue #1588: File Duplication Bug In Outputted Zips
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 27 Nov 2022 12:11:45 +0000 (21:11 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 27 Nov 2022 12:11:45 +0000 (21:11 +0900)
Src/7zCommon.cpp

index ad4a10b..1e30336 100644 (file)
@@ -408,9 +408,20 @@ const DIFFITEM &DirItemEnumerator::Next()
        while ((m_nIndex = pView(m_pView)->GetNextItem(m_nIndex, m_nFlags & nMask)) == -1)\r
        {\r
                m_strFolderPrefix = *m_curFolderPrefix++;\r
-               m_index = 1;\r
+               m_index++;\r
        }\r
-       return m_pView->GetDiffItem(m_nIndex);\r
+       const auto& di = m_pView->GetDiffItem(m_nIndex);\r
+       // If the current item is a folder, ignore the current item if the next selected item is a child element of that folder.\r
+       if (m_index > (((di.diffcode.diffcode & DIFFCODE::THREEWAY) == 0) ? 1 : 2) || !di.diffcode.isDirectory())\r
+               return di;\r
+       const int nextIndex = pView(m_pView)->GetNextItem(m_nIndex, m_nFlags & nMask);\r
+       if (nextIndex == -1)\r
+               return di;\r
+       const auto& diNext = m_pView->GetDiffItem(nextIndex);\r
+       const String curRelPath = strutils::makelower(di.diffFileInfo[m_index].GetFile());\r
+       if (strutils::makelower(diNext.diffFileInfo[m_index].GetFile()).find(curRelPath) != 0)\r
+               return di;\r
+       return *DIFFITEM::GetEmptyItem();\r
 }\r
 \r
 /**\r
@@ -432,7 +443,7 @@ Merge7z::Envelope *DirItemEnumerator::Enum(Item &item)
        const CDiffContext& ctxt = m_pView->GetDiffContext();\r
        const DIFFITEM &di = Next();\r
 \r
-       if ((m_nFlags & DiffsOnly) && !IsItemNavigableDiff(ctxt, di))\r
+       if (di.isEmpty() || ((m_nFlags & DiffsOnly) && !IsItemNavigableDiff(ctxt, di)))\r
        {\r
                return 0;\r
        }\r