Bladeren bron

Merge remote-tracking branch 'j0k3r/re-install-binaries'

Jordi Boggiano 9 jaren geleden
bovenliggende
commit
88d5b74c74

+ 0 - 1
src/Composer/Factory.php

@@ -297,7 +297,6 @@ class Factory
         }
 
         $vendorDir = $config->get('vendor-dir');
-        $binDir = $config->get('bin-dir');
 
         // initialize composer
         $composer = new Composer();

+ 6 - 0
src/Composer/Installer.php

@@ -297,6 +297,12 @@ class Installer
                 $this->eventDispatcher->dispatchScript($eventName, $this->devMode);
             }
 
+            // force binaries re-generation
+            $this->io->writeError('<info>Installing binaries files</info>');
+            foreach ($localRepo->getPackages() as $package) {
+                $this->installationManager->installBinary($package);
+            }
+
             $vendorDir = $this->config->get('vendor-dir');
             if (is_dir($vendorDir)) {
                 // suppress errors as this fails sometimes on OSX for no apparent reason

+ 21 - 0
src/Composer/Installer/InstallationManager.php

@@ -127,6 +127,27 @@ class InstallationManager
         return $this->getInstaller($package->getType())->isInstalled($repo, $package);
     }
 
+    /**
+     * Install binary for the given package.
+     * If the installer associated to this package doesn't handle that function, it'll do nothing.
+     *
+     * @param PackageInterface $package Package instance
+     */
+    public function installBinary(PackageInterface $package)
+    {
+        try {
+            $installer = $this->getInstaller($package->getType());
+        } catch (\InvalidArgumentException $e) {
+            // no installer found for the current package type (@see `getInstaller()`)
+            return;
+        }
+
+        // if the given installer support installing binaries
+        if ($installer instanceof InstallerBinaryInterface) {
+            $installer->installBinary($package);
+        }
+    }
+
     /**
      * Executes solver operation.
      *

+ 31 - 0
src/Composer/Installer/InstallerBinaryInterface.php

@@ -0,0 +1,31 @@
+<?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\Installer;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Interface for the package installation manager that handle binary installation.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface InstallerBinaryInterface
+{
+    /**
+     * Installs binary file for a specific package.
+     *
+     * @param PackageInterface $package package instance
+     */
+    public function installBinary(PackageInterface $package);
+}

+ 12 - 1
src/Composer/Installer/LibraryInstaller.php

@@ -25,7 +25,7 @@ use Composer\Util\Silencer;
  * @author Jordi Boggiano <j.boggiano@seld.be>
  * @author Konstantin Kudryashov <ever.zet@gmail.com>
  */
-class LibraryInstaller implements InstallerInterface
+class LibraryInstaller implements InstallerInterface, InstallerBinaryInterface
 {
     protected $composer;
     protected $vendorDir;
@@ -149,6 +149,17 @@ class LibraryInstaller implements InstallerInterface
         return $basePath . ($targetDir ? '/'.$targetDir : '');
     }
 
