CakePHPInstaller.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace Composer\Installers;
  3. use Composer\DependencyResolver\Pool;
  4. use Composer\Package\PackageInterface;
  5. class CakePHPInstaller extends BaseInstaller
  6. {
  7. protected $locations = array(
  8. 'plugin' => 'Plugin/{$name}/',
  9. );
  10. /**
  11. * Format package name to CamelCase
  12. */
  13. public function inflectPackageVars($vars)
  14. {
  15. if ($this->matchesCakeVersion('>=', '3.0.0')) {
  16. return $vars;
  17. }
  18. $nameParts = explode('/', $vars['name']);
  19. foreach ($nameParts as &$value) {
  20. $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value));
  21. $value = str_replace(array('-', '_'), ' ', $value);
  22. $value = str_replace(' ', '', ucwords($value));
  23. }
  24. $vars['name'] = implode('/', $nameParts);
  25. return $vars;
  26. }
  27. /**
  28. * Change the default plugin location when cakephp >= 3.0
  29. */
  30. public function getLocations()
  31. {
  32. if ($this->matchesCakeVersion('>=', '3.0.0')) {
  33. $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/';
  34. }
  35. return $this->locations;
  36. }
  37. /**
  38. * Check if CakePHP version matches against a version
  39. *
  40. * @param string $matcher
  41. * @param string $version
  42. * @return bool
  43. */
  44. protected function matchesCakeVersion($matcher, $version)
  45. {
  46. if (class_exists('Composer\Semver\Constraint\MultiConstraint')) {
  47. $multiClass = 'Composer\Semver\Constraint\MultiConstraint';
  48. $constraintClass = 'Composer\Semver\Constraint\Constraint';
  49. } else {
  50. $multiClass = 'Composer\Package\LinkConstraint\MultiConstraint';
  51. $constraintClass = 'Composer\Package\LinkConstraint\VersionConstraint';
  52. }
  53. $repositoryManager = $this->composer->getRepositoryManager();
  54. if ($repositoryManager) {
  55. $repos = $repositoryManager->getLocalRepository();
  56. if (!$repos) {
  57. return false;
  58. }
  59. $cake3 = new $multiClass(array(
  60. new $constraintClass($matcher, $version),
  61. new $constraintClass('!=', '9999999-dev'),
  62. ));
  63. $pool = new Pool('dev');
  64. $pool->addRepository($repos);
  65. $packages = $pool->whatProvides('cakephp/cakephp');
  66. foreach ($packages as $package) {
  67. $installed = new $constraintClass('=', $package->getVersion());
  68. if ($cake3->matches($installed)) {
  69. return true;
  70. break;
  71. }
  72. }
  73. }
  74. return false;
  75. }
  76. }