Browse Source

Add php proxies that add all locally installed packages to include_path. PEAR binaries are run through these proxies.

Alexey Prilipko 12 years ago
parent
commit
3bdae180f6
1 changed files with 48 additions and 3 deletions
  1. 48 3
      src/Composer/Installer/PearInstaller.php

+ 48 - 3
src/Composer/Installer/PearInstaller.php

@@ -31,10 +31,8 @@ class PearInstaller extends LibraryInstaller
     /**
      * Initializes library installer.
      *
-     * @param string          $vendorDir relative path for packages home
-     * @param string          $binDir    relative path for binaries
-     * @param DownloadManager $dm        download manager
      * @param IOInterface     $io        io instance
+     * @param Composer        $composer
      * @param string          $type      package type that this installer handles
      */
     public function __construct(IOInterface $io, Composer $composer, $type = 'pear-library')
@@ -89,4 +87,51 @@ class PearInstaller extends LibraryInstaller
 
         return $binaries;
     }
+
+    protected function initializeBinDir()
+    {
+        parent::initializeBinDir();
+        file_put_contents($this->binDir.'/composer-php', $this->generateUnixyPhpProxyCode());
+        chmod($this->binDir.'/composer-php', 0777);
+        file_put_contents($this->binDir.'/composer-php.bat', $this->generateWindowsPhpProxyCode());
+        chmod($this->binDir.'/composer-php.bat', 0777);
+    }
+
+    private function generateWindowsPhpProxyCode()
+    {
+        return
+            "@echo off\r\n" .
+            "setlocal enabledelayedexpansion\r\n" .
+            "set BIN_DIR=%~dp0\r\n" .
+            "set VENDOR_DIR=%BIN_DIR%..\\\r\n" .
+            "    set DIRS=.\r\n" .
+            "FOR /D %%V IN (%VENDOR_DIR%*) DO (\r\n" .
+            "    FOR /D %%P IN (%%V\\*) DO (\r\n" .
+            "        set DIRS=!DIRS!;%%~fP\r\n" .
+            "    )\r\n" .
+            ")\r\n" .
+            "php.exe -d include_path=!DIRS! %*\r\n";
+    }
+
+    private function generateUnixyPhpProxyCode()
+    {
+        return
+            "#!/usr/bin/env sh\n".
+            "SRC_DIR=`pwd`\n".
+            "BIN_DIR=`dirname $(readlink -f $0)`\n".
+            "VENDOR_DIR=`dirname \$BIN_DIR`\n".
+            "cd \$BIN_DIR\n".
+            "DIRS=\"\"\n".
+            "for vendor in \$VENDOR_DIR/*; do\n".
+            "    if [ -d \"\$vendor\" ]; then\n".
+            "        for package in \$vendor/*; do\n".
+            "            if [ -d \"\$package\" ]; then\n".
+            "                DIRS=\"\${DIRS}:\${package}\"\n".
+            "            fi\n".
+            "        done\n".
+            "    fi\n".
+            "done\n".
+            "cd \$SRC_DIR\n".
+            "`which php` -d include_path=\".\$DIRS\" $@\n";
+    }
 }