diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 3a9c2635d..960f0e003 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -35,6 +35,7 @@ use Composer\Json\JsonFile; use Composer\Util\Filesystem; use Composer\Util\RemoteFilesystem; use Composer\Package\Version\VersionParser; +use Composer\Json\JsonManipulator; /** * Install a package as new project into new directory. @@ -235,6 +236,7 @@ EOT return 1; } + $vcsWasRemoved = false; if (!$keepVcs && $installedFromVcs && ( !$io->isInteractive() @@ -259,11 +261,47 @@ EOT } catch (\Exception $e) { $io->write('An error occurred while removing the VCS metadata: '.$e->getMessage().''); } + + $vcsWasRemoved = true; + } + + // Rewriting self.version dependencies with explicit version numbers + if($vcsWasRemoved || !$installedFromVcs) { + $package = $composer->getPackage(); + $requires = $package->getRequires(); + + $requirementsToUpdate = array(); + foreach($requires as $require) { + if($require->getPrettyConstraint() == 'self.version') { + $requirementsToUpdate[] = $require->getTarget(); + } + } + + if($requirementsToUpdate) { + $io->write("Rewriting self.version entries for " . implode(", ",$requirementsToUpdate) . " to " . $package->getVersion() . ""); + $this->rewriteSelfVersion(Factory::getComposerFile(), $requirementsToUpdate, $package->getVersion()); + } } return 0; } + private function rewriteSelfVersion($filename, array $packages, $newVersion) + { + $contents = file_get_contents($filename); + $manipulator = new JsonManipulator($contents); + + foreach ($packages as $package) { + if (!$manipulator->addLink('require', $package, $newVersion)) { + return false; + } + } + + file_put_contents($filename, $manipulator->getContents()); + + return true; + } + protected function createDownloadManager(IOInterface $io, Config $config) { $factory = new Factory();