1
0
Fork 0

Treat default branch name as a non-feature-branch no matter what it is called

pull/8997/head
Jordi Boggiano 2020-06-19 14:12:44 +02:00
parent 4682efcf77
commit 6f0e5996de
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC
2 changed files with 117 additions and 12 deletions

View File

@ -154,8 +154,17 @@ class VersionGuesser
if ($isFeatureBranch) { if ($isFeatureBranch) {
$featureVersion = $version; $featureVersion = $version;
$featurePrettyVersion = $prettyVersion; $featurePrettyVersion = $prettyVersion;
// try to find name of default branch from git info
$defaultBranch = null;
if (0 === $this->process->execute('git remote show origin', $output) || 0 === $this->process->execute('git remote show upstream', $output)) {
if (preg_match('{^ HEAD branch: (.+)$}m', $output, $match)) {
$defaultBranch = trim($match[1]);
}
}
// try to find the best (nearest) version branch to assume this feature's version // try to find the best (nearest) version branch to assume this feature's version
$result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'git rev-list %candidate%..%branch%', $path); $result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'git rev-list %candidate%..%branch%', $path, $defaultBranch);
$version = $result['version']; $version = $result['version'];
$prettyVersion = $result['pretty_version']; $prettyVersion = $result['pretty_version'];
} }
@ -222,7 +231,7 @@ class VersionGuesser
$branches = array_keys($driver->getBranches()); $branches = array_keys($driver->getBranches());
// try to find the best (nearest) version branch to assume this feature's version // try to find the best (nearest) version branch to assume this feature's version
$result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'hg log -r "not ancestors(\'%candidate%\') and ancestors(\'%branch%\')" --template "{node}\\n"', $path); $result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'hg log -r "not ancestors(\'%candidate%\') and ancestors(\'%branch%\')" --template "{node}\\n"', $path, 'default');
$result['commit'] = ''; $result['commit'] = '';
$result['feature_version'] = $version; $result['feature_version'] = $version;
$result['feature_pretty_version'] = $version; $result['feature_pretty_version'] = $version;
@ -231,7 +240,7 @@ class VersionGuesser
} }
} }
private function guessFeatureVersion(array $packageConfig, $version, array $branches, $scmCmdline, $path) private function guessFeatureVersion(array $packageConfig, $version, array $branches, $scmCmdline, $path, $defaultBranch)
{ {
$prettyVersion = $version; $prettyVersion = $version;
@ -248,14 +257,14 @@ class VersionGuesser
$nonFeatureBranches = implode('|', $packageConfig['non-feature-branches']); $nonFeatureBranches = implode('|', $packageConfig['non-feature-branches']);
} }
foreach ($branches as $candidate) {
// return directly, if branch is configured to be non-feature branch // return directly, if branch is configured to be non-feature branch
if ($candidate === $branch && preg_match('{^(' . $nonFeatureBranches . ')$}', $candidate)) { if (preg_match('{^(' . $nonFeatureBranches . ')$}', $branch)) {
break; return array('version' => $version, 'pretty_version' => $prettyVersion);
} }
foreach ($branches as $candidate) {
// do not compare against itself or other feature branches // do not compare against itself or other feature branches
if ($candidate === $branch || !preg_match('{^(' . $nonFeatureBranches . '|master|trunk|default|develop|\d+\..+)$}', $candidate, $match)) { if ($candidate === $branch || !preg_match('{^(' . $nonFeatureBranches . ($defaultBranch ? '|'.preg_quote($defaultBranch) : '').'|master|trunk|default|develop|\d+\..+)$}', $candidate, $match)) {
continue; continue;
} }

View File

@ -135,6 +135,64 @@ class VersionGuesserTest extends TestCase
$this->assertEquals($commitHash, $versionArray['commit']); $this->assertEquals($commitHash, $versionArray['commit']);
} }
public function testGuessVersionReadsAndRespectsDefaultBranchAsNonFeatureBranch()
{
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea';
$executor = $this->getMockBuilder('\\Composer\\Util\\ProcessExecutor')
->setMethods(array('execute'))
->disableArgumentCloning()
->disableOriginalConstructor()
->getMock()
;
$self = $this;
$executor
->expects($this->at(0))
->method('execute')
->willReturnCallback(function ($command, &$output) use ($self, $commitHash, $anotherCommitHash) {
$self->assertEquals('git branch --no-color --no-abbrev -v', $command);
$output = " arbitrary $commitHash Commit message\n* current $anotherCommitHash Another message\n";
return 0;
})
;
$executor
->expects($this->at(1))
->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git remote show origin', $command);
$output = " HEAD branch: arbitrary\r\n";
return 0;
})
;
$executor
->expects($this->at(2))
->method('execute')
->willReturnCallback(function ($command, &$output, $path) use ($self, $anotherCommitHash) {
$self->assertEquals('git rev-list arbitrary..current', $command);
$output = "$anotherCommitHash\n";
return 0;
})
;
$config = new Config;
$config->merge(array('repositories' => array('packagist' => false)));
$guesser = new VersionGuesser($config, $executor, new VersionParser());
$versionArray = $guesser->guessVersion(array('version' => 'self.version'), 'dummy/path');
$this->assertEquals("dev-arbitrary", $versionArray['version']);
$this->assertEquals($anotherCommitHash, $versionArray['commit']);
$this->assertEquals("dev-current", $versionArray['feature_version']);
$this->assertEquals("dev-current", $versionArray['feature_pretty_version']);
}
public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationForArbitraryNaming() public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationForArbitraryNaming()
{ {
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
@ -163,6 +221,17 @@ class VersionGuesserTest extends TestCase
$executor $executor
->expects($this->at(1)) ->expects($this->at(1))
->method('execute') ->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git remote show origin', $command);
$output = " HEAD branch: foo\r\n";
return 0;
})
;
$executor
->expects($this->at(2))
->method('execute')
->willReturnCallback(function ($command, &$output, $path) use ($self, $anotherCommitHash) { ->willReturnCallback(function ($command, &$output, $path) use ($self, $anotherCommitHash) {
$self->assertEquals('git rev-list arbitrary..current', $command); $self->assertEquals('git rev-list arbitrary..current', $command);
$output = "$anotherCommitHash\n"; $output = "$anotherCommitHash\n";
@ -206,10 +275,19 @@ class VersionGuesserTest extends TestCase
return 0; return 0;
}) })
; ;
$executor $executor
->expects($this->at(1)) ->expects($this->at(1))
->method('execute') ->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git remote show origin', $command);
$output = " HEAD branch: foo\r\n";
return 0;
})
;
$executor
->expects($this->at(2))
->method('execute')
->willReturnCallback(function ($command, &$output, $path) use ($self, $anotherCommitHash) { ->willReturnCallback(function ($command, &$output, $path) use ($self, $anotherCommitHash) {
$self->assertEquals('git rev-list latest-testing..current', $command); $self->assertEquals('git rev-list latest-testing..current', $command);
$output = "$anotherCommitHash\n"; $output = "$anotherCommitHash\n";
@ -378,10 +456,19 @@ class VersionGuesserTest extends TestCase
return 0; return 0;
}) })
; ;
$executor $executor
->expects($this->at(1)) ->expects($this->at(1))
->method('execute') ->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git remote show origin', $command);
$output = " HEAD branch: foo\r\n";
return 0;
})
;
$executor
->expects($this->at(2))
->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) { ->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git describe --exact-match --tags', $command); $self->assertEquals('git describe --exact-match --tags', $command);
$output = "v2.0.5-alpha2"; $output = "v2.0.5-alpha2";
@ -419,10 +506,19 @@ class VersionGuesserTest extends TestCase
return 0; return 0;
}) })
; ;
$executor $executor
->expects($this->at(1)) ->expects($this->at(1))
->method('execute') ->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git remote show origin', $command);
$output = " HEAD branch: foo\r\n";
return 0;
})
;
$executor
->expects($this->at(2))
->method('execute')
->willReturnCallback(function ($command, &$output) use ($self) { ->willReturnCallback(function ($command, &$output) use ($self) {
$self->assertEquals('git describe --exact-match --tags', $command); $self->assertEquals('git describe --exact-match --tags', $command);
$output = '1.0.0'; $output = '1.0.0';