public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $repositoryUrl = null) { $dm = $this->createDownloadManager($io); if ($preferSource) { $dm->setPreferSource(true); } if (null === $repositoryUrl) { $sourceRepo = new ComposerRepository(array('url' => 'http://packagist.org')); } elseif (".json" === substr($repositoryUrl, -5)) { $sourceRepo = new FilesystemRepository($repositoryUrl); } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl)); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $candidates = $sourceRepo->findPackages($packageName, $version); if (!$candidates) { throw new \InvalidArgumentException("Could not find package {$packageName}" . ($version ? " with version {$version}." : '')); } if (null === $directory) { $parts = explode("/", $packageName, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // select highest version if we have many $package = $candidates[0]; foreach ($candidates as $candidate) { if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } $io->write('<info>Installing ' . $package->getName() . ' as new project.</info>', true); $projectInstaller = new ProjectInstaller($directory, $dm); $projectInstaller->install($package); $io->write('<info>Created project into directory ' . $directory . '</info>', true); chdir($directory); $composer = Factory::create($io); $installer = Installer::create($io, $composer); $installer->run($preferSource); }
public function installProject(IOInterface $io, $packageName, $directory = null, $packageVersion = null, $preferSource = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false) { $config = Factory::createConfig(); $dm = $this->createDownloadManager($io, $config); if ($preferSource) { $dm->setPreferSource(true); } if (null === $repositoryUrl) { $sourceRepo = new CompositeRepository(Factory::createDefaultRepositories($io, $config)); } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) { $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io))); } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $candidates = array(); $name = strtolower($packageName); if ($packageVersion === null) { $sourceRepo->filterPackages(function ($package) use(&$candidates, $name) { if ($package->getName() === $name) { $candidates[] = $package; } }); } else { $parser = new VersionParser(); $version = $parser->normalize($packageVersion); $sourceRepo->filterPackages(function ($package) use(&$candidates, $name, $version) { if ($package->getName() === $name && $version === $package->getVersion()) { $candidates[] = $package; return false; } }); } if (!$candidates) { throw new \InvalidArgumentException("Could not find package {$packageName}" . ($packageVersion ? " with version {$packageVersion}." : '')); } if (null === $directory) { $parts = explode("/", $packageName, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // select highest version if we have many $package = $candidates[0]; foreach ($candidates as $candidate) { if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } unset($candidates); $io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>', true); if ($disableCustomInstallers) { $io->write('<info>Custom installers have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $projectInstaller = new ProjectInstaller($directory, $dm); $projectInstaller->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), $package); if ($package->getRepository() instanceof NotifiableRepositoryInterface) { $package->getRepository()->notifyInstall($package); } $io->write('<info>Created project in ' . $directory . '</info>', true); chdir($directory); putenv('COMPOSER_ROOT_VERSION=' . $package->getPrettyVersion()); // clean up memory unset($dm, $config, $projectInstaller, $sourceRepo, $package); // install dependencies of the created project $composer = Factory::create($io); $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource)->setDevMode($installDevPackages)->setRunScripts(!$noScripts); if ($disableCustomInstallers) { $installer->disableCustomInstallers(); } $installer->run(); }
public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $installDevPackages = false, $repositoryUrl = null) { $dm = $this->createDownloadManager($io); if ($preferSource) { $dm->setPreferSource(true); } $config = Factory::createConfig(); if (null === $repositoryUrl) { $sourceRepo = new ComposerRepository(array('url' => 'http://packagist.org'), $io, $config); } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) { $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io))); } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $candidates = $sourceRepo->findPackages($packageName, $version); if (!$candidates) { throw new \InvalidArgumentException("Could not find package {$packageName}" . ($version ? " with version {$version}." : '')); } if (null === $directory) { $parts = explode("/", $packageName, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // select highest version if we have many $package = $candidates[0]; foreach ($candidates as $candidate) { if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>', true); $projectInstaller = new ProjectInstaller($directory, $dm); $projectInstaller->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), $package); $io->write('<info>Created project in ' . $directory . '</info>', true); chdir($directory); putenv('COMPOSER_ROOT_VERSION=' . $package->getPrettyVersion()); $composer = Factory::create($io); $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource)->setDevMode($installDevPackages)->run(); }
public function installProject(IOInterface $io, $packageName, $directory = null, $packageVersion = null, $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false, $keepVcs = false) { $config = Factory::createConfig(); $dm = $this->createDownloadManager($io, $config); if ($preferSource) { $dm->setPreferSource(true); } if (null === $repositoryUrl) { $sourceRepo = new CompositeRepository(Factory::createDefaultRepositories($io, $config)); } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) { $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io))); } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $candidates = array(); $name = strtolower($packageName); if ($packageVersion === null) { $sourceRepo->filterPackages(function ($package) use(&$candidates, $name) { if ($package->getName() === $name) { $candidates[] = $package; } }); } else { $parser = new VersionParser(); $version = $parser->normalize($packageVersion); $sourceRepo->filterPackages(function ($package) use(&$candidates, $name, $version) { if ($package->getName() === $name && $version === $package->getVersion()) { $candidates[] = $package; return false; } }); } if (!$candidates) { throw new \InvalidArgumentException("Could not find package {$packageName}" . ($packageVersion ? " with version {$packageVersion}." : '')); } if (null === $directory) { $parts = explode("/", $packageName, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // select highest version if we have many $package = $candidates[0]; foreach ($candidates as $candidate) { if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } unset($candidates); $io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>'); if ($disableCustomInstallers) { $io->write('<info>Custom installers have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $dm->setPreferSource($preferSource)->setPreferDist($preferDist); $projectInstaller = new ProjectInstaller($directory, $dm); $projectInstaller->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), $package); if ($package->getRepository() instanceof NotifiableRepositoryInterface) { $package->getRepository()->notifyInstall($package); } $installedFromVcs = 'source' === $package->getInstallationSource(); $io->write('<info>Created project in ' . $directory . '</info>'); chdir($directory); putenv('COMPOSER_ROOT_VERSION=' . $package->getPrettyVersion()); // clean up memory unset($dm, $config, $projectInstaller, $sourceRepo, $package); // install dependencies of the created project $composer = Factory::create($io); $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode($installDevPackages)->setRunScripts(!$noScripts); if ($disableCustomInstallers) { $installer->disableCustomInstallers(); } if (!$installer->run()) { return 1; } if (!$keepVcs && $installedFromVcs && (!$io->isInteractive() || $io->askConfirmation('<info>Do you want to remove the existing VCS (.git, .svn..) history?</info> [<comment>Y,n</comment>]? ', true))) { $finder = new Finder(); $finder->depth(0)->directories()->in(getcwd())->ignoreVCS(false)->ignoreDotFiles(false); foreach (array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg') as $vcsName) { $finder->name($vcsName); } try { $fs = new Filesystem(); $dirs = iterator_to_array($finder); unset($finder); foreach ($dirs as $dir) { if (!$fs->removeDirectory($dir)) { throw new \RuntimeException('Could not remove ' . $dir); } } } catch (\Exception $e) { $io->write('<error>An error occurred while removing the VCS metadata: ' . $e->getMessage() . '</error>'); } } return 0; }