简体   繁体   中英

How do i add linting to pre-commit hook

hi everyone i have a git repo that house 3 folders (individual js projects).

here's my pre-commit hook

#!/bin/bash
echo -e "\033[1;92m Linting Staged Files . . . "

files=$(git diff --diff-filter=d --cached --name-only | grep -E '\.(js|jsx)$')
path=(${files[0]//// })


if [[ $files = "" ]] ; then
  echo -e "\033[1;31m You have no staged file, exiting . . "
  exit 1
fi

for file in $files
do
git show ":$file" | $("./$path/node_modules/.bin/eslint --stdin --stdin-filename $file")
 if [ $? -ne 0 ]; then
   echo -e "\033[1;31m ESLint failed on staged file '$file'. \n Code will not be committed, Please fix your code and try again."
exit 1
 fi
done

BRANCH=`git rev-parse --abbrev-ref HEAD`

if [[ "$BRANCH" == "master" || "$BRANCH" == "develop" ]]; then
 echo "\033[1;31m commiting to $BRANCH is illegal."
 echo "\033[1;31m If you really know what you're doing, then add the argument '-n' to skip this git hook."
 exit 1
fi

exit 0

but it keeps failing at this line git show ":$file" | $("./$path/node_modules/.bin/eslint --stdin --stdin-filename $file") git show ":$file" | $("./$path/node_modules/.bin/eslint --stdin --stdin-filename $file")

with an error

.git/hooks/pre-commit: line 17: ./node_modules/.bin/eslint --stdin --stdin-filename sfa/src/SFAApp.js: No such file or directory

i have no idea what i'm doing wrong please help.

Never Mind i fixed the problem by changing

$("./$path/node_modules/.bin/eslint --stdin --stdin-filename $file")

to

./$path/node_modules/.bin/eslint --stdin --stdin-filename $file

TODO: research what $() really means in bash.

You're trying to run a command literally named:

./node_modules/.bin/eslint --stdin --stdin-filename sfa/src/SFAApp.js

rather than trying to run a command named:

./node_modules/.bin/eslint

with arguments:

--stdin

and:

--stdin-filename

and:

sfa/src/SFAApp.js

The cure is to fix your double quote placement. Once you do, you will probably have a second problem:

git show ":$file" | $(./$path/node_modules/.bin/eslint --stdin --stdin-filename "$file")

will run the command with the arguments, but then, because it is inside $(...) , will take its output as a command. I know nothing of eslint, but it seems likely that this should read:

git show ":$file" | ./$path/node_modules/.bin/eslint --stdin --stdin-filename "$file"

(I'm also not at all sure what the silliness with $path is about. The line path=(${files[0]//// }) sets path to the first file path-name component of the files listed by git diff , eg, if the output is a/b/c.js , path is set to a .)

You could use the npm package husky : https://www.npmjs.com/package/husky

By tapping into the git hook for pre-commit you could lint all the staged files exculding the deleted one by the line below

git diff --cached --name-only --diff-filter=d | grep ".js$" | xargs ./node_modules/.bin/eslint

Your .huskyrc will pretty much look like the one below:

module.exports = {
 'hooks': {
   'pre-commit': 'git diff --cached --name-only --diff-filter=d | grep ".js$" | xargs ./node_modules/.bin/eslint'
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM