|
@@ -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(<<<EOT
|
|
|
The <info>create-project</info> 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.
|
|
|
|
|
|
<info>php composer.phar create-project vendor/project target-directory [version]</info>
|
|
|
|
|
@@ -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('<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>');
|
|
|
+ }
|
|
|
+
|
|
|
+ $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('<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>');
|
|
|
- }
|
|
|
-
|
|
|
- $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)
|