Skip to content

Commit 8ef0929

Browse files
NikitaCOEURneilime
authored andcommitted
refactor(prune-pull-requests-image-tags): add preserve filter validation and error handling
Addresses PR review comments by adding robust regex validation and error handling: - Extract preserve filter logic into dedicated filterPreservedTags function - Validate preserve filter regex before use with try-catch - Use core.setFailed for invalid regex patterns - Handle regex matching errors gracefully with appropriate warnings - Improve code modularity and maintainability
1 parent 2b854e1 commit 8ef0929

File tree

1 file changed

+45
-12
lines changed
  • actions/docker/prune-pull-requests-image-tags

1 file changed

+45
-12
lines changed

actions/docker/prune-pull-requests-image-tags/index.js

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,7 @@ async function getTagsToDeleteFromPackageVersion({
126126
return [];
127127
}
128128

129-
// Filter out tags that should be preserved
130-
if (preserveTagsFilter && preserveTagsFilter.length > 0) {
131-
const preservedTags = tags.filter((tag) => tag.match(preserveTagsFilter));
132-
if (preservedTags.length > 0) {
133-
core.debug(
134-
`Preserving tags matching filter ${preserveTagsFilter}: ${preservedTags.join(", ")}`,
135-
);
136-
}
137-
return tags.filter((tag) => !tag.match(preserveTagsFilter));
138-
}
139-
140-
return tags;
129+
return filterPreservedTags({ tags, preserveTagsFilter, core });
141130
}
142131

143132
function getPullRequestRelatedTags({ tags, pullRequestTagFilter }) {
@@ -158,6 +147,50 @@ function getPullRequestRelatedTags({ tags, pullRequestTagFilter }) {
158147
return [...new Set(pullRequestRelatedTags)];
159148
}
160149

150+
function filterPreservedTags({ tags, preserveTagsFilter, core }) {
151+
if (!preserveTagsFilter || preserveTagsFilter.length === 0) {
152+
return tags;
153+
}
154+
155+
let preserveRegex;
156+
try {
157+
preserveRegex = new RegExp(preserveTagsFilter);
158+
} catch (error) {
159+
core.setFailed(
160+
`Invalid preserve tag filter regex "${preserveTagsFilter}". Error: ${error.message}`,
161+
);
162+
throw error;
163+
}
164+
165+
const preservedTags = tags.filter((tag) => {
166+
try {
167+
return preserveRegex.test(tag);
168+
} catch (error) {
169+
core.warning(
170+
`Error while applying preserve tag filter regex "${preserveTagsFilter}" to tag "${tag}". Treating tag as not preserved. Error: ${error.message}`,
171+
);
172+
return false;
173+
}
174+
});
175+
176+
if (preservedTags.length > 0) {
177+
core.debug(
178+
`Preserving tags matching filter ${preserveTagsFilter}: ${preservedTags.join(", ")}`,
179+
);
180+
}
181+
182+
return tags.filter((tag) => {
183+
try {
184+
return !preserveRegex.test(tag);
185+
} catch (error) {
186+
core.warning(
187+
`Error while applying preserve tag filter regex "${preserveTagsFilter}" to tag "${tag}". Keeping tag for safety. Error: ${error.message}`,
188+
);
189+
return true;
190+
}
191+
});
192+
}
193+
161194
const closedPullRequests = new Map();
162195
async function isPullRequestClosed({ github, context, pullRequestNumber }) {
163196
if (!closedPullRequests.has(pullRequestNumber)) {

0 commit comments

Comments
 (0)