diff --git a/include/branches.inc b/include/branches.inc index 0cd6b6480c..e622f38ba4 100644 --- a/include/branches.inc +++ b/include/branches.inc @@ -1,7 +1,11 @@ 1) { - return "$parts[0].$parts[1]"; +function version_number_to_branch(string $value): ?string { + try { + $version = Version::fromString($value); + } catch (\InvalidArgumentException) { + return null; } - return null; + return sprintf( + '%s.%s', + $version->major()->toString(), + $version->minor()->toString(), + ); } function get_all_branches() { diff --git a/src/Release/Major.php b/src/Release/Major.php new file mode 100644 index 0000000000..dca4522a35 --- /dev/null +++ b/src/Release/Major.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Minor.php b/src/Release/Minor.php new file mode 100644 index 0000000000..c7f16970b2 --- /dev/null +++ b/src/Release/Minor.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Patch.php b/src/Release/Patch.php new file mode 100644 index 0000000000..bbafa32c65 --- /dev/null +++ b/src/Release/Patch.php @@ -0,0 +1,32 @@ +value; + } +} diff --git a/src/Release/Version.php b/src/Release/Version.php new file mode 100644 index 0000000000..4797509679 --- /dev/null +++ b/src/Release/Version.php @@ -0,0 +1,71 @@ +(0|[1-9]\d*))\.(?P(0|[1-9]\d*))\.(?P(0|[1-9]\d*))$/', $value, $matches)) { + throw new \ValueError(\sprintf( + 'Value "%s" does not appear to be a valid value for a version.', + $value, + )); + } + + return new self( + Major::fromString($matches['major']), + Minor::fromString($matches['minor']), + Patch::fromString($matches['patch']), + ); + } + + public function major(): Major + { + return $this->major; + } + + public function minor(): Minor + { + return $this->minor; + } + + public function patch(): Patch + { + return $this->patch; + } + + public function toString(): string + { + return sprintf( + '%s.%s.%s', + $this->major->toString(), + $this->minor->toString(), + $this->patch->toString(), + ); + } +} diff --git a/tests/Release/Major/from-string-rejects-invalid-value.phpt b/tests/Release/Major/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..25e7c547ab --- /dev/null +++ b/tests/Release/Major/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Major::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Major::fromString($value); + } catch (\ValueError) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/Release/Major/from-string-returns-major.phpt b/tests/Release/Major/from-string-returns-major.phpt new file mode 100644 index 0000000000..934edf30b1 --- /dev/null +++ b/tests/Release/Major/from-string-returns-major.phpt @@ -0,0 +1,17 @@ +--TEST-- +Major::fromString() returns Major +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "8" diff --git a/tests/Release/Minor/from-string-rejects-invalid-value.phpt b/tests/Release/Minor/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..eccda2154e --- /dev/null +++ b/tests/Release/Minor/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Minor::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Minor::fromString($value); + } catch (\ValueError) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/Release/Minor/from-string-returns-minor.phpt b/tests/Release/Minor/from-string-returns-minor.phpt new file mode 100644 index 0000000000..bddb876083 --- /dev/null +++ b/tests/Release/Minor/from-string-returns-minor.phpt @@ -0,0 +1,17 @@ +--TEST-- +Minor::fromString() returns Minor +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "3" diff --git a/tests/Release/Patch/from-string-rejects-invalid-value.phpt b/tests/Release/Patch/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..2455d6b8d1 --- /dev/null +++ b/tests/Release/Patch/from-string-rejects-invalid-value.phpt @@ -0,0 +1,41 @@ +--TEST-- +Patch::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-leading-zero' => '01', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Patch::fromString($value); + } catch (\ValueError) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(4) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-leading-zero"]=> + string(2) "01" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/Release/Patch/from-string-returns-patch.phpt b/tests/Release/Patch/from-string-returns-patch.phpt new file mode 100644 index 0000000000..ed60f42392 --- /dev/null +++ b/tests/Release/Patch/from-string-returns-patch.phpt @@ -0,0 +1,17 @@ +--TEST-- +Patch::fromString() returns Patch +--FILE-- +toString()); +?> +--EXPECT-- +string(1) "8" diff --git a/tests/Release/Version/create-returns-version.phpt b/tests/Release/Version/create-returns-version.phpt new file mode 100644 index 0000000000..193c9cc15f --- /dev/null +++ b/tests/Release/Version/create-returns-version.phpt @@ -0,0 +1,38 @@ +--TEST-- +Version::create() returns Version +--FILE-- +toString(), + $version->major()->toString(), + $version->minor()->toString(), + $version->patch()->toString(), +]); +?> +--EXPECT-- +array(4) { + [0]=> + string(5) "8.3.0" + [1]=> + string(1) "8" + [2]=> + string(1) "3" + [3]=> + string(1) "0" +} diff --git a/tests/Release/Version/from-string-rejects-invalid-value.phpt b/tests/Release/Version/from-string-rejects-invalid-value.phpt new file mode 100644 index 0000000000..e0f7c6f051 --- /dev/null +++ b/tests/Release/Version/from-string-rejects-invalid-value.phpt @@ -0,0 +1,53 @@ +--TEST-- +Version::fromString() rejects invalid values +--FILE-- + ' ', + 'string-empty' => '', + 'string-major' => '1', + 'string-major-minor' => '1.2', + 'string-major-minor-patch-where-major-has-leading-zero' => '01.2.3', + 'string-major-minor-patch-where-minor-has-leading-zero' => '1.02.3', + 'string-major-minor-patch-where-patch-has-leading-zero' => '1.2.03', + 'string-word' => 'foo', +]; + +$invalidValues = array_filter($values, static function (string $value): bool { + try { + Version::fromString($value); + } catch (\ValueError) { + return true; + } + + return false; +}); + +var_dump($invalidValues); +?> +--EXPECT-- +array(8) { + ["string-blank"]=> + string(1) " " + ["string-empty"]=> + string(0) "" + ["string-major"]=> + string(1) "1" + ["string-major-minor"]=> + string(3) "1.2" + ["string-major-minor-patch-where-major-has-leading-zero"]=> + string(6) "01.2.3" + ["string-major-minor-patch-where-minor-has-leading-zero"]=> + string(6) "1.02.3" + ["string-major-minor-patch-where-patch-has-leading-zero"]=> + string(6) "1.2.03" + ["string-word"]=> + string(3) "foo" +} diff --git a/tests/Release/Version/from-string-returns-version.phpt b/tests/Release/Version/from-string-returns-version.phpt new file mode 100644 index 0000000000..86504550f3 --- /dev/null +++ b/tests/Release/Version/from-string-returns-version.phpt @@ -0,0 +1,17 @@ +--TEST-- +Version::fromString() returns Version +--FILE-- +toString()); +?> +--EXPECT-- +string(5) "8.3.0"