diff --git a/Mage/Task/BuiltIn/Filesystem/LinkSharedFilesTask.php b/Mage/Task/BuiltIn/Filesystem/LinkSharedFilesTask.php index 5d4346f..2682b86 100644 --- a/Mage/Task/BuiltIn/Filesystem/LinkSharedFilesTask.php +++ b/Mage/Task/BuiltIn/Filesystem/LinkSharedFilesTask.php @@ -4,7 +4,6 @@ namespace Mage\Task\BuiltIn\Filesystem; use Mage\Task\AbstractTask; use Mage\Task\Releases\IsReleaseAware; use Mage\Task\SkipException; -use Symfony\Component\Filesystem\Filesystem; /** * Class LinkSharedFilesTask @@ -75,13 +74,12 @@ class LinkSharedFilesTask extends AbstractTask implements IsReleaseAware $sharedFolderPath = $remoteDirectory . $this->getParameter('shared', 'shared'); $releasesDirectoryPath = $remoteDirectory . $this->getConfig()->release('directory', 'releases'); $currentCopy = $releasesDirectoryPath . '/' . $this->getConfig()->getReleaseId(); - $fileSystem = new Filesystem(); foreach ($linkedEntities as $ePath) { list($entityPath, $strategy) = $this->getPath($ePath); if ($strategy === self::RELATIVE_LINKING) { $dirName = dirname($currentCopy . '/' . $entityPath); - $target = $fileSystem->makePathRelative($sharedFolderPath, $dirName) . $entityPath; + $target = $this->makePathRelative($sharedFolderPath, $dirName) . $entityPath; } else { $target = $sharedFolderPath . '/' . $entityPath; } @@ -94,6 +92,43 @@ class LinkSharedFilesTask extends AbstractTask implements IsReleaseAware return true; } + /** + * Given an existing path, convert it to a path relative to a given starting path + * + * @param string $endPath Absolute path of target + * @param string $startPath Absolute path where traversal begins + * + * @return string Path of target relative to starting path + * + * @author Fabien Potencier + * @see https://github.com/symfony/Filesystem/blob/v2.6.1/Filesystem.php#L332 + */ + private function makePathRelative($endPath, $startPath) + { + // Normalize separators on Windows + if (defined('PHP_WINDOWS_VERSION_MAJOR')) { + $endPath = strtr($endPath, '\\', '/'); + $startPath = strtr($startPath, '\\', '/'); + } + // Split the paths into arrays + $startPathArr = explode('/', trim($startPath, '/')); + $endPathArr = explode('/', trim($endPath, '/')); + // Find for which directory the common path stops + $index = 0; + while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { + $index++; + } + // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) + $depth = count($startPathArr) - $index; + // Repeated "../" for each level need to reach the common path + $traverser = str_repeat('../', $depth); + $endPathRemainder = implode('/', array_slice($endPathArr, $index)); + // Construct $endPath from traversing to the common path, then to the remaining $endPath + $relativePath = $traverser . (strlen($endPathRemainder) > 0 ? $endPathRemainder . '/' : ''); + + return (strlen($relativePath) === 0) ? './' : $relativePath; + } + /** * @param array|string $linkedEntity * diff --git a/composer.json b/composer.json index 27ef259..2183c74 100644 --- a/composer.json +++ b/composer.json @@ -6,8 +6,7 @@ "type": "library", "keywords": ["deployment"], "require": { - "php": ">=5.3", - "symfony/filesystem": ">=2.1.0,<=2.6.0" + "php": ">=5.3" }, "require-dev": { "phpunit/phpunit": "4.3.5" diff --git a/composer.lock b/composer.lock index b341b73..bc2e079 100644 --- a/composer.lock +++ b/composer.lock @@ -4,56 +4,8 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "61974b12f91cf9124bfd75a369d20ff8", - "packages": [ - { - "name": "symfony/filesystem", - "version": "v2.6.0", - "target-dir": "Symfony/Component/Filesystem", - "source": { - "type": "git", - "url": "https://github.com/symfony/Filesystem.git", - "reference": "6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0", - "reference": "6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Filesystem\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "http://symfony.com", - "time": "2014-11-16 17:28:09" - } - ], + "hash": "a19528b890d301384e45c1ed7d221e26", + "packages": [], "packages-dev": [ { "name": "doctrine/instantiator",