diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php index 87769066f..09ce4484a 100644 --- a/src/Composer/Package/Loader/RootPackageLoader.php +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -188,6 +188,11 @@ class RootPackageLoader extends ArrayLoader $util = new GitUtil; $util->cleanEnv(); + // try to fetch current version from git tags + if (0 === $this->process->execute('git describe --exact-match --tags', $output)) { + return $this->versionParser->normalize(trim($output)); + } + // try to fetch current version from git branch if (0 === $this->process->execute('git branch --no-color --no-abbrev -v', $output)) { $branches = array(); diff --git a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php index e1a8781a1..b6e904f1f 100644 --- a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php @@ -36,6 +36,11 @@ class RootPackageLoaderTest extends \PHPUnit_Framework_TestCase /* Can do away with this mock object when https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 is fixed */ $processExecutor = new ProcessExecutorMock(function($command, &$output = null, $cwd = null) use ($self, $commitHash) { + if (0 === strpos($command, 'git describe')) { + // simulate not being on a tag + return 1; + } + $self->assertStringStartsWith('git branch', $command); $output = "* (no branch) $commitHash Commit message\n"; @@ -51,6 +56,35 @@ class RootPackageLoaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals("dev-$commitHash", $package->getVersion()); } + public function testTagBecomesVersion() + { + if (!function_exists('proc_open')) { + $this->markTestSkipped('proc_open() is not available'); + } + + $manager = $this->getMockBuilder('\\Composer\\Repository\\RepositoryManager') + ->disableOriginalConstructor() + ->getMock(); + + $self = $this; + + /* Can do away with this mock object when https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 is fixed */ + $processExecutor = new ProcessExecutorMock(function($command, &$output = null, $cwd = null) use ($self) { + $self->assertEquals('git describe --exact-match --tags', $command); + + $output = "v2.0.5-alpha2"; + + return 0; + }); + + $config = new Config; + $config->merge(array('repositories' => array('packagist' => false))); + $loader = new RootPackageLoader($manager, $config, null, $processExecutor); + $package = $loader->load(array()); + + $this->assertEquals("2.0.5.0-alpha2", $package->getVersion()); + } + protected function loadPackage($data) { $manager = $this->getMockBuilder('\\Composer\\Repository\\RepositoryManager')