From 2b347709fc9edcd2435698e2794562153cccfef2 Mon Sep 17 00:00:00 2001
From: Lukasz Uznanski <l.uznanski@macopedia.pl>
Date: Thu, 7 Sep 2017 21:19:15 +0200
Subject: [PATCH] [BUGFIX] Perform rollback only once if undeleting CE with
 History/Undo

Releases: master, 8.7
Resolves: #81649
Change-Id: I1cb9a681b46327af56c2cb080c92b3cc273b0e10
Reviewed-on: https://review.typo3.org/53973
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Joerg Kummer <typo3@enobe.de>
Tested-by: Joerg Kummer <typo3@enobe.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../backend/Classes/History/RecordHistory.php | 59 ++++++++++---------
 1 file changed, 30 insertions(+), 29 deletions(-)

diff --git a/typo3/sysext/backend/Classes/History/RecordHistory.php b/typo3/sysext/backend/Classes/History/RecordHistory.php
index d1d50f313e48..e6f2d9c620df 100644
--- a/typo3/sysext/backend/Classes/History/RecordHistory.php
+++ b/typo3/sysext/backend/Classes/History/RecordHistory.php
@@ -214,36 +214,37 @@ class RecordHistory
             $tce->process_cmdmap();
             unset($tce);
         }
-        // PROCESS CHANGES
-        // create an array for process_datamap
-        $diffModified = [];
-        foreach ($diff['oldData'] as $key => $value) {
-            $splitKey = explode(':', $key);
-            $diffModified[$splitKey[0]][$splitKey[1]] = $value;
-        }
-        switch (count($rollbackData)) {
-            case 1:
-                // all tables
-                $data = $diffModified;
-                break;
-            case 2:
-                // one record
-                $data[$rollbackData[0]][$rollbackData[1]] = $diffModified[$rollbackData[0]][$rollbackData[1]];
-                break;
-            case 3:
-                // one field in one record
-                $data[$rollbackData[0]][$rollbackData[1]][$rollbackData[2]] = $diffModified[$rollbackData[0]][$rollbackData[1]][$rollbackData[2]];
-                break;
+        if (!$diff['insertsDeletes']) {
+            // PROCESS CHANGES
+            // create an array for process_datamap
+            $diffModified = [];
+            foreach ($diff['oldData'] as $key => $value) {
+                $splitKey = explode(':', $key);
+                $diffModified[$splitKey[0]][$splitKey[1]] = $value;
+            }
+            switch (count($rollbackData)) {
+                case 1:
+                    // all tables
+                    $data = $diffModified;
+                    break;
+                case 2:
+                    // one record
+                    $data[$rollbackData[0]][$rollbackData[1]] = $diffModified[$rollbackData[0]][$rollbackData[1]];
+                    break;
+                case 3:
+                    // one field in one record
+                    $data[$rollbackData[0]][$rollbackData[1]][$rollbackData[2]] = $diffModified[$rollbackData[0]][$rollbackData[1]][$rollbackData[2]];
+                    break;
+            }
+            // Removing fields:
+            $data = $this->removeFilefields($rollbackData[0], $data);
+            // Writes the data:
+            $tce = GeneralUtility::makeInstance(DataHandler::class);
+            $tce->dontProcessTransformations = true;
+            $tce->start($data, []);
+            $tce->process_datamap();
+            unset($tce);
         }
-        // Removing fields:
-        $data = $this->removeFilefields($rollbackData[0], $data);
-        // Writes the data:
-        $tce = GeneralUtility::makeInstance(DataHandler::class);
-        $tce->dontProcessTransformations = true;
-        $tce->start($data, []);
-        $tce->process_datamap();
-        unset($tce);
-
         // Return to normal operation
         $this->lastHistoryEntry = false;
         $this->rollbackFields = '';
-- 
GitLab