mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
fix exclusion sub-directory
This commit is contained in:
@@ -34,7 +34,7 @@ class BuildTrigger extends Validator
|
||||
}
|
||||
|
||||
// A pattern is "specific" when it contains no wildcard characters.
|
||||
$isSpecific = fn ($p) => !str_contains($p, '*') && !str_contains($p, '?');
|
||||
$isSpecific = fn ($pattern) => !str_contains($pattern, '*') && !str_contains($pattern, '?');
|
||||
|
||||
// 1. Specific inclusion always wins — an explicit exact match is never blocked.
|
||||
foreach ($include as $pattern) {
|
||||
@@ -43,15 +43,14 @@ class BuildTrigger extends Validator
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Specific exclusion overrides a wildcard inclusion — refines broad patterns.
|
||||
// 2. Any exclusion (specific or wildcard) overrides a wildcard inclusion — refines broad patterns.
|
||||
foreach ($exclude as $pattern) {
|
||||
$raw = substr($pattern, 1);
|
||||
if ($isSpecific($raw) && $this->matchGlob($value, $raw)) {
|
||||
if ($this->matchGlob($value, substr($pattern, 1))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Wildcard inclusion wins over any remaining wildcard exclusion.
|
||||
// 3. Wildcard inclusion — no exclusion blocked it.
|
||||
foreach ($include as $pattern) {
|
||||
if (!$isSpecific($pattern) && $this->matchGlob($value, $pattern)) {
|
||||
return true;
|
||||
@@ -64,7 +63,7 @@ class BuildTrigger extends Validator
|
||||
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Value must match a specific inclusion, or a wildcard inclusion not overridden by a specific exclusion.';
|
||||
return 'Value must match a specific inclusion, or a wildcard inclusion not overridden by any exclusion.';
|
||||
}
|
||||
|
||||
public function isArray(): bool
|
||||
|
||||
@@ -229,6 +229,17 @@ class BuildTriggerTest extends TestCase
|
||||
$this->assertFalse($validator->isValid('develop')); // no inclusion match
|
||||
}
|
||||
|
||||
public function testWildcardExclusionOverridesWildcardInclusion(): void
|
||||
{
|
||||
// src/** is a broad inclusion; !src/generated/** carves out the generated subtree
|
||||
$validator = new BuildTrigger(['src/**', '!src/generated/**']);
|
||||
$this->assertTrue($validator->isValid('src/components/Button.php'));
|
||||
$this->assertTrue($validator->isValid('src/utils/helper.js'));
|
||||
$this->assertFalse($validator->isValid('src/generated/Foo.php')); // wildcard exclusion wins
|
||||
$this->assertFalse($validator->isValid('src/generated/bar/Baz.php')); // wildcard exclusion wins
|
||||
$this->assertFalse($validator->isValid('lib/other.php')); // no inclusion match
|
||||
}
|
||||
|
||||
public function testSpecificInclusionOverridesWildcardExclusion(): void
|
||||
{
|
||||
// Narrow allowlist with a carve-out: exclude all of feature/* except feature/hotfix/critical
|
||||
|
||||
Reference in New Issue
Block a user