From 23ad67b3bed09c5bfc807f76c611b6f6ee0ae59e Mon Sep 17 00:00:00 2001 From: Niels Keurentjes Date: Tue, 12 Apr 2016 13:14:07 +0200 Subject: [PATCH] Implement support for tilde expansion, mainly for path repositories --- src/Composer/Repository/PathRepository.php | 3 ++- src/Composer/Util/Platform.php | 28 +++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index 9c850a672..f42658d67 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -18,6 +18,7 @@ use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; +use Composer\Util\Platform; use Composer\Util\ProcessExecutor; /** @@ -101,7 +102,7 @@ class PathRepository extends ArrayRepository implements ConfigurableRepositoryIn } $this->loader = new ArrayLoader(null, true); - $this->url = $repoConfig['url']; + $this->url = Platform::expandPath($repoConfig['url']); $this->process = new ProcessExecutor($io); $this->versionGuesser = new VersionGuesser($config, $this->process, new VersionParser()); $this->repoConfig = $repoConfig; diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index 8939b9467..cd936672e 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -19,6 +19,32 @@ namespace Composer\Util; */ class Platform { + /** + * Parses magic constructs like tildes in paths. Right now only tildes are supported but we could add support for + * environment variables on various platforms. + * + * @param string $path + * @return string + */ + public static function expandPath($path) + { + // Tilde expansion for *nix + if (!self::isWindows() && 0 === strpos($path, '~/')) { + if (function_exists('posix_getuid') && function_exists('posix_getpwuid')) { + $info = posix_getpwuid(posix_getuid()); + $home = $info['dir']; + } else { + $home = getenv('HOME'); + } + // Cannot be empty or FALSE + if (!$home) { + throw new \RuntimeException(sprintf('No home folder found to expand ~ with in %s', $path)); + } + $path = $home . substr($path, 1); + } + return $path; + } + /** * @return bool Whether the host machine is running a Windows OS */ @@ -26,4 +52,4 @@ class Platform { return defined('PHP_WINDOWS_VERSION_BUILD'); } -} + }