Skip to content

Commit cb17f74

Browse files
committed
PHPCS only on changed files and lines
1 parent c01da6c commit cb17f74

File tree

2 files changed

+123
-6
lines changed

2 files changed

+123
-6
lines changed

action.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ inputs:
3838
description: 'Passing extra arguments to the phpcs command'
3939
required: false
4040
default: ''
41+
only_changed_files:
42+
description: 'Run linter on changed files only'
43+
required: false
44+
default: ''
45+
only_changed_lines:
46+
description: 'Report errors only for changed lines'
47+
required: false
48+
default: ''
4149
runs:
4250
using: 'docker'
4351
image: 'Dockerfile'

entrypoint.sh

Lines changed: 115 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,50 @@ cp /action/problem-matcher.json /github/workflow/problem-matcher.json
44

55
git clone --depth 1 -b 2.3.0 https://github.com/WordPress/WordPress-Coding-Standards.git ~/wpcs
66

7+
INPUT_ONLY_CHANGED_FILES=${INPUT_ONLY_CHANGED_FILES:-${INPUT_ONLY_CHANGED_LINES:-"false"}}
8+
9+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
10+
if [ "${GITHUB_EVENT_NAME}" = "pull_request" ]; then
11+
COMPARE_FROM=origin/${GITHUB_BASE_REF}
12+
COMPARE_TO=origin/${GITHUB_HEAD_REF}
13+
14+
COMPARE_FROM_REF=$(git merge-base "${COMPARE_FROM}" "${COMPARE_TO}")
15+
COMPARE_TO_REF=${COMPARE_TO}
16+
else
17+
COMPARE_FROM="HEAD^"
18+
COMPARE_TO="HEAD"
19+
COMPARE_FROM_REF="HEAD^"
20+
COMPARE_TO_REF="HEAD"
21+
fi
22+
echo "Will only check changed files (${COMPARE_FROM_REF} -> ${COMPARE_TO_REF})"
23+
set +e
24+
CHANGED_FILES=$(git diff --name-only --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}" | xargs -rt ls -1d 2>/dev/null)
25+
set -e
26+
echo "Will check files:"
27+
echo "${CHANGED_FILES}"
28+
else
29+
echo "Will check all files"
30+
fi
31+
732
if [ "${INPUT_STANDARD}" = "WordPress-VIP-Go" ] || [ "${INPUT_STANDARD}" = "WordPressVIPMinimum" ]; then
833
echo "Setting up VIPCS"
934
git clone --depth 1 -b 2.3.3 https://github.com/Automattic/VIP-Coding-Standards.git ${HOME}/vipcs
1035
git clone https://github.com/sirbrillig/phpcs-variable-analysis ${HOME}/variable-analysis
11-
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/vipcs,${HOME}/variable-analysis"
36+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
37+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
38+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
39+
step2=$(echo "${step1}" | diff-lines)
40+
step3=$(echo "${step2}" | grep -ve ':-')
41+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
42+
set +e
43+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/vipcs,${HOME}/variable-analysis" | filter-by-changed-lines "${step4}"
44+
set -e
45+
else
46+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/vipcs,${HOME}/variable-analysis"
47+
fi
48+
else
49+
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/vipcs,${HOME}/variable-analysis"
50+
fi
1251
elif [ "${INPUT_STANDARD}" = "10up-Default" ]; then
1352
echo "Setting up 10up-Default"
1453
git clone https://github.com/10up/phpcs-composer ${HOME}/10up
@@ -18,13 +57,55 @@ elif [ "${INPUT_STANDARD}" = "10up-Default" ]; then
1857
git clone https://github.com/PHPCSStandards/PHPCSUtils ${HOME}/phpcsutils
1958
git clone https://github.com/Automattic/VIP-Coding-Standards ${HOME}/vipcs
2059
git clone https://github.com/sirbrillig/phpcs-variable-analysis ${HOME}/variable-analysis
21-
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/10up/10up-Default,${HOME}/phpcompatwp/PHPCompatibilityWP,${HOME}/phpcompat/PHPCompatibility,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieSodiumCompat,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieRandomCompat,${HOME}/phpcsutils/PHPCSUtils,${HOME}/vipcs,${HOME}/variable-analysis"
60+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
61+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
62+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
63+
step2=$(echo "${step1}" | diff-lines)
64+
step3=$(echo "${step2}" | grep -ve ':-')
65+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
66+
set +e
67+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/10up/10up-Default,${HOME}/phpcompatwp/PHPCompatibilityWP,${HOME}/phpcompat/PHPCompatibility,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieSodiumCompat,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieRandomCompat,${HOME}/phpcsutils/PHPCSUtils,${HOME}/vipcs,${HOME}/variable-analysis" | filter-by-changed-lines "${step4}"
68+
set -e
69+
else
70+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/10up/10up-Default,${HOME}/phpcompatwp/PHPCompatibilityWP,${HOME}/phpcompat/PHPCompatibility,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieSodiumCompat,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieRandomCompat,${HOME}/phpcsutils/PHPCSUtils,${HOME}/vipcs,${HOME}/variable-analysis"
71+
fi
72+
else
73+
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/10up/10up-Default,${HOME}/phpcompatwp/PHPCompatibilityWP,${HOME}/phpcompat/PHPCompatibility,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieSodiumCompat,${HOME}/phpcompat-paragonie/PHPCompatibilityParagonieRandomCompat,${HOME}/phpcsutils/PHPCSUtils,${HOME}/vipcs,${HOME}/variable-analysis"
74+
fi
2275
elif [ -z "${INPUT_STANDARD_REPO}" ] || [ "${INPUT_STANDARD_REPO}" = "false" ]; then
23-
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths ~/wpcs
76+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
77+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
78+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
79+
step2=$(echo "${step1}" | diff-lines)
80+
step3=$(echo "${step2}" | grep -ve ':-')
81+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
82+
set +e
83+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths ~/wpcs | filter-by-changed-lines "${step4}"
84+
set -e
85+
else
86+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths ~/wpcs
87+
fi
88+
else
89+
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths ~/wpcs
90+
fi
2491
else
2592
echo "Standard repository: ${INPUT_STANDARD_REPO}"
2693
git clone -b ${INPUT_REPO_BRANCH} ${INPUT_STANDARD_REPO} ${HOME}/cs
27-
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/cs"
94+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
95+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
96+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
97+
step2=$(echo "${step1}" | diff-lines)
98+
step3=$(echo "${step2}" | grep -ve ':-')
99+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
100+
set +e
101+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/cs" | filter-by-changed-lines "${step4}"
102+
set -e
103+
else
104+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/cs"
105+
fi
106+
else
107+
${INPUT_PHPCS_BIN_PATH} --config-set installed_paths "${HOME}/wpcs,${HOME}/cs"
108+
fi
28109
fi
29110

