From a5733bbc697d588489f8d1dd02b0b94107d3fd71 Mon Sep 17 00:00:00 2001
From: Helmut Hummel <typo3@helhum.io>
Date: Thu, 7 Sep 2023 11:46:42 +0200
Subject: [PATCH] [TASK] Simplify filesystem usage in PackageArtifactBuilder
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only create one filesystem object,
instead of always creating new ones where needed.

Resolves: #101870
Releases: main, 12.4
Change-Id: I56a47f412fded7585425098f18f1d7090baf09d1
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/80896
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Helmut Hummel <typo3@helhum.io>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
---
 .../Composer/PackageArtifactBuilder.php       | 30 +++++++++++--------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
index 04b1a1d9158c..88f32614ff3c 100644
--- a/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
+++ b/typo3/sysext/core/Classes/Composer/PackageArtifactBuilder.php
@@ -59,6 +59,11 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
      */
     private $config;
 
+    /**
+     * @var Filesystem $fileSystem
+     */
+    private $fileSystem;
+
     /**
      * Array of Composer package names (as array key) that are installed by Composer but have no relation to TYPO3 extension API
      * @var array
@@ -88,6 +93,7 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
     {
         $this->event = $event;
         $this->config = Config::load($this->event->getComposer(), $this->event->getIO());
+        $this->fileSystem = new Filesystem();
         $composer = $this->event->getComposer();
         $basePath = $this->config->get('base-dir');
         $this->packagesBasePath = $basePath . '/';
@@ -95,13 +101,13 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
             $packagePath = PathUtility::sanitizeTrailingSeparator($path);
             $package = new Package($this, $extensionKey, $packagePath, true);
             $this->setTitleFromExtEmConf($package);
-            $package->makePathRelative(new Filesystem(), $basePath);
+            $package->makePathRelative($this->fileSystem, $basePath);
             $package->getPackageMetaData()->setVersion($composerPackage->getPrettyVersion());
             $this->registerPackage($package);
         }
         $this->sortPackagesAndConfiguration();
         $cacheIdentifier = md5(serialize($composer->getLocker()->getLockData()) . $this->event->isDevMode());
-        $this->setPackageCache(new ComposerPackageArtifact($composer->getConfig()->get('vendor-dir') . '/typo3', new Filesystem(), $cacheIdentifier));
+        $this->setPackageCache(new ComposerPackageArtifact($composer->getConfig()->get('vendor-dir') . '/typo3', $this->fileSystem, $cacheIdentifier));
         $this->saveToPackageCache();
 
         return true;
@@ -246,10 +252,9 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
         if (!str_contains($typo3ExtensionInstallPath, self::LEGACY_EXTENSION_INSTALL_PATH)) {
             return [$rootPackage, $baseDir, $extensionKey];
         }
-        $filesystem = new Filesystem();
-        if (!file_exists($typo3ExtensionInstallPath) && !$filesystem->isSymlinkedDirectory($typo3ExtensionInstallPath)) {
-            $filesystem->ensureDirectoryExists(dirname($typo3ExtensionInstallPath));
-            $filesystem->relativeSymlink($baseDir, $typo3ExtensionInstallPath);
+        if (!file_exists($typo3ExtensionInstallPath) && !$this->fileSystem->isSymlinkedDirectory($typo3ExtensionInstallPath)) {
+            $this->fileSystem->ensureDirectoryExists(dirname($typo3ExtensionInstallPath));
+            $this->fileSystem->relativeSymlink($baseDir, $typo3ExtensionInstallPath);
         }
         if (realpath($baseDir) !== realpath($typo3ExtensionInstallPath)) {
             $this->event->getIO()->warning('The root package is of type "typo3-cms-extension" and has public resources, but could not be linked to "' . self::LEGACY_EXTENSION_INSTALL_PATH . '" directory, because target directory already exits.');
@@ -260,7 +265,6 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
 
     private function publishResources(array $installedTypo3Packages): void
     {
-        $fileSystem = new Filesystem();
         $baseDir = $this->config->get('base-dir');
         foreach ($installedTypo3Packages as [$composerPackage, $path, $extensionKey]) {
             $fileSystemResourcesPath = $path . '/Resources/Public';
@@ -269,12 +273,12 @@ class PackageArtifactBuilder extends PackageManager implements InstallerScript
             }
             $relativePath = substr($fileSystemResourcesPath, strlen($baseDir));
             [$relativePrefix] = explode('Resources/Public', $relativePath);
-            $publicResourcesPath = $fileSystem->normalizePath($this->config->get('web-dir') . '/_assets/' . md5($relativePrefix));
-            $fileSystem->ensureDirectoryExists(dirname($publicResourcesPath));
-            if (Platform::isWindows() && !$fileSystem->isJunction($publicResourcesPath)) {
-                $fileSystem->junction($fileSystemResourcesPath, $publicResourcesPath);
-            } elseif (!$fileSystem->isSymlinkedDirectory($publicResourcesPath)) {
-                $fileSystem->relativeSymlink($fileSystemResourcesPath, $publicResourcesPath);
+            $publicResourcesPath = $this->fileSystem->normalizePath($this->config->get('web-dir') . '/_assets/' . md5($relativePrefix));
+            $this->fileSystem->ensureDirectoryExists(dirname($publicResourcesPath));
+            if (Platform::isWindows() && !$this->fileSystem->isJunction($publicResourcesPath)) {
+                $this->fileSystem->junction($fileSystemResourcesPath, $publicResourcesPath);
+            } elseif (!$this->fileSystem->isSymlinkedDirectory($publicResourcesPath)) {
+                $this->fileSystem->relativeSymlink($fileSystemResourcesPath, $publicResourcesPath);
             }
         }
     }
-- 
GitLab