fix exclusion sub-directory

This commit is contained in:
Hemachandar
2026-03-24 17:09:38 +05:30
parent a6b875d3da
commit a7c1649c67
2 changed files with 16 additions and 6 deletions
+5 -6
View File
@@ -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