diff --git a/composer.json b/composer.json index 9aa8a336..3541b214 100644 --- a/composer.json +++ b/composer.json @@ -48,5 +48,18 @@ "psr-4": { "Laminas\\AutomaticReleases\\Test\\Unit\\": "test/unit" } + }, + "scripts": { + "check": [ + "@cs-check", + "@static-analysis", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "static-analysis": "psalm --shepherd --stats", + "update-baseline": "psalm --update-baseline", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" } } diff --git a/feature/default-branch-switching.feature b/feature/default-branch-switching.feature index f169a83f..d70aba3b 100644 --- a/feature/default-branch-switching.feature +++ b/feature/default-branch-switching.feature @@ -40,7 +40,49 @@ Feature: Default branch switching | 1.3.x | And the default branch should be "1.3.x" - Scenario: A pre-existing branch of a greater major release is set as default branch on release + Scenario: A new minor branch on a pre-existing major branch is created and set as default branch on release + Given following existing branches: + | branch | + | 1.0.x | + | 1.1.x | + | 1.2.x | + | 2.0.x | + And following open milestones: + | name | + | 2.0.0 | + And the default branch is "1.0.x" + When I close milestone "2.0.0" + Then these should be the existing branches: + | branch | + | 1.0.x | + | 1.1.x | + | 1.2.x | + | 2.0.x | + | 2.1.x | + And the default branch should be "2.1.x" + + Scenario: A pre-existing branch of a new major release is not set as default branch on release + Given following existing branches: + | branch | + | 1.0.x | + | 1.1.x | + | 1.2.x | + | 2.0.x | + And following open milestones: + | name | + | 1.2.0 | + And the default branch is "1.0.x" + When I close milestone "1.2.0" + Then these should be the existing branches: + | branch | + | 1.0.x | + | 1.1.x | + | 1.2.x | + | 1.3.x | + | 2.0.x | + And the default branch should be "1.3.x" + + Scenario: A pre-existing minor branch of a greater major release is set as default branch on release Given following existing branches: | branch | | 1.0.x | diff --git a/src/Git/Value/MergeTargetCandidateBranches.php b/src/Git/Value/MergeTargetCandidateBranches.php index c8c2f610..1df65e22 100644 --- a/src/Git/Value/MergeTargetCandidateBranches.php +++ b/src/Git/Value/MergeTargetCandidateBranches.php @@ -82,7 +82,9 @@ public function newestFutureReleaseBranchAfter(SemVerVersion $version): BranchNa $futureReleaseBranch = Vec\filter( Vec\reverse($this->sortedBranches), static function (BranchName $branch) use ($nextMinor): bool { - return $nextMinor->lessThanEqual($branch->targetMinorReleaseVersion()); + $targetVersion = $branch->targetMinorReleaseVersion(); + + return ! $targetVersion->isNewMajorRelease() && $nextMinor->lessThanEqual($targetVersion); }, ); diff --git a/test/unit/Git/Value/MergeTargetCandidateBranchesTest.php b/test/unit/Git/Value/MergeTargetCandidateBranchesTest.php index d75b6ee6..875b31dd 100644 --- a/test/unit/Git/Value/MergeTargetCandidateBranchesTest.php +++ b/test/unit/Git/Value/MergeTargetCandidateBranchesTest.php @@ -159,6 +159,53 @@ public function testWillComputeFutureReleaseBranchFromCurrentRelease(): void ); } + public function testWillIgnoreNewMajorBranchesWhenComputingFutureReleaseBranchName(): void + { + $branches = MergeTargetCandidateBranches::fromAllBranches( + BranchName::fromName('2.0.x'), + BranchName::fromName('1.1.x'), + BranchName::fromName('1.4.x'), + BranchName::fromName('1.2.x'), + ); + + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.0.0')), + ); + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.1.0')), + ); + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.1.1')), + ); + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.2.0')), + ); + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.3.0')), + ); + self::assertEquals( + BranchName::fromName('1.4.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.3.1')), + ); + self::assertEquals( + BranchName::fromName('1.5.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.4.0')), + ); + self::assertEquals( + BranchName::fromName('1.6.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('1.5.0')), + ); + self::assertEquals( + BranchName::fromName('2.1.x'), + $branches->newestFutureReleaseBranchAfter(SemVerVersion::fromMilestoneName('2.0.0')), + ); + } + public function testWillIgnoreMasterBranchWhenComputingFutureReleaseBranchName(): void { $branches = MergeTargetCandidateBranches::fromAllBranches(