<?php namespace LakeDrops\DorgFlow; use Composer\Package\PackageInterface; use Composer\Composer; use Composer\IO\IOInterface; use Composer\Script\Event as ScriptEvent; use GitElephant\Repository; class Handler { /** * @var \Composer\Composer */ protected $composer; /** * @var \Composer\IO\IOInterface */ protected $io; /** * Handler constructor. * * @param Composer $composer * @param IOInterface $io */ public function __construct(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; } /** * Retrieve a package from the current composer process. * * @param string $name * Name of the package to get from the current composer installation. * * @return PackageInterface */ protected function getPackage($name) { return $this->composer->getRepositoryManager()->getLocalRepository()->findPackage($name, '*'); } /** * Post install/update event to prepare projects for development. * * @param ScriptEvent $event */ public function prepareDevProjects($event) { // We only do the fancy stuff for developers if (!$event->isDevMode()) { return; } $options = $this->getOptions(); $installationManager = $this->composer->getInstallationManager(); foreach ($options['projects'] as $project => $version) { $package = $this->getPackage($project); if (empty($package)) { continue; } $path = $installationManager->getInstallPath($package); $this->prepareWorkingDirectory($path, $project, $version, $options['username']); } } /** * Retrieve excludes from optional "extra" configuration. * * @return array */ protected function getOptions() { $extra = $this->composer->getPackage()->getExtra() + ['dorgflow' => []]; $options = $extra['dorgflow'] + [ 'projects' => [], 'username' => '', ]; return $options; } /** * @inheritDoc */ protected function prepareWorkingDirectory($path, $project, $version, $username) { list(, $projectname) = explode('/', $project); $repo = $username . '@git.drupal.org/project/' . $projectname . '.git'; // Git Clone the repository into the working directory $repository = Repository::open($path); $repository->cloneFrom($repo, '.'); $repository->checkout($version); } }