From d3437d6e7618367b2f66389e605c53f25047863e Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Thu, 9 May 2013 13:21:04 +1200 Subject: [PATCH] NEW: Rewrite self.version in create-project (Fixes #1351) When composer create-project is called and the resulting project is disconnected from the parent repo, self.version references no longer work. To fix that, this patch rewrites self.version to the actual version number as part of 'composer create-project' execution --- src/Composer/Command/CreateProjectCommand.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) 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();