aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLukas Reschke <lukas@owncloud.com>2014-11-11 17:26:08 +0100
committerLukas Reschke <lukas@owncloud.com>2014-11-13 12:07:49 +0100
commit5f8fb8d1ee61e069adc7fcad6a3aad63f44bd1a6 (patch)
treedfec7d16bcaf055d15106e28fc0c99caef4a4a2a /lib
parent5ca869c3241d159b2bd2c45b79c49b085c277968 (diff)
downloadnextcloud-server-5f8fb8d1ee61e069adc7fcad6a3aad63f44bd1a6.tar.gz
nextcloud-server-5f8fb8d1ee61e069adc7fcad6a3aad63f44bd1a6.zip
Run preupdate before an update
The update routine tries to test the database migration before actually performing the update. However, this will fail hard if the schema has changed (for example an unique key has been added). App developers can convert the DB in preupdate.php, however it is not called before and therefore the update fails. This actually breaks ownCloud updates from ownCloud 6 to ownCloud 7 when the files_antivirus app is enabled.
Diffstat (limited to 'lib')
-rw-r--r--lib/private/app.php4
-rw-r--r--lib/private/updater.php18
2 files changed, 17 insertions, 5 deletions
diff --git a/lib/private/app.php b/lib/private/app.php
index 73576088d15..bc9ca0351ea 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -1180,10 +1180,6 @@ class OC_App {
* @return bool
*/
public static function updateApp($appId) {
- if (file_exists(self::getAppPath($appId) . '/appinfo/preupdate.php')) {
- self::loadApp($appId, false);
- include self::getAppPath($appId) . '/appinfo/preupdate.php';
- }
if (file_exists(self::getAppPath($appId) . '/appinfo/database.xml')) {
OC_DB::updateDbFromStructure(self::getAppPath($appId) . '/appinfo/database.xml');
}
diff --git a/lib/private/updater.php b/lib/private/updater.php
index c4c70a3cc4a..e07ff03ffc4 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -245,7 +245,6 @@ class Updater extends BasicEmitter {
protected function checkAppUpgrade($version) {
$apps = \OC_App::getEnabledApps();
-
foreach ($apps as $appId) {
if ($version) {
$info = \OC_App::getAppInfo($appId);
@@ -255,6 +254,15 @@ class Updater extends BasicEmitter {
}
if ($compatible && \OC_App::shouldUpgrade($appId)) {
+ /**
+ * FIXME: The preupdate check is performed before the database migration, otherwise database changes
+ * are not possible anymore within it. - Consider this when touching the code.
+ * @link https://github.com/owncloud/core/issues/10980
+ * @see \OC_App::updateApp
+ */
+ if (file_exists(\OC_App::getAppPath($appId) . '/appinfo/preupdate.php')) {
+ $this->includePreUpdate($appId);
+ }
if (file_exists(\OC_App::getAppPath($appId) . '/appinfo/database.xml')) {
\OC_DB::simulateUpdateDbFromStructure(\OC_App::getAppPath($appId) . '/appinfo/database.xml');
}
@@ -264,6 +272,14 @@ class Updater extends BasicEmitter {
$this->emit('\OC\Updater', 'appUpgradeCheck');
}
+ /**
+ * Includes the pre-update file. Done here to prevent namespace mixups.
+ * @param string $appId
+ */
+ private function includePreUpdate($appId) {
+ include \OC_App::getAppPath($appId) . '/appinfo/preupdate.php';
+ }
+
protected function doAppUpgrade() {
$apps = \OC_App::getEnabledApps();