+    /**
+     * Re-install binary by removing previous one
+     *
+     * @param PackageInterface $package Package instance
+     */
+    public function installBinary(PackageInterface $package)
+    {
+        $this->binaryInstaller->removeBinaries($package);
+        $this->binaryInstaller->installBinaries($package, $this->getInstallPath($package));
+    }
+
     /**
      * Returns the base path of the package without target-dir path
      *

+ 1 - 0
tests/Composer/Test/Fixtures/functional/create-project-command.test

@@ -11,3 +11,4 @@ Updating dependencies (including require-dev)
 Nothing to install or update
 Writing lock file
 Generating autoload files
+Installing binaries files

+ 1 - 0
tests/Composer/Test/Fixtures/installer/abandoned-listed.test

@@ -30,6 +30,7 @@ Updating dependencies (including require-dev)
 <warning>Package c/c is abandoned, you should avoid using it. Use b/b instead.</warning>
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Installing a/a (1.0.0)

+ 1 - 0
tests/Composer/Test/Fixtures/installer/github-issues-4795-2.test

@@ -38,6 +38,7 @@ Loading composer repositories with package information
 Updating dependencies (including require-dev)
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Updating a (1.0.0) to a (1.1.0)

+ 1 - 0
tests/Composer/Test/Fixtures/installer/github-issues-4795.test

@@ -40,5 +40,6 @@ Updating dependencies (including require-dev)
 Nothing to install or update
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--

+ 1 - 0
tests/Composer/Test/Fixtures/installer/suggest-installed.test

@@ -23,6 +23,7 @@ Loading composer repositories with package information
 Updating dependencies (including require-dev)
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Installing a/a (1.0.0)

+ 1 - 0
tests/Composer/Test/Fixtures/installer/suggest-prod.test

@@ -21,6 +21,7 @@ Loading composer repositories with package information
 Updating dependencies
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Installing a/a (1.0.0)

+ 1 - 0
tests/Composer/Test/Fixtures/installer/suggest-replaced.test

@@ -23,6 +23,7 @@ Loading composer repositories with package information
 Updating dependencies (including require-dev)
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Installing c/c (1.0.0)

+ 1 - 0
tests/Composer/Test/Fixtures/installer/suggest-uninstalled.test

@@ -22,6 +22,7 @@ Updating dependencies (including require-dev)
 a/a suggests installing b/b (an obscure reason)
 Writing lock file
 Generating autoload files
+Installing binaries files
 
 --EXPECT--
 Installing a/a (1.0.0)

+ 29 - 0
tests/Composer/Test/Installer/InstallationManagerTest.php

@@ -240,6 +240,35 @@ class InstallationManagerTest extends \PHPUnit_Framework_TestCase
         $manager->uninstall($this->repository, $operation);
     }
 
+    public function testInstallBinary()
+    {
+        $installer = $this->getMockBuilder('Composer\Installer\LibraryInstaller')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $manager   = new InstallationManager();
+        $manager->addInstaller($installer);
+
+        $package   = $this->createPackageMock();
+
+        $package
+            ->expects($this->once())
+            ->method('getType')
+            ->will($this->returnValue('library'));
+
+        $installer
+            ->expects($this->once())
+            ->method('supports')
+            ->with('library')
+            ->will($this->returnValue(true));
+
+        $installer
+            ->expects($this->once())
+            ->method('installBinary')
+            ->with($package);
+
+        $manager->installBinary($package);
+    }
+
     private function createInstallerMock()
     {
         return $this->getMockBuilder('Composer\Installer\InstallerInterface')

+ 26 - 0
tests/Composer/Test/Installer/LibraryInstallerTest.php

@@ -255,6 +255,32 @@ class LibraryInstallerTest extends TestCase
         $this->assertEquals($this->vendorDir.'/'.$package->getPrettyName().'/Some/Namespace', $library->getInstallPath($package));
     }
 
+    /**
+     * @depends testInstallerCreationShouldNotCreateVendorDirectory
+     * @depends testInstallerCreationShouldNotCreateBinDirectory
+     */
+    public function testInstallBinary()
+    {
+        $binaryInstallerMock = $this->getMockBuilder('Composer\Installer\BinaryInstaller')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $library = new LibraryInstaller($this->io, $this->composer, 'library', null, $binaryInstallerMock);
+        $package = $this->createPackageMock();
+
+        $binaryInstallerMock
+            ->expects($this->once())
+            ->method('removeBinaries')
+            ->with($package);
+
+        $binaryInstallerMock
+            ->expects($this->once())
+            ->method('installBinaries')
+            ->with($package, $library->getInstallPath($package));
+
+        $library->installBinary($package);
+    }
+
     protected function createPackageMock()
     {
         return $this->getMockBuilder('Composer\Package\Package')