From 0bda4d54c5b77b4ea2865fbcc27f8c86d9f20513 Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Tue, 25 Aug 2015 14:09:38 +0200
Subject: [PATCH] Repair mime types only when upgrading from OC 8.0

---
 lib/private/repair.php               |  2 +-
 lib/repair/repairmimetypes.php       | 66 ++++++++++++++++++----------
 tests/lib/repair/repairmimetypes.php | 11 ++++-
 3 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/lib/private/repair.php b/lib/private/repair.php
index 533bf05b54c..3639440a518 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -103,7 +103,7 @@ class Repair extends BasicEmitter {
 	 */
 	public static function getRepairSteps() {
 		return [
-			new RepairMimeTypes(),
+			new RepairMimeTypes(\OC::$server->getConfig()),
 			new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
 			new RepairConfig(),
 			new AssetCache(),
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index 89ad0ed16c7..db11f526ad6 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -29,6 +29,17 @@ namespace OC\Repair;
 use OC\Hooks\BasicEmitter;
 
 class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
+	/**
+	 * @var \OCP\IConfig
+	 */
+	protected $config;
+
+	/**
+	 * @param \OCP\IConfig $config
+	 */
+	public function __construct($config) {
+		$this->config = $config;
+	}
 
 	public function getName() {
 		return 'Repair mime types';
@@ -243,36 +254,45 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
 	 * Fix mime types
 	 */
 	public function run() {
-		if ($this->fixOfficeMimeTypes()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
-		}
 
-		if ($this->fixApkMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
-		}
+		$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
 
-		if ($this->fixFontsMimeTypes()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
-		}
+		// NOTE TO DEVELOPERS: when adding new mime types, please make sure to
+		// add a version comparison to avoid doing it every time
 
-		if ($this->fixPostscriptMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
-		}
+		// only update mime types if necessary as it can be expensive
+		if (version_compare($ocVersionFromBeforeUpdate, '8.2.0', '<')) {
+			if ($this->fixOfficeMimeTypes()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
+			}
 
-		if ($this->introduceRawMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
-		}
+			if ($this->fixApkMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
+			}
 
-		if ($this->introduce3dImagesMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
-		}
+			if ($this->fixFontsMimeTypes()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
+			}
 
-		if ($this->introduceConfMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
-		}
+			if ($this->fixPostscriptMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
+			}
+
+			if ($this->introduceRawMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
+			}
+
+			if ($this->introduce3dImagesMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
+			}
 
-		if ($this->introduceYamlMimeType()) {
-			$this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+			if ($this->introduceConfMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
+			}
+
+			if ($this->introduceYamlMimeType()) {
+				$this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+			}
 		}
 	}
 }
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index da36e7de58a..3c100b808cf 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -26,8 +26,17 @@ class RepairMimeTypes extends \Test\TestCase {
 		$this->savedMimetypeLoader = \OC::$server->getMimeTypeLoader();
 		$this->mimetypeLoader = \OC::$server->getMimeTypeLoader();
 
+		$config = $this->getMockBuilder('OCP\IConfig')
+			->disableOriginalConstructor()
+			->getMock();
+		$config->expects($this->any())
+			->method('getSystemValue')
+			->with('version')
+			->will($this->returnValue('8.0.0.0'));
+
 		$this->storage = new \OC\Files\Storage\Temporary([]);
-		$this->repair = new \OC\Repair\RepairMimeTypes();
+
+		$this->repair = new \OC\Repair\RepairMimeTypes($config);
 	}
 
 	protected function tearDown() {
-- 
GitLab