From 8133457a71c0c12102379b4a911ffe5301b33db0 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 12 May 2026 15:19:05 +0530 Subject: [PATCH 1/9] feat: add DeploymentSkippable for commit-message skip detection Introduces Utopia\VCS\DeploymentSkippable with a static fromCommitMessage(mixed $message): bool method that returns true when a commit message contains a recognised skip directive such as [skip ci], [skip deploy], [no appwrite], etc. Matching is case-insensitive. Non-string input returns false. Supported directives: [skip ci], [ci skip], [no ci], [skip action], [action skip], [no action], [skip actions], [actions skip], [no actions], [skip deploy], [deploy skip], [no deploy], [skip appwrite], [appwrite skip], [no appwrite]. --- src/VCS/DeploymentSkippable.php | 41 ++++++++++++++++ tests/VCS/DeploymentSkippableTest.php | 68 +++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/VCS/DeploymentSkippable.php create mode 100644 tests/VCS/DeploymentSkippableTest.php diff --git a/src/VCS/DeploymentSkippable.php b/src/VCS/DeploymentSkippable.php new file mode 100644 index 00000000..55a09137 --- /dev/null +++ b/src/VCS/DeploymentSkippable.php @@ -0,0 +1,41 @@ +assertTrue(DeploymentSkippable::fromCommitMessage('[skip ci] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[ci skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no ci] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip action] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[action skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no action] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip actions] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[actions skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no actions] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[deploy skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip appwrite] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[appwrite skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no appwrite] update changelog')); + } + + public function testKnownSkipDirectivesAreCaseInsensitive(): void + { + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[SKIP CI] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[Skip Deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[SKIP APPWRITE] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[Appwrite Skip] update changelog')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('[No Actions] update changelog')); + } + + public function testMessageWithoutKnownDirectiveProceeds(): void + { + $this->assertFalse(DeploymentSkippable::fromCommitMessage('fix: real bug fix')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('feat: add new feature')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('skip deploy without brackets')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('deploy this please')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('skip-checks:true')); + } + + public function testDirectiveCanAppearAnywhere(): void + { + $this->assertTrue(DeploymentSkippable::fromCommitMessage('docs: update readme [skip deploy]')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('docs: update readme[skip deploy]')); + $this->assertTrue(DeploymentSkippable::fromCommitMessage('prefix[skip deploy]suffix')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('refactor: skip appwrite cache seeding')); + $this->assertFalse(DeploymentSkippable::fromCommitMessage('fix: appwrite skip quota check in tests')); + } + + public function testMultilineCommitMessageSkips(): void + { + $message = "feat: add new stuff\n\nMore detail here.\n\n[skip deploy]"; + + $this->assertTrue(DeploymentSkippable::fromCommitMessage($message)); + } + + public function testNonStringCommitMessageProceeds(): void + { + $this->assertFalse(DeploymentSkippable::fromCommitMessage(null)); + $this->assertFalse(DeploymentSkippable::fromCommitMessage([])); + } +} From 6506e945952be04bc5406d624f3e66f8650ea1b6 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 12 May 2026 15:24:45 +0530 Subject: [PATCH 2/9] refactor: rename fromCommitMessage to isSkippedByCommitMessage, add final + private constructor - fromCommitMessage follows the PHP named-constructor convention and is misleading for a bool-returning predicate; isSkippedByCommitMessage makes the intent unambiguous - Mark class final and add a private constructor to prevent meaningless instantiation and subclassing --- src/VCS/DeploymentSkippable.php | 6 ++- tests/VCS/DeploymentSkippableTest.php | 66 +++++++++++++-------------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/VCS/DeploymentSkippable.php b/src/VCS/DeploymentSkippable.php index 55a09137..062c5df1 100644 --- a/src/VCS/DeploymentSkippable.php +++ b/src/VCS/DeploymentSkippable.php @@ -2,8 +2,10 @@ namespace Utopia\VCS; -class DeploymentSkippable +final class DeploymentSkippable { + private function __construct() {} + private const PATTERNS = [ '[skip ci]', '[ci skip]', @@ -22,7 +24,7 @@ class DeploymentSkippable '[no appwrite]', ]; - public static function fromCommitMessage(mixed $message): bool + public static function isSkippedByCommitMessage(mixed $message): bool { if (!is_string($message)) { return false; diff --git a/tests/VCS/DeploymentSkippableTest.php b/tests/VCS/DeploymentSkippableTest.php index 5897c40a..ecacea05 100644 --- a/tests/VCS/DeploymentSkippableTest.php +++ b/tests/VCS/DeploymentSkippableTest.php @@ -9,60 +9,60 @@ class DeploymentSkippableTest extends TestCase { public function testKnownSkipDirectivesSkip(): void { - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip ci] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[ci skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no ci] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip action] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[action skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no action] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip actions] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[actions skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no actions] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[deploy skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[skip appwrite] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[appwrite skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[no appwrite] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip ci] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[ci skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no ci] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip action] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[action skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no action] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip actions] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[actions skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no actions] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[deploy skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip appwrite] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[appwrite skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no appwrite] update changelog')); } public function testKnownSkipDirectivesAreCaseInsensitive(): void { - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[SKIP CI] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[Skip Deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[SKIP APPWRITE] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[Appwrite Skip] update changelog')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('[No Actions] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[SKIP CI] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[Skip Deploy] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[SKIP APPWRITE] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[Appwrite Skip] update changelog')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[No Actions] update changelog')); } public function testMessageWithoutKnownDirectiveProceeds(): void { - $this->assertFalse(DeploymentSkippable::fromCommitMessage('fix: real bug fix')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('feat: add new feature')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('skip deploy without brackets')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('deploy this please')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('skip-checks:true')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('fix: real bug fix')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('feat: add new feature')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('skip deploy without brackets')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('deploy this please')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('skip-checks:true')); } public function testDirectiveCanAppearAnywhere(): void { - $this->assertTrue(DeploymentSkippable::fromCommitMessage('docs: update readme [skip deploy]')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('docs: update readme[skip deploy]')); - $this->assertTrue(DeploymentSkippable::fromCommitMessage('prefix[skip deploy]suffix')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('refactor: skip appwrite cache seeding')); - $this->assertFalse(DeploymentSkippable::fromCommitMessage('fix: appwrite skip quota check in tests')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('docs: update readme [skip deploy]')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('docs: update readme[skip deploy]')); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('prefix[skip deploy]suffix')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('refactor: skip appwrite cache seeding')); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('fix: appwrite skip quota check in tests')); } public function testMultilineCommitMessageSkips(): void { $message = "feat: add new stuff\n\nMore detail here.\n\n[skip deploy]"; - $this->assertTrue(DeploymentSkippable::fromCommitMessage($message)); + $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage($message)); } public function testNonStringCommitMessageProceeds(): void { - $this->assertFalse(DeploymentSkippable::fromCommitMessage(null)); - $this->assertFalse(DeploymentSkippable::fromCommitMessage([])); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage(null)); + $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage([])); } } From 35551886c3c47699867032d8cd4d2f8a613e4d93 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 12 May 2026 17:20:12 +0530 Subject: [PATCH 3/9] fix lint --- src/VCS/DeploymentSkippable.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/VCS/DeploymentSkippable.php b/src/VCS/DeploymentSkippable.php index 062c5df1..abb3c82d 100644 --- a/src/VCS/DeploymentSkippable.php +++ b/src/VCS/DeploymentSkippable.php @@ -4,7 +4,9 @@ final class DeploymentSkippable { - private function __construct() {} + private function __construct() + { + } private const PATTERNS = [ '[skip ci]', From 8e649da5b02443ead01a7bf42762201c7ea3e770 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 13 May 2026 18:06:35 +0530 Subject: [PATCH 4/9] refactor: move DeploymentSkippable to Validator folder, extend Utopia\Validator --- composer.json | 3 +- .../{ => Validator}/DeploymentSkippable.php | 33 +++++--- tests/VCS/DeploymentSkippableTest.php | 75 ++++++++++--------- 3 files changed, 66 insertions(+), 45 deletions(-) rename src/VCS/{ => Validator}/DeploymentSkippable.php (51%) diff --git a/composer.json b/composer.json index 98361192..136210ff 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ "php": ">=8.0", "adhocore/jwt": "^1.1", "utopia-php/cache": "1.0.*", - "utopia-php/fetch": "^1.1" + "utopia-php/fetch": "^1.1", + "utopia-php/framework": "^1.2" }, "require-dev": { "phpunit/phpunit": "^9.4", diff --git a/src/VCS/DeploymentSkippable.php b/src/VCS/Validator/DeploymentSkippable.php similarity index 51% rename from src/VCS/DeploymentSkippable.php rename to src/VCS/Validator/DeploymentSkippable.php index abb3c82d..d84428e5 100644 --- a/src/VCS/DeploymentSkippable.php +++ b/src/VCS/Validator/DeploymentSkippable.php @@ -1,13 +1,11 @@ validator = new DeploymentSkippable(); + } + public function testKnownSkipDirectivesSkip(): void { - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip ci] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[ci skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no ci] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip action] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[action skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no action] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip actions] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[actions skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no actions] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[deploy skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[skip appwrite] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[appwrite skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[no appwrite] update changelog')); + $this->assertTrue($this->validator->isValid('[skip ci] update changelog')); + $this->assertTrue($this->validator->isValid('[ci skip] update changelog')); + $this->assertTrue($this->validator->isValid('[no ci] update changelog')); + $this->assertTrue($this->validator->isValid('[skip action] update changelog')); + $this->assertTrue($this->validator->isValid('[action skip] update changelog')); + $this->assertTrue($this->validator->isValid('[no action] update changelog')); + $this->assertTrue($this->validator->isValid('[skip actions] update changelog')); + $this->assertTrue($this->validator->isValid('[actions skip] update changelog')); + $this->assertTrue($this->validator->isValid('[no actions] update changelog')); + $this->assertTrue($this->validator->isValid('[skip deploy] update changelog')); + $this->assertTrue($this->validator->isValid('[deploy skip] update changelog')); + $this->assertTrue($this->validator->isValid('[no deploy] update changelog')); + $this->assertTrue($this->validator->isValid('[skip appwrite] update changelog')); + $this->assertTrue($this->validator->isValid('[appwrite skip] update changelog')); + $this->assertTrue($this->validator->isValid('[no appwrite] update changelog')); } public function testKnownSkipDirectivesAreCaseInsensitive(): void { - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[SKIP CI] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[Skip Deploy] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[SKIP APPWRITE] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[Appwrite Skip] update changelog')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('[No Actions] update changelog')); + $this->assertTrue($this->validator->isValid('[SKIP CI] update changelog')); + $this->assertTrue($this->validator->isValid('[Skip Deploy] update changelog')); + $this->assertTrue($this->validator->isValid('[SKIP APPWRITE] update changelog')); + $this->assertTrue($this->validator->isValid('[Appwrite Skip] update changelog')); + $this->assertTrue($this->validator->isValid('[No Actions] update changelog')); } public function testMessageWithoutKnownDirectiveProceeds(): void { - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('fix: real bug fix')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('feat: add new feature')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('skip deploy without brackets')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('deploy this please')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('skip-checks:true')); + $this->assertFalse($this->validator->isValid('fix: real bug fix')); + $this->assertFalse($this->validator->isValid('feat: add new feature')); + $this->assertFalse($this->validator->isValid('skip deploy without brackets')); + $this->assertFalse($this->validator->isValid('deploy this please')); + $this->assertFalse($this->validator->isValid('skip-checks:true')); } public function testDirectiveCanAppearAnywhere(): void { - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('docs: update readme [skip deploy]')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('docs: update readme[skip deploy]')); - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage('prefix[skip deploy]suffix')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('refactor: skip appwrite cache seeding')); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage('fix: appwrite skip quota check in tests')); + $this->assertTrue($this->validator->isValid('docs: update readme [skip deploy]')); + $this->assertTrue($this->validator->isValid('docs: update readme[skip deploy]')); + $this->assertTrue($this->validator->isValid('prefix[skip deploy]suffix')); + $this->assertFalse($this->validator->isValid('refactor: skip appwrite cache seeding')); + $this->assertFalse($this->validator->isValid('fix: appwrite skip quota check in tests')); } public function testMultilineCommitMessageSkips(): void { $message = "feat: add new stuff\n\nMore detail here.\n\n[skip deploy]"; - $this->assertTrue(DeploymentSkippable::isSkippedByCommitMessage($message)); + $this->assertTrue($this->validator->isValid($message)); } public function testNonStringCommitMessageProceeds(): void { - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage(null)); - $this->assertFalse(DeploymentSkippable::isSkippedByCommitMessage([])); + $this->assertFalse($this->validator->isValid(null)); + $this->assertFalse($this->validator->isValid([])); } } From 2d04e803c9e3a118838fbe5d1c35fe8cfe050601 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 13 May 2026 18:10:49 +0530 Subject: [PATCH 5/9] refactor: move DeploymentSkippableTest to Unit/Validator folder --- tests/VCS/{ => Unit/Validator}/DeploymentSkippableTest.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/VCS/{ => Unit/Validator}/DeploymentSkippableTest.php (100%) diff --git a/tests/VCS/DeploymentSkippableTest.php b/tests/VCS/Unit/Validator/DeploymentSkippableTest.php similarity index 100% rename from tests/VCS/DeploymentSkippableTest.php rename to tests/VCS/Unit/Validator/DeploymentSkippableTest.php From a1ab7bc543521a5739cf0840e98db07883ba8daf Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 13 May 2026 18:11:37 +0530 Subject: [PATCH 6/9] fix: add missing comma in composer.json require block --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a71be9cc..0ab6e2bb 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "require": { "php": ">=8.2", "adhocore/jwt": "^1.1", - "utopia-php/framework": "^1.2" + "utopia-php/framework": "^1.2", "utopia-php/cache": "^2.0", "utopia-php/fetch": "^1.1" }, From 14ef81e4590a4bdfbb5833b9e0663b51251065c5 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 13 May 2026 18:13:56 +0530 Subject: [PATCH 7/9] chore: update composer.lock with utopia-php/framework --- composer.lock | 263 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 256 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index bc842a5c..e3f8f260 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "21b37b7bff901c1c81b99777291b45b7", + "content-hash": "e2e461cc8fcd4c0ce5e4689f216e31f3", "packages": [ { "name": "adhocore/jwt", @@ -2051,6 +2051,103 @@ }, "time": "2026-05-12T04:27:08+00:00" }, + { + "name": "utopia-php/compression", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/utopia-php/compression.git", + "reference": "68045cb9d714c1259582d2dfd0e76bd34f83e713" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/compression/zipball/68045cb9d714c1259582d2dfd0e76bd34f83e713", + "reference": "68045cb9d714c1259582d2dfd0e76bd34f83e713", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "laravel/pint": "1.2.*", + "phpunit/phpunit": "^9.3", + "vimeo/psalm": "4.0.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\Compression\\": "src/Compression" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A simple Compression library to handle file compression", + "keywords": [ + "compression", + "framework", + "php", + "upf", + "utopia" + ], + "support": { + "issues": "https://github.com/utopia-php/compression/issues", + "source": "https://github.com/utopia-php/compression/tree/0.1.4" + }, + "time": "2026-02-17T05:53:40+00:00" + }, + { + "name": "utopia-php/di", + "version": "0.3.2", + "source": { + "type": "git", + "url": "https://github.com/utopia-php/di.git", + "reference": "07025d721ed5d9be27932e8e640acf1467fc4b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/di/zipball/07025d721ed5d9be27932e8e640acf1467fc4b9d", + "reference": "07025d721ed5d9be27932e8e640acf1467fc4b9d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^2.0" + }, + "require-dev": { + "laravel/pint": "^1.27", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.5.25", + "swoole/ide-helper": "4.8.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\": "src/", + "Tests\\E2E\\": "tests/e2e" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A simple and lite library for managing dependency injections", + "keywords": [ + "PSR-11", + "container", + "dependency-injection", + "di", + "php", + "utopia" + ], + "support": { + "issues": "https://github.com/utopia-php/di/issues", + "source": "https://github.com/utopia-php/di/tree/0.3.2" + }, + "time": "2026-03-21T07:42:10+00:00" + }, { "name": "utopia-php/fetch", "version": "1.1.2", @@ -2091,6 +2188,59 @@ }, "time": "2026-04-29T11:19:19+00:00" }, + { + "name": "utopia-php/framework", + "version": "1.2.5", + "source": { + "type": "git", + "url": "https://github.com/utopia-php/http.git", + "reference": "8701b93833176bfbf65aaf7dee62bbaee0715026" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/http/zipball/8701b93833176bfbf65aaf7dee62bbaee0715026", + "reference": "8701b93833176bfbf65aaf7dee62bbaee0715026", + "shasum": "" + }, + "require": { + "ext-swoole": "*", + "php": ">=8.1", + "utopia-php/compression": "0.1.*", + "utopia-php/servers": "0.3.*", + "utopia-php/telemetry": "0.2.*", + "utopia-php/validators": "0.2.*" + }, + "require-dev": { + "ext-xdebug": "*", + "laravel/pint": "^1.2", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "1.*", + "phpunit/phpunit": "^9.5.25", + "swoole/ide-helper": "4.8.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A simple, light and advanced PHP HTTP framework", + "keywords": [ + "framework", + "http", + "php", + "upf" + ], + "support": { + "issues": "https://github.com/utopia-php/http/issues", + "source": "https://github.com/utopia-php/http/tree/1.2.5" + }, + "time": "2026-03-16T06:56:51+00:00" + }, { "name": "utopia-php/pools", "version": "1.0.3", @@ -2145,17 +2295,71 @@ "time": "2026-02-26T08:42:40+00:00" }, { - "name": "utopia-php/telemetry", + "name": "utopia-php/servers", "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/utopia-php/servers.git", + "reference": "235be31200df9437fc96a1c270ffef4c64fafe52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/servers/zipball/235be31200df9437fc96a1c270ffef4c64fafe52", + "reference": "235be31200df9437fc96a1c270ffef4c64fafe52", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "utopia-php/di": "0.3.*", + "utopia-php/validators": "0.*" + }, + "require-dev": { + "laravel/pint": "^0.2.3", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\Servers\\": "src/Servers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Team Appwrite", + "email": "team@appwrite.io" + } + ], + "description": "A base library for building Utopia style servers.", + "keywords": [ + "framework", + "php", + "servers", + "upf", + "utopia" + ], + "support": { + "issues": "https://github.com/utopia-php/servers/issues", + "source": "https://github.com/utopia-php/servers/tree/0.3.0" + }, + "time": "2026-03-13T11:31:42+00:00" + }, + { + "name": "utopia-php/telemetry", + "version": "0.2.0", "source": { "type": "git", "url": "https://github.com/utopia-php/telemetry.git", - "reference": "62bbadad03e593b071b8ca63fac2c117c1900991" + "reference": "9997ebf59bb77920a7223ad73d834a76b09152c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/telemetry/zipball/62bbadad03e593b071b8ca63fac2c117c1900991", - "reference": "62bbadad03e593b071b8ca63fac2c117c1900991", + "url": "https://api.github.com/repos/utopia-php/telemetry/zipball/9997ebf59bb77920a7223ad73d834a76b09152c3", + "reference": "9997ebf59bb77920a7223ad73d834a76b09152c3", "shasum": "" }, "require": { @@ -2195,9 +2399,54 @@ ], "support": { "issues": "https://github.com/utopia-php/telemetry/issues", - "source": "https://github.com/utopia-php/telemetry/tree/0.3.0" + "source": "https://github.com/utopia-php/telemetry/tree/0.2.0" + }, + "time": "2025-12-17T07:56:38+00:00" + }, + { + "name": "utopia-php/validators", + "version": "0.2.2", + "source": { + "type": "git", + "url": "https://github.com/utopia-php/validators.git", + "reference": "5d7d494e64457cd4eb67fdcfd9481f2c89796aa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/validators/zipball/5d7d494e64457cd4eb67fdcfd9481f2c89796aa6", + "reference": "5d7d494e64457cd4eb67fdcfd9481f2c89796aa6", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "laravel/pint": "1.*", + "phpstan/phpstan": "2.*", + "phpunit/phpunit": "11.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A lightweight collection of reusable validators for Utopia projects", + "keywords": [ + "php", + "utopia", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/utopia-php/validators/issues", + "source": "https://github.com/utopia-php/validators/tree/0.2.2" }, - "time": "2026-04-01T13:52:56+00:00" + "time": "2026-04-27T16:30:24+00:00" } ], "packages-dev": [ From 8ded73ac3711bf6a4e884141d93d017dc10eeb14 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 13 May 2026 18:18:22 +0530 Subject: [PATCH 8/9] fix: replace utopia-php/framework with utopia-php/validators to avoid Swoole dependency --- composer.json | 2 +- composer.lock | 218 ++------------------------------------------------ 2 files changed, 8 insertions(+), 212 deletions(-) diff --git a/composer.json b/composer.json index 0ab6e2bb..f88494d5 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "require": { "php": ">=8.2", "adhocore/jwt": "^1.1", - "utopia-php/framework": "^1.2", + "utopia-php/validators": "^0.2", "utopia-php/cache": "^2.0", "utopia-php/fetch": "^1.1" }, diff --git a/composer.lock b/composer.lock index e3f8f260..27313abd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e2e461cc8fcd4c0ce5e4689f216e31f3", + "content-hash": "b8dafeca0eca87cf77089116e16b118d", "packages": [ { "name": "adhocore/jwt", @@ -2051,103 +2051,6 @@ }, "time": "2026-05-12T04:27:08+00:00" }, - { - "name": "utopia-php/compression", - "version": "0.1.4", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/compression.git", - "reference": "68045cb9d714c1259582d2dfd0e76bd34f83e713" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/compression/zipball/68045cb9d714c1259582d2dfd0e76bd34f83e713", - "reference": "68045cb9d714c1259582d2dfd0e76bd34f83e713", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "laravel/pint": "1.2.*", - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Compression\\": "src/Compression" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A simple Compression library to handle file compression", - "keywords": [ - "compression", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/compression/issues", - "source": "https://github.com/utopia-php/compression/tree/0.1.4" - }, - "time": "2026-02-17T05:53:40+00:00" - }, - { - "name": "utopia-php/di", - "version": "0.3.2", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/di.git", - "reference": "07025d721ed5d9be27932e8e640acf1467fc4b9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/di/zipball/07025d721ed5d9be27932e8e640acf1467fc4b9d", - "reference": "07025d721ed5d9be27932e8e640acf1467fc4b9d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/container": "^2.0" - }, - "require-dev": { - "laravel/pint": "^1.27", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^9.5.25", - "swoole/ide-helper": "4.8.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\": "src/", - "Tests\\E2E\\": "tests/e2e" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A simple and lite library for managing dependency injections", - "keywords": [ - "PSR-11", - "container", - "dependency-injection", - "di", - "php", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/di/issues", - "source": "https://github.com/utopia-php/di/tree/0.3.2" - }, - "time": "2026-03-21T07:42:10+00:00" - }, { "name": "utopia-php/fetch", "version": "1.1.2", @@ -2188,59 +2091,6 @@ }, "time": "2026-04-29T11:19:19+00:00" }, - { - "name": "utopia-php/framework", - "version": "1.2.5", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/http.git", - "reference": "8701b93833176bfbf65aaf7dee62bbaee0715026" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/8701b93833176bfbf65aaf7dee62bbaee0715026", - "reference": "8701b93833176bfbf65aaf7dee62bbaee0715026", - "shasum": "" - }, - "require": { - "ext-swoole": "*", - "php": ">=8.1", - "utopia-php/compression": "0.1.*", - "utopia-php/servers": "0.3.*", - "utopia-php/telemetry": "0.2.*", - "utopia-php/validators": "0.2.*" - }, - "require-dev": { - "ext-xdebug": "*", - "laravel/pint": "^1.2", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "1.*", - "phpunit/phpunit": "^9.5.25", - "swoole/ide-helper": "4.8.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A simple, light and advanced PHP HTTP framework", - "keywords": [ - "framework", - "http", - "php", - "upf" - ], - "support": { - "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/1.2.5" - }, - "time": "2026-03-16T06:56:51+00:00" - }, { "name": "utopia-php/pools", "version": "1.0.3", @@ -2294,72 +2144,18 @@ }, "time": "2026-02-26T08:42:40+00:00" }, - { - "name": "utopia-php/servers", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/servers.git", - "reference": "235be31200df9437fc96a1c270ffef4c64fafe52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/servers/zipball/235be31200df9437fc96a1c270ffef4c64fafe52", - "reference": "235be31200df9437fc96a1c270ffef4c64fafe52", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "utopia-php/di": "0.3.*", - "utopia-php/validators": "0.*" - }, - "require-dev": { - "laravel/pint": "^0.2.3", - "phpstan/phpstan": "^1.8", - "phpunit/phpunit": "^9.5.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Servers\\": "src/Servers" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Team Appwrite", - "email": "team@appwrite.io" - } - ], - "description": "A base library for building Utopia style servers.", - "keywords": [ - "framework", - "php", - "servers", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/servers/issues", - "source": "https://github.com/utopia-php/servers/tree/0.3.0" - }, - "time": "2026-03-13T11:31:42+00:00" - }, { "name": "utopia-php/telemetry", - "version": "0.2.0", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/utopia-php/telemetry.git", - "reference": "9997ebf59bb77920a7223ad73d834a76b09152c3" + "reference": "62bbadad03e593b071b8ca63fac2c117c1900991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/telemetry/zipball/9997ebf59bb77920a7223ad73d834a76b09152c3", - "reference": "9997ebf59bb77920a7223ad73d834a76b09152c3", + "url": "https://api.github.com/repos/utopia-php/telemetry/zipball/62bbadad03e593b071b8ca63fac2c117c1900991", + "reference": "62bbadad03e593b071b8ca63fac2c117c1900991", "shasum": "" }, "require": { @@ -2399,9 +2195,9 @@ ], "support": { "issues": "https://github.com/utopia-php/telemetry/issues", - "source": "https://github.com/utopia-php/telemetry/tree/0.2.0" + "source": "https://github.com/utopia-php/telemetry/tree/0.3.0" }, - "time": "2025-12-17T07:56:38+00:00" + "time": "2026-04-01T13:52:56+00:00" }, { "name": "utopia-php/validators", From 01917460fbe095d20f413ddbbe3b2dc93112d41f Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Thu, 14 May 2026 10:33:08 +0530 Subject: [PATCH 9/9] refactor: keep only [skip ci] pattern, update tests accordingly --- src/VCS/Validator/DeploymentSkippable.php | 28 +++++++++--------- .../Validator/DeploymentSkippableTest.php | 29 ++++--------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/VCS/Validator/DeploymentSkippable.php b/src/VCS/Validator/DeploymentSkippable.php index d84428e5..bd387a04 100644 --- a/src/VCS/Validator/DeploymentSkippable.php +++ b/src/VCS/Validator/DeploymentSkippable.php @@ -8,20 +8,20 @@ class DeploymentSkippable extends Validator { private const PATTERNS = [ '[skip ci]', - '[ci skip]', - '[no ci]', - '[skip action]', - '[action skip]', - '[no action]', - '[skip actions]', - '[actions skip]', - '[no actions]', - '[skip deploy]', - '[deploy skip]', - '[no deploy]', - '[skip appwrite]', - '[appwrite skip]', - '[no appwrite]', + // '[ci skip]', + // '[no ci]', + // '[skip action]', + // '[action skip]', + // '[no action]', + // '[skip actions]', + // '[actions skip]', + // '[no actions]', + // '[skip deploy]', + // '[deploy skip]', + // '[no deploy]', + // '[skip appwrite]', + // '[appwrite skip]', + // '[no appwrite]', ]; public function getDescription(): string diff --git a/tests/VCS/Unit/Validator/DeploymentSkippableTest.php b/tests/VCS/Unit/Validator/DeploymentSkippableTest.php index c8b967ab..44e8d25b 100644 --- a/tests/VCS/Unit/Validator/DeploymentSkippableTest.php +++ b/tests/VCS/Unit/Validator/DeploymentSkippableTest.php @@ -17,29 +17,11 @@ protected function setUp(): void public function testKnownSkipDirectivesSkip(): void { $this->assertTrue($this->validator->isValid('[skip ci] update changelog')); - $this->assertTrue($this->validator->isValid('[ci skip] update changelog')); - $this->assertTrue($this->validator->isValid('[no ci] update changelog')); - $this->assertTrue($this->validator->isValid('[skip action] update changelog')); - $this->assertTrue($this->validator->isValid('[action skip] update changelog')); - $this->assertTrue($this->validator->isValid('[no action] update changelog')); - $this->assertTrue($this->validator->isValid('[skip actions] update changelog')); - $this->assertTrue($this->validator->isValid('[actions skip] update changelog')); - $this->assertTrue($this->validator->isValid('[no actions] update changelog')); - $this->assertTrue($this->validator->isValid('[skip deploy] update changelog')); - $this->assertTrue($this->validator->isValid('[deploy skip] update changelog')); - $this->assertTrue($this->validator->isValid('[no deploy] update changelog')); - $this->assertTrue($this->validator->isValid('[skip appwrite] update changelog')); - $this->assertTrue($this->validator->isValid('[appwrite skip] update changelog')); - $this->assertTrue($this->validator->isValid('[no appwrite] update changelog')); } public function testKnownSkipDirectivesAreCaseInsensitive(): void { $this->assertTrue($this->validator->isValid('[SKIP CI] update changelog')); - $this->assertTrue($this->validator->isValid('[Skip Deploy] update changelog')); - $this->assertTrue($this->validator->isValid('[SKIP APPWRITE] update changelog')); - $this->assertTrue($this->validator->isValid('[Appwrite Skip] update changelog')); - $this->assertTrue($this->validator->isValid('[No Actions] update changelog')); } public function testMessageWithoutKnownDirectiveProceeds(): void @@ -53,16 +35,15 @@ public function testMessageWithoutKnownDirectiveProceeds(): void public function testDirectiveCanAppearAnywhere(): void { - $this->assertTrue($this->validator->isValid('docs: update readme [skip deploy]')); - $this->assertTrue($this->validator->isValid('docs: update readme[skip deploy]')); - $this->assertTrue($this->validator->isValid('prefix[skip deploy]suffix')); - $this->assertFalse($this->validator->isValid('refactor: skip appwrite cache seeding')); - $this->assertFalse($this->validator->isValid('fix: appwrite skip quota check in tests')); + $this->assertTrue($this->validator->isValid('docs: update readme [skip ci]')); + $this->assertTrue($this->validator->isValid('docs: update readme[skip ci]')); + $this->assertTrue($this->validator->isValid('prefix[skip ci]suffix')); + $this->assertFalse($this->validator->isValid('refactor: skip ci cache seeding')); } public function testMultilineCommitMessageSkips(): void { - $message = "feat: add new stuff\n\nMore detail here.\n\n[skip deploy]"; + $message = "feat: add new stuff\n\nMore detail here.\n\n[skip ci]"; $this->assertTrue($this->validator->isValid($message)); }