/**
  * @param File $file
  * @param Version $version
  * @param VersionProvider $versionProvider
  * @param Linker $linker
  * @return bool
  */
 public function publish(File $file, Version $version, VersionProvider $versionProvider, Linker $linker)
 {
     $path = $linker->getLink($file, $version, $versionProvider->getExtension($file, $version));
     $tmp = $this->storage->retrieveVersion($versionProvider->getApplicableVersionable($file), $version);
     if ($this->filesystem->has($path)) {
         return false;
     }
     $this->filesystem->write($path, file_get_contents($tmp), ['visibility' => AdapterInterface::VISIBILITY_PUBLIC]);
     return true;
 }
 /**
  * @param File            $file
  * @param VersionProvider $versionProvider
  * @param  int              $levelsDown
  * @return string
  * @throws FilelibException
  */
 public function getRelativePathToVersion(File $file, Version $version, VersionProvider $versionProvider, $levelsDown = 0)
 {
     $relativePath = $this->getRelativePathToRoot();
     if (!$relativePath) {
         throw new LogicException('Relative path must be set!');
     }
     $relativePath = str_repeat("../", $levelsDown) . $relativePath;
     $retrieved = $this->storage->retrieveVersion($versionProvider->getApplicableVersionable($file), $version);
     $path = preg_replace("[^{$this->adapter->getRoot()}]", $relativePath, $retrieved);
     return $path;
 }
 public function publish(File $file, Version $version, VersionProvider $versionProvider, Linker $linker)
 {
     $link = $this->getPublicRoot() . '/' . $linker->getLink($file, $version, $versionProvider->getExtension($file, $version));
     if (!is_file($link)) {
         $path = dirname($link);
         if (!is_dir($path)) {
             mkdir($path, $this->getDirectoryPermission(), true);
         }
         $tmp = $this->storage->retrieveVersion($versionProvider->getApplicableVersionable($file), $version);
         copy($tmp, $link);
         chmod($link, $this->getFilePermission());
     }
 }