Przeglądaj źródła

Implement support for tilde expansion, mainly for path repositories

Niels Keurentjes 9 lat temu
rodzic
commit
23ad67b3be

+ 2 - 1
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;

+ 27 - 1
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');
     }
-}
+ }