diff --git a/modules/system/composer.json b/modules/system/composer.json index 63c6c06ff..ff3b30b28 100644 --- a/modules/system/composer.json +++ b/modules/system/composer.json @@ -18,8 +18,7 @@ "require": { "php": ">=5.5.9", "composer/installers": "~1.0", - "october/rain": "~1.0", - "symfony/filesystem": "2.7.*|2.8.*" + "october/rain": "~1.0" }, "autoload": { "psr-4": { diff --git a/modules/system/console/OctoberMirror.php b/modules/system/console/OctoberMirror.php index 99bf7aa59..dfd161412 100644 --- a/modules/system/console/OctoberMirror.php +++ b/modules/system/console/OctoberMirror.php @@ -104,12 +104,14 @@ class OctoberMirror extends Command $this->output->writeln(sprintf(' - Mirroring: %s', $file)); $src = base_path().'/'.$file; + $dest = $this->getDestinationPath().'/'.$file; - if (!File::isFile($src) || File::isFile($dest)) return false; - $normalizedSrc = $this->normalizeSourcePath($src, $dest); + if (!File::isFile($src) || File::isFile($dest)) { + return false; + } - symlink($normalizedSrc, $dest); + $this->mirror($src, $dest); } protected function mirrorDirectory($directory) @@ -117,13 +119,18 @@ class OctoberMirror extends Command $this->output->writeln(sprintf(' - Mirroring: %s', $directory)); $src = base_path().'/'.$directory; + $dest = $this->getDestinationPath().'/'.$directory; - if (!File::isDirectory($src) || File::isDirectory($dest)) return false; - if (!File::isDirectory(dirname($dest))) File::makeDirectory(dirname($dest), 0755, true); - $normalizedSrc = $this->normalizeSourcePath($src, $dest); + if (!File::isDirectory($src) || File::isDirectory($dest)) { + return false; + } - symlink($normalizedSrc, $dest); + if (!File::isDirectory(dirname($dest))) { + File::makeDirectory(dirname($dest), 0755, true); + } + + $this->mirror($src, $dest); } protected function mirrorWildcard($wildcard) @@ -133,14 +140,31 @@ class OctoberMirror extends Command } list($start, $end) = explode('*', $wildcard, 2); + $startDir = base_path().'/'.$start; - if (!File::isDirectory($startDir)) return false; + + if (!File::isDirectory($startDir)) { + return false; + } foreach (File::directories($startDir) as $directory) { $this->mirrorWildcard($start.basename($directory).$end); } } + protected function mirror($src, $dest) + { + if ($this->option('relative')) { + $src = $this->getRelativePath($dest, $src); + + if (strpos($src, '../') === 0) { + $src = rtrim(substr($src, 3), '/'); + } + } + + symlink($src, $dest); + } + protected function getDestinationPath() { if ($this->destinationPath !== null) { @@ -163,20 +187,20 @@ class OctoberMirror extends Command return $this->destinationPath = $destPath; } - private function normalizeSourcePath($src, $dest) + protected function getRelativePath($from, $to) { - $relative = $this->option('relative'); + $from = str_replace('\\', '/', $from); + $to = str_replace('\\', '/', $to); - if ($relative) { - $filesystem = new Filesystem(); - $src = $filesystem->makePathRelative($src, $dest); + $dir = explode('/', is_file($from) ? dirname($from) : rtrim($from, '/')); + $file = explode('/', $to); - if (strpos($src, '../') === 0) { - $src = rtrim(substr($src, 3), '/'); - } + while ($dir && $file && ($dir[0] == $file[0])) { + array_shift($dir); + array_shift($file); } - return $src; + return str_repeat('../', count($dir)) . implode('/', $file); } /**