Skip to content

Commit b7dd413

Browse files
committed
fix(linter): handle no changed files context
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
1 parent 0822bea commit b7dd413

File tree

1 file changed

+59
-42
lines changed

1 file changed

+59
-42
lines changed

.github/workflows/linter.yml

Lines changed: 59 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)