Newer
Older
use Composer\Package\PackageInterface;
use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Script\Event as ScriptEvent;
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.
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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);
$uri = $username . '@git.drupal.org:project/' . $projectname . '.git';
// Git Clone the repository into the working directory
$repository = Repository::open($path);
$repository->init();
$originExists = FALSE;
/** @var \GitElephant\Objects\Remote $remote */
foreach ($repository->getRemotes() as $remote) {
if ($remote->getName() == 'origin') {
if ($remote->getFetchURL() != $uri) {
$remote->setFetchURL($uri);
}
$originExists = TRUE;
break;
}
}
if (!$originExists) {
$fs = new Filesystem();
$fs->remove($path);
$fs->mkdir($path);
$repository->init();
$repository->addRemote('origin', $uri);
}
$repository->fetch();