30111
if [ -z "${INPUT_EXCLUDES}" ]; then
@@ -53,9 +134,37 @@ else
53134
fi
54135

55136
if [ "${HAS_CONFIG}" = true ] && [ "${INPUT_USE_LOCAL_CONFIG}" = "true" ] ; then
56-
${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle ${INPUT_EXTRA_ARGS}
137+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
138+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
139+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
140+
step2=$(echo "${step1}" | diff-lines)
141+
step3=$(echo "${step2}" | grep -ve ':-')
142+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
143+
set +e
144+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle ${INPUT_EXTRA_ARGS} | filter-by-changed-lines "${step4}"
145+
set -e
146+
else
147+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle ${INPUT_EXTRA_ARGS}
148+
fi
149+
else
150+
${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle ${INPUT_EXTRA_ARGS}
151+
fi
57152
else
58-
${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle --standard=${INPUT_STANDARD} --ignore=${EXCLUDES} --extensions=php ${INPUT_PATHS} ${INPUT_EXTRA_ARGS}
153+
if [ "${INPUT_ONLY_CHANGED_FILES}" = "true" ]; then
154+
if [ "${INPUT_ONLY_CHANGED_LINES}" = "true" ]; then
155+
step1=$(git diff -U0 --diff-filter=d "${COMPARE_FROM_REF}" "${COMPARE_TO_REF}")
156+
step2=$(echo "${step1}" | diff-lines)
157+
step3=$(echo "${step2}" | grep -ve ':-')
158+
step4=$(echo "${step3}" | sed 's/:+.*//') # On some platforms, sed needs to have + escaped. This isn't the case for Alpine sed.
159+
set +e
160+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle --standard=${INPUT_STANDARD} --ignore=${EXCLUDES} --extensions=php ${INPUT_PATHS} ${INPUT_EXTRA_ARGS} | filter-by-changed-lines "${step4}"
161+
set -e
162+
else
163+
echo "${CHANGED_FILES}" | xargs -rt ${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle --standard=${INPUT_STANDARD} --ignore=${EXCLUDES} --extensions=php ${INPUT_PATHS} ${INPUT_EXTRA_ARGS}
164+
fi
165+
else
166+
${INPUT_PHPCS_BIN_PATH} ${WARNING_FLAG} --report=checkstyle --standard=${INPUT_STANDARD} --ignore=${EXCLUDES} --extensions=php ${INPUT_PATHS} ${INPUT_EXTRA_ARGS}
167+
fi
59168
fi
60169

61170
status=$?

0 commit comments

Comments
 (0)