1
0
Fork 0

Added Symlink utility class

pull/3704/head
Kocsis Máté 2015-03-30 20:00:12 +02:00
parent ca0b5495b6
commit 38c26ae26b
2 changed files with 58 additions and 8 deletions

View File

@ -18,6 +18,7 @@ use Composer\Repository\InstalledRepositoryInterface;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\ProcessExecutor; use Composer\Util\ProcessExecutor;
use Composer\Util\Symlink;
/** /**
* Package installation manager. * Package installation manager.
@ -256,15 +257,10 @@ class LibraryInstaller implements InstallerInterface
{ {
$cwd = getcwd(); $cwd = getcwd();
try { try {
// under linux symlinks are not always supported for example $symlink = new Symlink($this->filesystem);
// when using it in smbfs mounted folder $symlink->symlinkBin($binPath, $link);
$relativeBin = $this->filesystem->findShortestPath($link, $binPath);
chdir(dirname($link));
if (false === symlink($relativeBin, $link)) {
throw new \ErrorException();
}
} catch (\ErrorException $e) { } catch (\ErrorException $e) {
$this->installUnixyProxyBinaries($binPath, $link); $this->installUnixyProxyBinaries($binPath, $link);
} }
chdir($cwd); chdir($cwd);
} }

View File

@ -0,0 +1,54 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Util;
use Composer\Config;
/**
* @author Kocsis Máté <kocsismate@woohoolabs.com>
*/
class Symlink
{
protected $filesystem;
/**
* Initializes the symlinking utility.
*
* @param Filesystem $filesystem
*/
public function __construct(Filesystem $filesystem = null)
{
$this->filesystem = $filesystem ?: new Filesystem();
}
/**
* Creates a symlink for a binary file at a given path.
*
* @param string $binPath The path of the binary file to be symlinked
* @param string $link The path where the symlink should be created
* @throws \ErrorException
*/
public function symlinkBin($binPath, $link)
{
$cwd = getcwd();
$relativeBin = $this->filesystem->findShortestPath($link, $binPath);
chdir(dirname($link));
$result = symlink($relativeBin, $link);
chdir($cwd);
if ($result === false) {
throw new \ErrorException();
}
}
}