From edea340dc2d0c2ff39e5b47653400636b86264e3 Mon Sep 17 00:00:00 2001
From: Thomas Mortagne <thomas.mortagne@gmail.com>
Date: Mon, 3 Oct 2016 11:48:22 +0200
Subject: [PATCH] XWIKI-13756: Repository extension update might end up
 deleteding and recreating the same dependencies over and over

---
 .../internal/RepositoryManager.java           | 21 ++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/xwiki-platform-core/xwiki-platform-repository/xwiki-platform-repository-server-api/src/main/java/org/xwiki/repository/internal/RepositoryManager.java b/xwiki-platform-core/xwiki-platform-repository/xwiki-platform-repository-server-api/src/main/java/org/xwiki/repository/internal/RepositoryManager.java
index 277d5c674b5..b52604f13fe 100644
--- a/xwiki-platform-core/xwiki-platform-repository/xwiki-platform-repository-server-api/src/main/java/org/xwiki/repository/internal/RepositoryManager.java
+++ b/xwiki-platform-core/xwiki-platform-repository/xwiki-platform-repository-server-api/src/main/java/org/xwiki/repository/internal/RepositoryManager.java
@@ -927,6 +927,9 @@ private boolean updateExtensionVersionDependencies(XWikiDocument document, Exten
         if (xobjects != null) {
             boolean deleteExistingObjects = false;
 
+            // Clone since we are going to modify and parse it at the same time
+            xobjects = new ArrayList(document.getXObjects(XWikiRepositoryModel.EXTENSIONDEPENDENCY_CLASSREFERENCE));
+
             for (int i = 0; i < xobjects.size(); ++i) {
                 BaseObject dependencyObject = xobjects.get(i);
 
@@ -951,16 +954,20 @@ private boolean updateExtensionVersionDependencies(XWikiDocument document, Exten
                             xobjectDependency
                                 .setRepositories(XWikiRepositoryModel.toRepositoryDescriptors(xobjectRepositories));
 
-                            ExtensionDependency dependency = dependencies.get(dependencyIndex);
+                            if (dependencies.size() > dependencyIndex) {
+                                ExtensionDependency dependency = dependencies.get(dependencyIndex);
 
-                            if (!dependency.equals(xobjectDependency)) {
-                                deleteExistingObjects = true;
+                                if (dependency.equals(xobjectDependency)) {
+                                    ++dependencyIndex;
 
-                                document.removeXObject(dependencyObject);
-                                needSave = true;
-                            } else {
-                                ++dependencyIndex;
+                                    continue;
+                                }
                             }
+
+                            deleteExistingObjects = true;
+
+                            document.removeXObject(dependencyObject);
+                            needSave = true;
                         }
                     }
                 }
-- 
GitLab