From cce716f9f3ed53874d2f88f187ec77c442d0a609 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Thu, 15 Oct 2020 15:59:21 +0200
Subject: [PATCH] Clear cached app config while waiting for the SCSSCache to
 finish processing the file

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
---
 lib/private/AppConfig.php                     | 10 ++++++++++
 lib/private/Template/SCSSCacher.php           |  8 +++++++-
 tests/lib/Template/CSSResourceLocatorTest.php |  7 ++++++-
 tests/lib/Template/SCSSCacherTest.php         |  8 +++++++-
 4 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index b35bc4070dd..d3b64449879 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -344,4 +344,14 @@ class AppConfig implements IAppConfig {
 
 		$this->configLoaded = true;
 	}
+
+	/**
+	 * Clear all the cached app config values
+	 *
+	 * WARNING: do not use this - this is only for usage with the SCSSCacher to
+	 * clear the memory cache of the app config
+	 */
+	public function clearCachedConfig() {
+		$this->configLoaded = false;
+	}
 }
diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
index 08400fd8c72..73f4a91a4f8 100644
--- a/lib/private/Template/SCSSCacher.php
+++ b/lib/private/Template/SCSSCacher.php
@@ -30,6 +30,7 @@
 
 namespace OC\Template;
 
+use OC\AppConfig;
 use OC\Files\AppData\Factory;
 use OC\Memcache\NullCache;
 use OCP\AppFramework\Utility\ITimeFactory;
@@ -89,6 +90,8 @@ class SCSSCacher {
 
 	/** @var IMemcache */
 	private $lockingCache;
+	/** @var AppConfig */
+	private $appConfig;
 
 	/**
 	 * @param ILogger $logger
@@ -109,7 +112,8 @@ class SCSSCacher {
 								$serverRoot,
 								ICacheFactory $cacheFactory,
 								IconsCacher $iconsCacher,
-								ITimeFactory $timeFactory) {
+								ITimeFactory $timeFactory,
+								AppConfig $appConfig) {
 		$this->logger = $logger;
 		$this->appData = $appDataFactory->get('css');
 		$this->urlGenerator = $urlGenerator;
@@ -126,6 +130,7 @@ class SCSSCacher {
 		$this->lockingCache = $lockingCache;
 		$this->iconsCacher = $iconsCacher;
 		$this->timeFactory = $timeFactory;
+		$this->appConfig = $appConfig;
 	}
 
 	/**
@@ -166,6 +171,7 @@ class SCSSCacher {
 			$retry = 0;
 			sleep(1);
 			while ($retry < 10) {
+				$this->appConfig->clearCachedConfig();
 				$this->logger->debug('SCSSCacher::process check in while loop follows', ['app' => 'scss_cacher']);
 				if (!$this->variablesChanged() && $this->isCached($fileNameCSS, $app)) {
 					// Inject icons vars css if any
diff --git a/tests/lib/Template/CSSResourceLocatorTest.php b/tests/lib/Template/CSSResourceLocatorTest.php
index 3f377f9daa4..3a66d738f25 100644
--- a/tests/lib/Template/CSSResourceLocatorTest.php
+++ b/tests/lib/Template/CSSResourceLocatorTest.php
@@ -23,6 +23,7 @@
 
 namespace Test\Template;
 
+use OC\AppConfig;
 use OC\Files\AppData\AppData;
 use OC\Files\AppData\Factory;
 use OC\Template\CSSResourceLocator;
@@ -53,6 +54,8 @@ class CSSResourceLocatorTest extends \Test\TestCase {
 	protected $iconsCacher;
 	/** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
 	private $timeFactory;
+	/** @var AppConfig|\PHPUnit\Framework\MockObject\MockObject */
+	private $appConfig;
 
 	protected function setUp(): void {
 		parent::setUp();
@@ -65,6 +68,7 @@ class CSSResourceLocatorTest extends \Test\TestCase {
 		$this->themingDefaults = $this->createMock(ThemingDefaults::class);
 		$this->iconsCacher = $this->createMock(IconsCacher::class);
 		$this->timeFactory = $this->createMock(ITimeFactory::class);
+		$this->appConfig = $this->createMock(AppConfig::class);
 	}
 
 	private function cssResourceLocator() {
@@ -80,7 +84,8 @@ class CSSResourceLocatorTest extends \Test\TestCase {
 			\OC::$SERVERROOT,
 			$this->cacheFactory,
 			$this->iconsCacher,
-			$this->timeFactory
+			$this->timeFactory,
+			$this->appConfig
 		);
 		return new CSSResourceLocator(
 			$this->logger,
diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php
index 1a77f789afe..77a9bdde764 100644
--- a/tests/lib/Template/SCSSCacherTest.php
+++ b/tests/lib/Template/SCSSCacherTest.php
@@ -23,6 +23,7 @@
 
 namespace Test\Template;
 
+use OC\AppConfig;
 use OC\Files\AppData\AppData;
 use OC\Files\AppData\Factory;
 use OC\Template\IconsCacher;
@@ -60,6 +61,8 @@ class SCSSCacherTest extends \Test\TestCase {
 	protected $iconsCacher;
 	/** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
 	protected $timeFactory;
+	/** @var AppConfig|\PHPUnit\Framework\MockObject\MockObject */
+	protected $appConfig;
 
 	protected function setUp(): void {
 		parent::setUp();
@@ -92,6 +95,8 @@ class SCSSCacherTest extends \Test\TestCase {
 			->method('getCachedCSS')
 			->willReturn($iconsFile);
 
+		$this->appConfig = $this->createMock(AppConfig::class);
+
 		$this->scssCacher = new SCSSCacher(
 			$this->logger,
 			$factory,
@@ -101,7 +106,8 @@ class SCSSCacherTest extends \Test\TestCase {
 			\OC::$SERVERROOT,
 			$this->cacheFactory,
 			$this->iconsCacher,
-			$this->timeFactory
+			$this->timeFactory,
+			$this->appConfig
 		);
 	}
 
-- 
GitLab