From c0280256bf718883ec1f1700b025226c215f74f7 Mon Sep 17 00:00:00 2001 From: Tobias Munk Date: Fri, 31 May 2013 10:49:27 +0200 Subject: [PATCH] code refactoring --- src/Composer/Command/CreateProjectCommand.php | 159 +++++++++--------- 1 file changed, 82 insertions(+), 77 deletions(-) diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index b883fd94a..b61e6ac70 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -52,7 +52,7 @@ class CreateProjectCommand extends Command ->setName('create-project') ->setDescription('Create new project from a package into given directory.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed', 'local'), + new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed'), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), new InputArgument('version', InputArgument::OPTIONAL, 'Version, will defaults to latest'), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum-stability allowed (unless a version is specified).', 'stable'), @@ -67,9 +67,11 @@ class CreateProjectCommand extends Command )) ->setHelp(<<create-project command creates a new project from a given -package into a new directory. You can use this command to bootstrap new -projects or setup a clean version-controlled installation -for developers of your project. +package into a new directory. If executed without params and in a directory +with a composer.json file it installs the packages for the current project. + +You can use this command to bootstrap new projects or setup a clean +version-controlled installation for developers of your project. php composer.phar create-project vendor/project target-directory [version] @@ -134,11 +136,84 @@ EOT public function installProject(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false, $keepVcs = false, $noProgress = false) { - if ($packageName === 'local') { + if ($packageName !== null) { + $installedFromVcs = $this->installRootPackage($io, $config, $packageName, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repositoryUrl, $disableCustomInstallers, $noScripts, $keepVcs, $noProgress); + } else { $installedFromVcs = false; - goto installDependencies; } + if ($noScripts === false) { + // dispatch event + $this->getComposer()->getEventDispatcher()->dispatchCommandEvent(ScriptEvents::POST_ROOT_PACKAGE_INSTALL, $installDevPackages); + } + // 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 ($noScripts === false) { + // dispatch event + $this->getComposer()->getEventDispatcher()->dispatchCommandEvent(ScriptEvents::POST_CREATE_PROJECT, $installDevPackages); + } + + $hasVcs = $installedFromVcs; + if (!$keepVcs && $installedFromVcs + && ( + !$io->isInteractive() + || $io->askConfirmation('Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]? ', 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('An error occurred while removing the VCS metadata: '.$e->getMessage().''); + } + + $hasVcs = false; + } + + // rewriting self.version dependencies with explicit version numbers if the package's vcs metadata is gone + if (!$hasVcs) { + $package = $composer->getPackage(); + $configSource = new JsonConfigSource(new JsonFile('composer.json')); + foreach (BasePackage::$supportedLinkTypes as $type => $meta) { + foreach ($package->{'get'.$meta['method']}() as $link) { + if ($link->getPrettyConstraint() === 'self.version') { + $configSource->addLink($type, $link->getTarget(), $package->getPrettyVersion()); + } + } + } + } + + return 0; + } + + protected function installRootPackage(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false, $keepVcs = false, $noProgress = false) { $stability = strtolower($stability); if ($stability === 'rc') { $stability = 'RC'; @@ -225,77 +300,7 @@ EOT // clean up memory unset($dm, $im, $config, $projectInstaller, $sourceRepo, $package); - - installDependencies: - if ($noScripts === false) { - // dispatch event - $this->getComposer()->getEventDispatcher()->dispatchCommandEvent(ScriptEvents::POST_ROOT_PACKAGE_INSTALL, $installDevPackages); - } - // 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 ($noScripts === false) { - // dispatch event - $this->getComposer()->getEventDispatcher()->dispatchCommandEvent(ScriptEvents::POST_CREATE_PROJECT, $installDevPackages); - } - - $hasVcs = $installedFromVcs; - if (!$keepVcs && $installedFromVcs - && ( - !$io->isInteractive() - || $io->askConfirmation('Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]? ', 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('An error occurred while removing the VCS metadata: '.$e->getMessage().''); - } - - $hasVcs = false; - } - - // rewriting self.version dependencies with explicit version numbers if the package's vcs metadata is gone - if (!$hasVcs) { - $package = $composer->getPackage(); - $configSource = new JsonConfigSource(new JsonFile('composer.json')); - foreach (BasePackage::$supportedLinkTypes as $type => $meta) { - foreach ($package->{'get'.$meta['method']}() as $link) { - if ($link->getPrettyConstraint() === 'self.version') { - $configSource->addLink($type, $link->getTarget(), $package->getPrettyVersion()); - } - } - } - } - - return 0; + return $installedFromVcs; } protected function createDownloadManager(IOInterface $io, Config $config)