|
@@ -20,29 +20,36 @@ 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.
|
|
|
+ * Parses tildes and environment variables in paths.
|
|
|
*
|
|
|
* @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);
|
|
|
+ if (preg_match('#^~[/\\\\]#', $path)) {
|
|
|
+ return self::getUserDirectory() . substr($path, 1);
|
|
|
}
|
|
|
- return $path;
|
|
|
+ return preg_replace_callback(self::isWindows() ? '#^(%(\\w+)%)[/\\\\]#' : '#^(\\$(\\w+))/#', function($matches) {
|
|
|
+ return getenv($matches[2]) . DIRECTORY_SEPARATOR;
|
|
|
+ }, $path);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @return string The formal user home as detected from environment parameters
|
|
|
+ * @throws \RuntimeException If the user home could not reliably be determined
|
|
|
+ */
|
|
|
+ public static function getUserDirectory()
|
|
|
+ {
|
|
|
+ if (false !== ($home = getenv('HOME'))) {
|
|
|
+ return $home;
|
|
|
+ } elseif (self::isWindows() && false !== ($home = getenv('USERPROFILE'))) {
|
|
|
+ return $home;
|
|
|
+ } elseif (function_exists('posix_getuid') && function_exists('posix_getpwuid')) {
|
|
|
+ $info = posix_getpwuid(posix_getuid());
|
|
|
+ return $info['dir'];
|
|
|
+ }
|
|
|
+ throw new \RuntimeException('Could not determine user directory');
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -52,4 +59,4 @@ class Platform
|
|
|
{
|
|
|
return defined('PHP_WINDOWS_VERSION_BUILD');
|
|
|
}
|
|
|
- }
|
|
|
+}
|