From 313e6b914d351aea334224b9bc7403039ed57b41 Mon Sep 17 00:00:00 2001 From: Nicole Cordes Date: Fri, 31 Mar 2017 15:02:50 +0200 Subject: [PATCH 1/4] Fix Git branch parsing for detached HEAD on a commit Current versions of Git output the commit hash as detached HEAD instead of FETCH_HEAD. The VersionGuesser should be able to handle commit hashes as well as FETCH_HEAD to detect the correct branch of a commit. --- src/Composer/Package/Version/VersionGuesser.php | 2 +- tests/Composer/Test/Package/Version/VersionGuesserTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Composer/Package/Version/VersionGuesser.php b/src/Composer/Package/Version/VersionGuesser.php index 9aca9ca53..f060a7455 100644 --- a/src/Composer/Package/Version/VersionGuesser.php +++ b/src/Composer/Package/Version/VersionGuesser.php @@ -98,7 +98,7 @@ class VersionGuesser // find current branch and collect all branch names foreach ($this->process->splitLines($output) as $branch) { - if ($branch && preg_match('{^(?:\* ) *(\(no branch\)|\(detached from \S+\)|\(HEAD detached at FETCH_HEAD\)|\S+) *([a-f0-9]+) .*$}', $branch, $match)) { + if ($branch && preg_match('{^(?:\* ) *(\(no branch\)|\(detached from \S+\)|\(HEAD detached at \S+\)|\S+) *([a-f0-9]+) .*$}', $branch, $match)) { if ($match[1] === '(no branch)' || substr($match[1], 0, 10) === '(detached ' || substr($match[1], 0, 17) === '(HEAD detached at') { $version = 'dev-' . $match[2]; $prettyVersion = $version; diff --git a/tests/Composer/Test/Package/Version/VersionGuesserTest.php b/tests/Composer/Test/Package/Version/VersionGuesserTest.php index 52488dacc..cf5377670 100644 --- a/tests/Composer/Test/Package/Version/VersionGuesserTest.php +++ b/tests/Composer/Test/Package/Version/VersionGuesserTest.php @@ -176,7 +176,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase ->method('execute') ->willReturnCallback(function ($command, &$output) use ($self, $commitHash) { $self->assertEquals('git branch --no-color --no-abbrev -v', $command); - $output = "* (HEAD detached at FETCH_HEAD) $commitHash Commit message\n"; + $output = "* (HEAD detached at " . substr($commitHash, 0, 9) . ") $commitHash Commit message\n"; return 0; }) From c2fe198ebcd1937989eb5655a25a0da163c9b379 Mon Sep 17 00:00:00 2001 From: Nicole Cordes Date: Fri, 31 Mar 2017 15:37:39 +0200 Subject: [PATCH 2/4] Re-add unit test for FETCH_HEAD parsing --- .../Package/Version/VersionGuesserTest.php | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/tests/Composer/Test/Package/Version/VersionGuesserTest.php b/tests/Composer/Test/Package/Version/VersionGuesserTest.php index cf5377670..3e37e67c1 100644 --- a/tests/Composer/Test/Package/Version/VersionGuesserTest.php +++ b/tests/Composer/Test/Package/Version/VersionGuesserTest.php @@ -158,16 +158,15 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase $this->assertEquals("dev-$commitHash", $versionData['version']); } - public function testDetachedHeadBecomesDevHashGit2() + public function testDetachedFetchHeadBecomesDevHashGit2() { - $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; + $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') - ->setMethods(array('execute')) + ->setMethods(['execute']) ->disableArgumentCloning() ->disableOriginalConstructor() - ->getMock() - ; + ->getMock(); $self = $this; @@ -176,16 +175,45 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase ->method('execute') ->willReturnCallback(function ($command, &$output) use ($self, $commitHash) { $self->assertEquals('git branch --no-color --no-abbrev -v', $command); - $output = "* (HEAD detached at " . substr($commitHash, 0, 9) . ") $commitHash Commit message\n"; + $output = "* (HEAD detached at FETCH_HEAD) $commitHash Commit message\n"; return 0; - }) - ; + }); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $executor, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); + + $this->assertEquals("dev-$commitHash", $versionData['version']); + } + + public function testDetachedCommitHeadBecomesDevHashGit2() + { + $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; + + $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') + ->setMethods(['execute']) + ->disableArgumentCloning() + ->disableOriginalConstructor() + ->getMock(); + + $self = $this; + + $executor + ->expects($this->at(0)) + ->method('execute') + ->willReturnCallback(function ($command, &$output) use ($self, $commitHash) { + $self->assertEquals('git branch --no-color --no-abbrev -v', $command); + $output = "* (HEAD detached at da53c52ed) $commitHash Commit message\n"; + + return 0; + }); + + $config = new Config; + $config->merge(['repositories' => ['packagist' => false]]); + $guesser = new VersionGuesser($config, $executor, new VersionParser()); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } From c0f5a64e81e03d51ce9fd673c86c6f11d2f1d2c4 Mon Sep 17 00:00:00 2001 From: Nicole Cordes Date: Fri, 31 Mar 2017 17:09:04 +0200 Subject: [PATCH 3/4] Use long array sysntax for PHP 5.3 compatibility --- .../Test/Package/Version/VersionGuesserTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Composer/Test/Package/Version/VersionGuesserTest.php b/tests/Composer/Test/Package/Version/VersionGuesserTest.php index 3e37e67c1..f5a4497d9 100644 --- a/tests/Composer/Test/Package/Version/VersionGuesserTest.php +++ b/tests/Composer/Test/Package/Version/VersionGuesserTest.php @@ -163,7 +163,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') - ->setMethods(['execute']) + ->setMethods(array('execute')) ->disableArgumentCloning() ->disableOriginalConstructor() ->getMock(); @@ -181,9 +181,9 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase }); $config = new Config; - $config->merge(['repositories' => ['packagist' => false]]); + $config->merge(array('repositories' => array('packagist' => false))); $guesser = new VersionGuesser($config, $executor, new VersionParser()); - $versionData = $guesser->guessVersion([], 'dummy/path'); + $versionData = $guesser->guessVersion(array(), 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } @@ -193,7 +193,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') - ->setMethods(['execute']) + ->setMethods(array('execute')) ->disableArgumentCloning() ->disableOriginalConstructor() ->getMock(); @@ -211,9 +211,9 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase }); $config = new Config; - $config->merge(['repositories' => ['packagist' => false]]); + $config->merge(array('repositories' => array('packagist' => false))); $guesser = new VersionGuesser($config, $executor, new VersionParser()); - $versionData = $guesser->guessVersion([], 'dummy/path'); + $versionData = $guesser->guessVersion(array(), 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } From d834fcfac562a2fcd424bafb9c3c8dc1fda193b1 Mon Sep 17 00:00:00 2001 From: Nicole Cordes Date: Mon, 3 Apr 2017 12:00:31 +0100 Subject: [PATCH 4/4] Change commitHash to match real life examples --- tests/Composer/Test/Package/Version/VersionGuesserTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Composer/Test/Package/Version/VersionGuesserTest.php b/tests/Composer/Test/Package/Version/VersionGuesserTest.php index f5a4497d9..fd687c87a 100644 --- a/tests/Composer/Test/Package/Version/VersionGuesserTest.php +++ b/tests/Composer/Test/Package/Version/VersionGuesserTest.php @@ -160,7 +160,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase public function testDetachedFetchHeadBecomesDevHashGit2() { - $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; + $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') ->setMethods(array('execute')) @@ -190,7 +190,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase public function testDetachedCommitHeadBecomesDevHashGit2() { - $commitHash = 'da53c52eddd5f32ffca64a7b3801bea'; + $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor') ->setMethods(array('execute')) @@ -205,7 +205,7 @@ class VersionGuesserTest extends \PHPUnit_Framework_TestCase ->method('execute') ->willReturnCallback(function ($command, &$output) use ($self, $commitHash) { $self->assertEquals('git branch --no-color --no-abbrev -v', $command); - $output = "* (HEAD detached at da53c52ed) $commitHash Commit message\n"; + $output = "* (HEAD detached at 03a15d220) $commitHash Commit message\n"; return 0; });