Update spellcheck to run only on changed files #4159
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Check spelling | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
jobs: | |
pyspelling: | |
runs-on: ubuntu-20.04 | |
steps: | |
- name: Check for skip label and get changed files | |
id: check-files | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
let skipCheck = false; | |
let changedFiles = []; | |
if (context.eventName === 'pull_request') { | |
// Check for skip label | |
const { data: labels } = await github.rest.issues.listLabelsOnIssue({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number | |
}); | |
skipCheck = labels.some(label => label.name === 'skip-spell-check'); | |
if (!skipCheck) { | |
// Get changed files in PR | |
const { data: files } = await github.rest.pulls.listFiles({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.issue.number | |
}); | |
changedFiles = files | |
.filter(file => file.filename.match(/\.(py|rst|md)$/)) | |
.map(file => file.filename); | |
} | |
} else { | |
// For push events, we'll still need to use git diff | |
// We'll handle this after checkout | |
} | |
core.setOutput('skip', skipCheck.toString()); | |
core.setOutput('files', changedFiles.join('\n')); | |
core.setOutput('is-pr', (context.eventName === 'pull_request').toString()); | |
- uses: actions/checkout@v4 | |
if: steps.check-files.outputs.skip != 'true' | |
- name: Get changed files for push event | |
if: | | |
steps.check-files.outputs.skip != 'true' && | |
steps.check-files.outputs.is-pr != 'true' | |
id: push-files | |
run: | | |
CHANGED_FILES=$(git diff --name-only HEAD^..HEAD -- '*.py' '*.rst' '*.md') | |
echo "files<<EOF" >> $GITHUB_OUTPUT | |
echo "$CHANGED_FILES" >> $GITHUB_OUTPUT | |
echo "EOF" >> $GITHUB_OUTPUT | |
- name: Check if relevant files changed | |
if: steps.check-files.outputs.skip != 'true' | |
id: check | |
run: | | |
if [ "${{ steps.check-files.outputs.is-pr }}" == "true" ]; then | |
FILES="${{ steps.check-files.outputs.files }}" | |
else | |
FILES="${{ steps.push-files.outputs.files }}" | |
fi | |
if [ -z "$FILES" ]; then | |
echo "skip=true" >> $GITHUB_OUTPUT | |
echo "No relevant files changed (*.py, *.rst, *.md), skipping spell check" | |
else | |
echo "skip=false" >> $GITHUB_OUTPUT | |
echo "Found changed files to check:" | |
echo "$FILES" | |
fi | |
- uses: actions/setup-python@v4 | |
if: | | |
steps.check-files.outputs.skip != 'true' && | |
steps.check.outputs.skip != 'true' | |
with: | |
python-version: '3.9' | |
cache: 'pip' | |
- name: Install dependencies | |
if: | | |
steps.check-files.outputs.skip != 'true' && | |
steps.check.outputs.skip != 'true' | |
run: | | |
pip install pyspelling | |
sudo apt-get install aspell aspell-en | |
- name: Run spell check on each file | |
if: | | |
steps.check-files.outputs.skip != 'true' && | |
steps.check.outputs.skip != 'true' | |
run: | | |
# Get the list of files into an array | |
if [ "${{ steps.check-files.outputs.is-pr }}" == "true" ]; then | |
mapfile -t FILES <<< "${{ steps.check-files.outputs.files }}" | |
else | |
mapfile -t FILES <<< "${{ steps.push-files.outputs.files }}" | |
fi | |
# Check each file individually | |
FINAL_EXIT_CODE=0 | |
for file in "${FILES[@]}"; do | |
if [ -n "$file" ]; then | |
echo "Checking spelling in $file" | |
# Create a temporary config file based on the existing one | |
python3 - <<EOF > temp_config.yml | |
import yaml | |
with open('.pyspelling.yml', 'r') as f: | |
config = yaml.safe_load(f) | |
new_matrix = [] | |
for matrix in config['matrix']: | |
# Check if the file extension matches the matrix name | |
if (('python' in matrix['name'].lower() and '$file'.endswith('.py')) or | |
('rest' in matrix['name'].lower() and '$file'.endswith('.rst')) or | |
('markdown' in matrix['name'].lower() and '$file'.endswith('.md'))): | |
matrix_copy = matrix.copy() | |
matrix_copy['sources'] = ['$file'] | |
new_matrix.append(matrix_copy) | |
config['matrix'] = new_matrix | |
with open('temp_config.yml', 'w') as f: | |
yaml.dump(config, f, default_flow_style=False) | |
EOF |