From 7ada41259c2d02b7bb38ce1b669f034be015a62d Mon Sep 17 00:00:00 2001
From: Arthur Schiwon <blizzz@owncloud.com>
Date: Tue, 3 Feb 2015 19:02:25 +0100
Subject: [PATCH] Port of #14041 to master

on ownCloud upgrade: upgrade all apps in order, load important ones

Fix "other" app update stack
---
 lib/private/updater.php | 40 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/lib/private/updater.php b/lib/private/updater.php
index fb41e2d36f0..c120d55b6f7 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -291,13 +291,47 @@ class Updater extends BasicEmitter {
 		include \OC_App::getAppPath($appId) . '/appinfo/preupdate.php';
 	}
 
+
+	/**
+	 * upgrades all apps within a major ownCloud upgrade. Also loads "priority"
+	 * (types authentication, filesystem, logging, in that order) afterwards.
+	 *
+	 * @throws NeedsUpdateException
+	 */
 	protected function doAppUpgrade() {
 		$apps = \OC_App::getEnabledApps();
+		$priorityTypes = array('authentication', 'filesystem', 'logging');
+		$pseudoOtherType = 'other';
+		$stacks = array($pseudoOtherType => array());
 
 		foreach ($apps as $appId) {
-			if (\OC_App::shouldUpgrade($appId)) {
-				\OC_App::updateApp($appId);
-				$this->emit('\OC\Updater', 'appUpgrade', array($appId, \OC_App::getAppVersion($appId)));
+			$priorityType = false;
+			foreach ($priorityTypes as $type) {
+				if(!isset($stacks[$type])) {
+					$stacks[$type] = array();
+				}
+				if (\OC_App::isType($appId, $type)) {
+					$stacks[$type][] = $appId;
+					$priorityType = true;
+					break;
+				}
+			}
+			if (!$priorityType) {
+				$stacks[$pseudoOtherType][] = $appId;
+			}
+		}
+		foreach ($stacks as $type => $stack) {
+			foreach ($stack as $appId) {
+				if (\OC_App::shouldUpgrade($appId)) {
+					\OC_App::updateApp($appId);
+					$this->emit('\OC\Updater', 'appUpgrade', array($appId, \OC_App::getAppVersion($appId)));
+				}
+				if($type !== $pseudoOtherType) {
+					// load authentication, filesystem and logging apps after
+					// upgrading them. Other apps my need to rely on modifying
+					// user and/or filesystem aspects.
+					\OC_App::loadApp($appId, false);
+				}
 			}
 		}
 	}
-- 
GitLab