Skip to content

Commit 480159e

Browse files
author
Peter Bengtsson
authored
only lint the files that changed (#22924)
* only lint the files that changed * allowed action * do nothing * debug more * less debugging * debug * debug * debug * using patterns * testing something * testing something (2) * lemme try something * lemme try something * one more attempt * testing * tidying up * sample changes * add debugging * some code comments * fine but sample changes * update allowed actions * final cleaning before opening PR for review * tiny update * remove commented out code * feedbacked
1 parent 31e2f02 commit 480159e

3 files changed

Lines changed: 72 additions & 0 deletions

File tree

.github/allowed-actions.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default [
1818
'dawidd6/action-download-artifact@af92a8455a59214b7b932932f2662fdefbd78126', // v2.15.0
1919
'docker://chinthakagodawita/autoupdate-action:v1',
2020
'dorny/paths-filter@eb75a1edc117d3756a18ef89958ee59f9500ba58',
21+
'trilom/file-changes-action@a6ca26c14274c33b15e6499323aac178af06ad4b', // v1.2.4
2122
'github/codeql-action/analyze@v1',
2223
'github/codeql-action/init@v1',
2324
'juliangruber/approve-pull-request-action@c530832d4d346c597332e20e03605aa94fa150a8',

.github/workflows/test.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ jobs:
4646
# Enables cloning the Early Access repo later with the relevant PAT
4747
persist-credentials: 'false'
4848

49+
- name: Gather files changed
50+
uses: trilom/file-changes-action@a6ca26c14274c33b15e6499323aac178af06ad4b
51+
id: get_diff_files
52+
with:
53+
# So that `steps.get_diff_files.outputs.files` becomes
54+
# a string like `foo.js path/bar.md`
55+
output: ' '
56+
57+
- name: Insight into changed files
58+
run: |
59+
echo ${{ steps.get_diff_files.outputs.files }}
60+
4961
- name: Setup node
5062
uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c
5163
with:
@@ -67,4 +79,6 @@ jobs:
6779
run: npm run build
6880

6981
- name: Run tests
82+
env:
83+
DIFF_FILES: ${{ steps.get_diff_files.outputs.files }}
7084
run: npm run test tests/${{ matrix.test-group }}/

tests/linting/lint-files.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,63 @@ function getContent(content) {
356356
return null
357357
}
358358

359+
// Filter out entries from an array like this:
360+
//
361+
// [
362+
// [relativePath, absolutePath],
363+
// ...
364+
// so it's only the files mentioned in the DIFF_FILES environment
365+
// variable, but only if it's set and present.
366+
367+
// Setting an environment varible called `DIFF_FILES` is optional.
368+
// But if and only if it's set, we will respect it.
369+
// And if it set, turn it into a cleaned up Set so it's made available
370+
// every time we use it.
371+
if (process.env.DIFF_FILES) {
372+
// Parse and turn that environment variable string into a set.
373+
// It's faster to do this once and then re-use over and over in the
374+
// .filter() later on.
375+
const only = new Set(
376+
// If the environment variable encodes all the names
377+
// with quotation marks, strip them.
378+
// E.g. Turn `"foo" "bar"` into ['foo', 'bar']
379+
// Note, this assumes no possible file contains a space.
380+
process.env.DIFF_FILES.split(/\s+/g).map((name) => {
381+
if (/^['"]/.test(name) && /['"]$/.test(name)) {
382+
return name.slice(1, -1)
383+
}
384+
return name
385+
})
386+
)
387+
const filterFiles = (tuples) =>
388+
tuples.filter(
389+
([relativePath, absolutePath]) => only.has(relativePath) || only.has(absolutePath)
390+
)
391+
mdToLint = filterFiles(mdToLint)
392+
ymlToLint = filterFiles(ymlToLint)
393+
ghesReleaseNotesToLint = filterFiles(ghesReleaseNotesToLint)
394+
ghaeReleaseNotesToLint = filterFiles(ghaeReleaseNotesToLint)
395+
learningTracksToLint = filterFiles(learningTracksToLint)
396+
featureVersionsToLint = filterFiles(featureVersionsToLint)
397+
}
398+
399+
if (
400+
mdToLint.length +
401+
ymlToLint.length +
402+
ghesReleaseNotesToLint.length +
403+
ghaeReleaseNotesToLint.length +
404+
learningTracksToLint.length +
405+
featureVersionsToLint.length <
406+
1
407+
) {
408+
// With this in place, at least one `test()` is called and you don't
409+
// get the `Your test suite must contain at least one test.` error
410+
// from `jest`.
411+
describe('deliberately do nothing', () => {
412+
test('void', () => {})
413+
})
414+
}
415+
359416
describe('lint markdown content', () => {
360417
if (mdToLint.length < 1) return
361418
describe.each(mdToLint)('%s', (markdownRelPath, markdownAbsPath) => {

0 commit comments

Comments
 (0)