From da1b687111ffb186cefc0468d8e996192f1e0a52 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=98=A4=ED=98=95=EC=84=9D/On-Device=20Lab=28SR=29/Staff?= =?utf8?q?=20Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Fri, 26 Jul 2019 12:46:34 +0900 Subject: [PATCH] Format check for diff file with master (#5916) This commit allow user to check format diff files with master via CHECK_DIFF_ONLY environment variable Use this feature on pre-push githook Signed-off-by: Hyeongseok Oh --- infra/command/format | 85 +++++++++++++++++++++++++++++++-------------- infra/git-hooks/pre-push.sh | 2 +- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/infra/command/format b/infra/command/format index 757afba..6e94936 100644 --- a/infra/command/format +++ b/infra/command/format @@ -1,6 +1,8 @@ #!/bin/bash INVALID_EXIT=0 +FILES_TO_CHECK=() +DIRECTORIES_NOT_TO_BE_TESTED=() function pushd () { command pushd "$@" > /dev/null @@ -16,7 +18,6 @@ function command_exists() { function check_newline() { # Check all files (CMakeLists.txt, *.cl, ... not only for C++, Python) - FILES_TO_CHECK=$(git ls-files) if [[ ${#FILES_TO_CHECK} -ne 0 ]]; then CRCHECK=$(file ${FILES_TO_CHECK} | grep 'with CR') fi @@ -32,15 +33,18 @@ function check_newline() { function check_permission() { # Check all files except script - FILES_TO_CHECK=() - for NON_SCRIPT_FILE in $(git ls-files -- . ':!:nnas' ':!:nnfw' ':!:nncc' ':!:*.sh' ':!:*.py' ':!:scripts/standalone'); do - FILES_TO_CHECK+=("${NON_SCRIPT_FILE}") + FILES_TO_CHECK_PERMISSION=() + for f in ${FILES_TO_CHECK[@]}; do + # Manually ignore permission checking + if [[ ${f} == !(nnas|nnfw|nncc|*.sh|*.py|scripts/standalone) ]]; then + FILES_TO_CHECK_PERMISSION+=("${f}") + fi done - if [[ ${#FILES_TO_CHECK} -eq 0 ]]; then + if [[ ${#FILES_TO_CHECK_PERMISSION} -eq 0 ]]; then return fi - for FILE_TO_CHECK in ${FILES_TO_CHECK[@]}; do + for FILE_TO_CHECK in ${FILES_TO_CHECK_PERMISSION[@]}; do RESULT=$(stat -c '%A' ${FILE_TO_CHECK} | grep 'x') if [ "${RESULT}" != "" ]; then chmod a-x ${FILE_TO_CHECK} @@ -71,22 +75,32 @@ function check_cpp_files() { exit 1 fi - DIRECTORIES_NOT_TO_BE_TESTED=$1 - # Check c++ files - CPP_FILES_TO_CHECK=$(git ls-files '*.h' '*.cpp' '*.cc' '*.c' '*.cl' ':!:**/NeuralNetworks.h') - ARR=(${CPP_FILES_TO_CHECK}) + FILES_TO_CHECK_CPP=() + for f in ${FILES_TO_CHECK[@]}; do + # Manually ignore style checking + if [[ ${f} == */NeuralNetworks.h ]]; then + continue + fi + + # File extension to check + if [[ ${f} == +(*.h|*.cpp|*.cc|*.c|*.cl) ]]; then + FILES_TO_CHECK_CPP+=("${f}") + fi + done + + # Skip by '.FORMATDENY' file for s in ${DIRECTORIES_NOT_TO_BE_TESTED[@]}; do skip=${s#'.'/}/ - ARR=(${ARR[*]//$skip*/}) + FILES_TO_CHECK_CPP=(${FILES_TO_CHECK_CPP[*]/$skip*/}) done - CPP_FILES_TO_CHECK=${ARR[*]} - if [[ ${#CPP_FILES_TO_CHECK} -ne 0 ]]; then - clang-format-3.9 -i ${CPP_FILES_TO_CHECK} + + if [[ ${#FILES_TO_CHECK_CPP} -ne 0 ]]; then + clang-format-3.9 -i ${FILES_TO_CHECK_CPP[@]} EXIT_CODE=$? if [[ ${EXIT_CODE} -ne 0 ]]; then INVALID_EXIT=${EXIT_CODE} - fi + fi fi } @@ -102,18 +116,26 @@ function check_python_files() { exit 1 fi - DIRECTORIES_NOT_TO_BE_TESTED=$1 - # Check python files - PYTHON_FILES_TO_CHECK=$(git ls-files '*.py' ':!:compiler/*') - ARR=(${PYTHON_FILES_TO_CHECK}) + FILES_TO_CHECK_PYTHON=() + for f in ${FILES_TO_CHECK[@]}; do + # Manually ignore style checking + if [[ ${f} == compiler/* ]]; then + continue + fi + + # File extension to check + if [[ ${f} == *.py ]]; then + FILES_TO_CHECK_PYTHON+=("${f}") + fi + done for s in ${DIRECTORIES_NOT_TO_BE_TESTED[@]}; do skip=${s#'.'/}/ - ARR=(${ARR[*]//$skip*/}) + FILES_TO_CHECK_PYTHON=(${FILES_TO_CHECK_PYTHON[*]/$skip*/}) done - PYTHON_FILES_TO_CHECK=${ARR[*]} - if [[ ${#PYTHON_FILES_TO_CHECK} -ne 0 ]]; then - yapf -i --style='{based_on_style: pep8, column_limit: 90}' ${PYTHON_FILES_TO_CHECK} + + if [[ ${#FILES_TO_CHECK_PYTHON} -ne 0 ]]; then + yapf -i --style='{based_on_style: pep8, column_limit: 90}' ${FILES_TO_CHECK_PYTHON[@]} EXIT_CODE=$? if [[ ${EXIT_CODE} -ne 0 ]]; then INVALID_EXIT=${EXIT_CODE} @@ -131,7 +153,18 @@ fi __Check_CPP=${CHECK_CPP:-"1"} __Check_PYTHON=${CHECK_PYTHON:-"1"} -DIRECTORIES_NOT_TO_BE_TESTED=() +FILES_TO_CHECK=$(git ls-files) +if [[ "${CHECK_DIFF_ONLY}" = "1" ]]; then + MASTER_EXIST=$(git rev-parse --verify master) + CURRENT_BRANCH=$(git branch | grep \* | cut -d ' ' -f2-) + if [[ -z "${MASTER_EXIST}" ]]; then + echo "Cannot found local master branch" + elif [[ "${CURRENT_BRANCH}" = "master" ]]; then + echo "Current branch is master" + else + FILES_TO_CHECK=$(git diff --name-only master) + fi +fi for DIR_NOT_TO_BE_TESTED in $(find -name '.FORMATDENY' -exec dirname {} \;); do DIRECTORIES_NOT_TO_BE_TESTED+=("${DIR_NOT_TO_BE_TESTED}") @@ -139,8 +172,8 @@ done check_newline check_permission -check_cpp_files ${DIRECTORIES_NOT_TO_BE_TESTED} -check_python_files ${DIRECTORIES_NOT_TO_BE_TESTED} +check_cpp_files +check_python_files DIFF=$(git diff | tee format.patch) diff --git a/infra/git-hooks/pre-push.sh b/infra/git-hooks/pre-push.sh index 7b572b3..ce75133 100755 --- a/infra/git-hooks/pre-push.sh +++ b/infra/git-hooks/pre-push.sh @@ -27,6 +27,6 @@ url="$2" REPO_PATH=$(git rev-parse --show-toplevel) cd $REPO_PATH -./nnas format +CHECK_DIFF_ONLY=1 ./nnas format exit $? -- 2.7.4