@@ -136,10 +136,11 @@ jobs:
136136 with :
137137 category : " /language:${{matrix.language}}"
138138
139- actions-pinning :
140- name : 📌 Check GitHub Actions Pinning
139+ prepare-actions-linting :
141140 runs-on : ${{ fromJson(inputs.runs-on) }}
142141 if : ${{ inputs.action-files }}
142+ outputs :
143+ action-files : ${{ steps.get-files-to-lint.outputs.action-files }}
143144 steps :
144145 - uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
145146 with :
@@ -150,74 +151,94 @@ jobs:
150151 uses : tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
151152 if : ${{ inputs.lint-all == false }}
152153 with :
153- files : ${{ inputs.action-files }}
154+ files : |
155+ ${{ inputs.action-files }}
154156 dir_names_exclude_current_dir : true
155157
156158 - id : get-files-to-lint
157159 uses : actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
158160 env :
159- CHANGED_FILES : ${{ toJSON( steps.changed-files.outputs.all_changed_and_modified_files) }};
160- ACTION_FILES_INPUT : ${{ toJSON( inputs.action-files) }}
161+ CHANGED_FILES_OUTPUT : ${{ steps.changed-files.outputs.all_changed_and_modified_files }}
162+ ACTION_FILES_INPUT : ${{ inputs.action-files }}
161163 with :
162164 script : |
163165 const fs = require("node:fs");
164166 const path = require("node:path");
165167
166- const changedFiles = process.env.CHANGED_FILES;
168+ const changedFilesOutput = process.env.CHANGED_FILES_OUTPUT.trim();
169+ core.debug(`Changed files output: ${changedFilesOutput}`);
167170
168- let actionFiles = [];
169- if (changedFiles !== null) {
170- actionFiles = changedFiles.split(" ").filter(file => file && fs.existsSync(file));
171- } else {
172- const actionFilesInput = process.env.ACTION_FILES_INPUT;
171+ const actionFilesInput = process.env.ACTION_FILES_INPUT.trim();
172+ core.debug(`Action files input: ${actionFilesInput}`);
173173
174- for (const actionFile of actionFilesInput.split("\n")) {
175- let sanitizedActionFile = actionFile.trim();
176- if (sanitizedActionFile === "") {
174+ function parseFilePatterns(filePatterns) {
175+ const patterns = [];
176+ for (const filePattern of filePatterns.split("\n")) {
177+ let sanitizedFilePattern = filePattern.trim();
178+ if (sanitizedFilePattern === "") {
177179 continue;
178180 }
179181
180- if (path.isAbsolute(sanitizedActionFile )) {
181- // Ensure actionFile is within the workspace
182- if (!sanitizedActionFile .startsWith(process.env.GITHUB_WORKSPACE)) {
183- return core.setFailed(`Action file / directory is not within the workspace: ${sanitizedActionFile }`);
182+ if (path.isAbsolute(sanitizedFilePattern )) {
183+ // Ensure filePattern is within the workspace
184+ if (!sanitizedFilePattern .startsWith(process.env.GITHUB_WORKSPACE)) {
185+ return core.setFailed(`File / directory is not within the workspace: ${sanitizedFilePattern }`);
184186 }
185187 } else {
186- sanitizedActionFile = path.join(process.env.GITHUB_WORKSPACE, sanitizedActionFile );
188+ sanitizedFilePattern = path.join(process.env.GITHUB_WORKSPACE, sanitizedFilePattern );
187189 }
188- actionFiles.push(sanitizedActionFile);
189- }
190-
191- if (actionFiles.length === 0) {
192- return core.setFailed("No action files to lint.");
193- }
194-
195- async function getActionFiles(actionFile) {
196- const globber = await glob.create(actionFile,{ matchactionFilesInput: false });
197- return await globber.glob();
190+ patterns.push(sanitizedFilePattern);
198191 }
192+ return patterns;
193+ }
199194
200- actionFiles = (await Promise.all(actionFiles.map(getActionFiles)))
195+ async function findFilesByPatterns(filePatterns) {
196+ const foundFiles = (await Promise.all(filePatterns.map(
197+ async (filePattern) => {
198+ const globber = await glob.create(filePattern, { excludeHiddenFiles: false });
199+ return await globber.glob();
200+ }
201+ )))
201202 .flat()
202203 .map((file) => path.relative(process.env.GITHUB_WORKSPACE, file));
203204
204- if (actionFiles.length === 0) {
205+ return [...new Set(foundFiles)];
206+ }
207+
208+ let changedFiles = null;
209+ if (changedFilesOutput.length > 0) {
210+ changedFiles = changedFilesOutput.split(" ").filter(file => file && fs.existsSync(file));
211+ }
212+
213+ let actionFiles = [];
214+ if (changedFiles !== null) {
215+ actionFiles = changedFiles;
216+ } else {
217+ const parsedActionFiles = parseFilePatterns(actionFilesInput);
218+ core.debug(`Parsed action files: ${parsedActionFiles}`);
219+
220+ if (parsedActionFiles.length === 0) {
205221 return core.setFailed("No action files to lint.");
206222 }
207- }
208223
209- const files = actionFiles.map((file) => path.relative(process.env.GITHUB_WORKSPACE, file));
210- const filesOutput = [...new Set(files)].join(" ").trim();
224+ actionFiles = await findFilesByPatterns(parsedActionFiles);
225+ core.debug(`Action files: ${actionFiles}`);
226+ }
211227
212- if (filesOutput .length === 0) {
213- return ;
228+ if (actionFiles .length > 0) {
229+ core.setOutput("action-files", actionFiles) ;
214230 }
215231
216- core.setOutput("files", filesOutput);
232+ actions-pinning :
233+ name : 📌 Check GitHub Actions Pinning
234+ needs : prepare-actions-linting
235+ runs-on : ${{ fromJson(inputs.runs-on) }}
236+ if : ${{ needs.prepare-actions-linting.outputs.action-files }}
237+ steps :
238+ - uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
217239
218- - id : ratchet
219- # FIXME: should be updated by dependabot. See https://github.com/dependabot/dependabot-core/issues/8362
220- uses : " docker://ghcr.io/sethvargo/ratchet:0.11.3@sha256:242445a1c55430ad7477e6fcf2027c77d03f5760702537bca4cf622e7338fc81" # 0.11.3
221- if : ${{ steps.get-files-to-lint.outputs.files }}
240+ # FIXME: should be updated by dependabot. See https://github.com/dependabot/dependabot-core/issues/8362
241+ - uses : " docker://ghcr.io/sethvargo/ratchet:0.11.3@sha256:242445a1c55430ad7477e6fcf2027c77d03f5760702537bca4cf622e7338fc81" # 0.11.3
242+ if : ${{ needs.prepare-actions-linting.outputs.action-files }}
222243 with :
223- args : " lint --format human --format actions ${{ steps.get-files-to-lint .outputs.files }}"
244+ args : " lint --format human --format actions ${{ needs.prepare-actions-linting .outputs.action- files }}"
0 commit comments