@@ -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,90 @@ 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 actionFiles = [];
209+ if (changedFilesOutput.length > 0) {
210+ actionFiles = changedFilesOutput.split(" ").filter(file => file && fs.existsSync(file));
211+ core.debug(`Action files from changed files: ${JSON.stringify(actionFiles)}`);
212+ } else {
213+ const parsedActionFiles = parseFilePatterns(actionFilesInput);
214+ core.debug(`Parsed action files: ${parsedActionFiles}`);
215+
216+ if (parsedActionFiles.length === 0) {
205217 return core.setFailed("No action files to lint.");
206218 }
207- }
208219
209- const files = actionFiles.map((file) => path.relative(process.env.GITHUB_WORKSPACE, file));
210- const filesOutput = [...new Set(files)].join(" ").trim();
220+ actionFiles = await findFilesByPatterns(parsedActionFiles);
221+ core.debug(`Action files from patterns: ${JSON.stringify(actionFiles)}`);
222+ }
211223
212- if (filesOutput .length === 0) {
213- return ;
224+ if (actionFiles .length > 0) {
225+ core.setOutput("action-files", [...new Set(actionFiles)].join(" ").trim()) ;
214226 }
215227
216- core.setOutput("files", filesOutput);
228+ actions-pinning :
229+ name : 📌 Check GitHub Actions Pinning
230+ needs : prepare-actions-linting
231+ runs-on : ${{ fromJson(inputs.runs-on) }}
232+ if : ${{ needs.prepare-actions-linting.outputs.action-files }}
233+ steps :
234+ - uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
217235
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 }}
236+ # FIXME: should be updated by dependabot. See https://github.com/dependabot/dependabot-core/issues/8362
237+ - uses : " docker://ghcr.io/sethvargo/ratchet:0.11.3@sha256:242445a1c55430ad7477e6fcf2027c77d03f5760702537bca4cf622e7338fc81" # 0.11.3
238+ if : ${{ needs.prepare-actions-linting.outputs.action-files }}
222239 with :
223- args : " lint --format human --format actions ${{ steps.get-files-to-lint .outputs.files }}"
240+ args : " lint --format human --format actions ${{ needs.prepare-actions-linting .outputs.action- files }}"
0 commit comments