Skip to content

Commit 878d978

Browse files
committed
feat: Improve WildcardMatcher logic for special cases and enhance readability
1 parent 91564c4 commit 878d978

File tree

2 files changed

+34
-32
lines changed

2 files changed

+34
-32
lines changed

actions/container-package-cleanup/dist/index.js

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30391,42 +30391,43 @@ class WildcardMatcher {
3039130391
const t = tag.toLowerCase();
3039230392
const p = pattern.toLowerCase();
3039330393

30394-
// 1) точное соответствие (никаких джокеров)
30394+
// специальный кейс для '?*' — только буквы+цифры и хотя бы одна цифра
30395+
if (p === '?*') {
30396+
// /^[a-z0-9]+$/ соответствует только алфа‑цифре
30397+
// /\d/ проверяет, что есть хотя бы одна цифра
30398+
return /^[a-z0-9]+$/.test(t) && /\d/.test(t);
30399+
}
30400+
30401+
// нет ни звёздочки, ни вопроса — строгое сравнение
3039530402
if (!p.includes('*') && !p.includes('?')) {
3039630403
return t === p;
3039730404
}
3039830405

30399-
// 2) префиксный метод (xxx*)
30406+
// чистый префикс: xxx*
3040030407
if (p.endsWith('*') && !p.startsWith('*') && !p.includes('?')) {
3040130408
return t.startsWith(p.slice(0, -1));
3040230409
}
3040330410

30404-
// 3) суффиксный метод (*xxx)
30411+
// чистый суффикс: *xxx
3040530412
if (p.startsWith('*') && !p.endsWith('*') && !p.includes('?')) {
3040630413
return t.endsWith(p.slice(1));
3040730414
}
3040830415

30409-
// 4) спецкейс для чистых семвер‑тегов «x.y.z» (три цифры через точку)
30410-
if (p === '*.*.*') {
30411-
return /^\d+\.\d+\.\d+$/.test(tag);
30412-
}
30413-
30414-
// 5) спецкейс для семвер‑тегов с суффиксом «x.y.z-foo»
30415-
if (p === '*.*.*-*') {
30416-
return /^\d+\.\d+\.\d+-[\w.]+$/.test(tag);
30416+
// contains: *xxx*
30417+
if (p.startsWith('*') && p.endsWith('*') && !p.includes('?')) {
30418+
return t.includes(p.slice(1, -1));
3041730419
}
3041830420

30419-
// 6) общий вариант: экранируем RegExpспецсимволы, превращаем '*'→'.*' и '?'→'.'
30421+
// общий вариант: билдим RegExp, эскейпим спецсимволы, затем *→.* и ?→.
3042030422
const escaped = p
30421-
// экранируем всё, кроме '*' и '?'
30423+
// эскейпим всё, кроме * и ?
3042230424
.replace(/[-[\]{}()+\\^$|#\s.]/g, '\\$&')
30423-
// точку эскейпим отдельно
30424-
.replace(/\./g, '\\.')
30425+
// превращаем джокеры в RegExp
3042530426
.replace(/\*/g, '.*')
3042630427
.replace(/\?/g, '.');
3042730428

3042830429
const re = new RegExp(`^${escaped}$`, 'i');
30429-
return re.test(tag);
30430+
return re.test(t);
3043030431
}
3043130432
}
3043230433

actions/container-package-cleanup/src/utils/wildcardMatcher.js

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,43 @@ class WildcardMatcher {
77
const t = tag.toLowerCase();
88
const p = pattern.toLowerCase();
99

10-
// 1) точное соответствие (никаких джокеров)
10+
// специальный кейс для '?*' — только буквы+цифры и хотя бы одна цифра
11+
if (p === '?*') {
12+
// /^[a-z0-9]+$/ соответствует только алфа‑цифре
13+
// /\d/ проверяет, что есть хотя бы одна цифра
14+
return /^[a-z0-9]+$/.test(t) && /\d/.test(t);
15+
}
16+
17+
// нет ни звёздочки, ни вопроса — строгое сравнение
1118
if (!p.includes('*') && !p.includes('?')) {
1219
return t === p;
1320
}
1421

15-
// 2) префиксный метод (xxx*)
22+
// чистый префикс: xxx*
1623
if (p.endsWith('*') && !p.startsWith('*') && !p.includes('?')) {
1724
return t.startsWith(p.slice(0, -1));
1825
}
1926

20-
// 3) суффиксный метод (*xxx)
27+
// чистый суффикс: *xxx
2128
if (p.startsWith('*') && !p.endsWith('*') && !p.includes('?')) {
2229
return t.endsWith(p.slice(1));
2330
}
2431

25-
// 4) спецкейс для чистых семвер‑тегов «x.y.z» (три цифры через точку)
26-
if (p === '*.*.*') {
27-
return /^\d+\.\d+\.\d+$/.test(tag);
28-
}
29-
30-
// 5) спецкейс для семвер‑тегов с суффиксом «x.y.z-foo»
31-
if (p === '*.*.*-*') {
32-
return /^\d+\.\d+\.\d+-[\w.]+$/.test(tag);
32+
// contains: *xxx*
33+
if (p.startsWith('*') && p.endsWith('*') && !p.includes('?')) {
34+
return t.includes(p.slice(1, -1));
3335
}
3436

35-
// 6) общий вариант: экранируем RegExpспецсимволы, превращаем '*'→'.*' и '?'→'.'
37+
// общий вариант: билдим RegExp, эскейпим спецсимволы, затем *→.* и ?→.
3638
const escaped = p
37-
// экранируем всё, кроме '*' и '?'
39+
// эскейпим всё, кроме * и ?
3840
.replace(/[-[\]{}()+\\^$|#\s.]/g, '\\$&')
39-
// точку эскейпим отдельно
40-
.replace(/\./g, '\\.')
41+
// превращаем джокеры в RegExp
4142
.replace(/\*/g, '.*')
4243
.replace(/\?/g, '.');
4344

4445
const re = new RegExp(`^${escaped}$`, 'i');
45-
return re.test(tag);
46+
return re.test(t);
4647
}
4748
}
4849

0 commit comments

Comments
 (0)