-
-
Save shettayyy/328da46a99a9d7c746636df1cf769675 to your computer and use it in GitHub Desktop.
#!/bin/sh | |
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".jsx\{0,1\}$") | |
ESLINT="$(git rev-parse --show-toplevel)/node_modules/.bin/eslint" | |
if [[ "$STAGED_FILES" = "" ]]; then | |
exit 0 | |
fi | |
PASS=true | |
printf "\nValidating Javascript:\n" | |
# Check for eslint | |
if [[ ! -x "$ESLINT" ]]; then | |
printf "\t\033[41mPlease install ESlint\033[0m (npm i --save-dev eslint)" | |
exit 1 | |
fi | |
for FILE in $STAGED_FILES | |
do | |
"$ESLINT" "$FILE" | |
if [[ "$?" == 0 ]]; then | |
printf "\t\033[32mESLint Passed: $FILE\033[0m" | |
else | |
printf "\t\033[41mESLint Failed: $FILE\033[0m" | |
PASS=false | |
fi | |
done | |
printf "\nJavascript validation completed!\n" | |
if ! $PASS; then | |
printf "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass ESLint but do not. Please fix the ESLint errors and try again.\n" | |
exit 1 | |
else | |
printf "\033[42mCOMMIT SUCCEEDED\033[0m\n" | |
fi | |
exit $? |
This code will allow committing files that fail eslint. If you have lint errors in a staged file, but have unstaged changes to the file that contains no errors, the code above will lint the file, not the staged changes - which allows you to commit a staged change that contains errors.
I went with this instead
@jbjorge i dont necessarily agree. i think committing the intended work in one commit and all the code formatting in another one makes sense. specially if for whatever reason some ill formatted code made it to the repo. this way you can split the formatting from the rest of the code making it easier to review. In the case of avoiding having people to push non formatted code to either a specific branch or all branches the pre-push hook made be better.
Maybe:
[[ -z "$STAGED_FILES" ]] && exit 0
Instead of:
if [[ "$STAGED_FILES" = "" ]]; then
exit 0
fi
@thesquaremedia @jbjorge
I agree that it's possible to commit unlinted code through mistake. However I found a way to check if staged file differs from working directory (git diff --color --name-only $file_name). Below is code that works quite well for me:
# Check if staged files differ from working tree
PASS_STAGING_COMPARATION=true
ALL_STAGED_FILES="$(git diff --cached --name-only)"
for file in $ALL_STAGED_FILES
do
compared_file=$(git diff --color --name-only $file)
if [[ -n $compared_file ]]; then
printf "${RED}Staged file differs from working directory:${NC} $file. \n"
PASS_STAGING_COMPARATION=false
fi
if $PASS_STAGING_COMPARATION; then
printf "${GREEN}Staged files don't differ from working directory${NC} \n"
fi
done
And when checking if linting went correctly just add
elif ! $PASS_STAGING_COMPARATION; then
printf "${RED}COMMIT FAILED:${NC} Your commit contains files that have been changed after staging. Please stage them and try again. \n"
exit 1
else
RED, GREEN and NC simply holds the color
if you are use Tmux+Zsh & have an error with message
.git/hooks/pre-commit: 7: .git/hooks/pre-commit: [[: not found
Validating Javascript:
.git/hooks/pre-commit: 16: .git/hooks/pre-commit: [[: not found
this my solution, cange line 1 on pre-commit-eslint from
#!/bin/sh
To
#!/bin/bash
i tested on my ubuntu with Tmux+Zsh
thanks
+1 @ri7nz solution even though I'm just on Zsh.
One more tip: instead of saving this to .git/hooks/pre-commit
save it to scripts/pre-commit
(or somewhere in your repo). Then run ln -s $PWD/scripts/pre-commit .git/hooks/
and add a note about this to your README.md or CONTRIBUTORS.md file. This way anyone who clones the repo will have the hook as well.
@rashtay any idea why I am facing this issue?
This is occurring on source tree.
Validating Javascript:
env: node: No such file or directory
thank you @rashtay, thank you all for this!
Nice one, I have added a \n
to https://gist.github.com/rashtay/328da46a99a9d7c746636df1cf769675#file-pre-commit-eslint-L25 and https://gist.github.com/rashtay/328da46a99a9d7c746636df1cf769675#file-pre-commit-eslint-L27 for better readability on the prompt.
if you are use Tmux+Zsh & have an error with message
.git/hooks/pre-commit: 7: .git/hooks/pre-commit: [[: not found Validating Javascript: .git/hooks/pre-commit: 16: .git/hooks/pre-commit: [[: not found
this my solution, cange line 1 on pre-commit-eslint from
#!/bin/sh
To
#!/bin/bash
i tested on my ubuntu with Tmux+Zsh
thanks
Hi
I tried it but every time it result succeed whereas ng lint in angular project having eslint issue then why it all time result succeed.
please help me. I am facing this since days.
It fails on error, but not on warnings. What to change in this script so that it fails on warnings too?
It fails on error, but not on warnings. What to change in this script so that it fails on warnings too?
You should configure your .eslintrc
to treat rules you consider important as errors. You can also change the command to "$ESLINT" "$FILE" --max-warnings 0
instead.
Hello Everyone,
I created this a long time ago and I no more write such manual scripts. I rely on husky for everything. So pardon me for my delayed response or if I am unable to help. I see there are a lot of helpful comments. I thank each and everyone for making this better. Cheers.
Hello Everyone,
I created this a long time ago and I no more write manual scripts. I rely on husky for everything. So pardon me for my delayed response or if I am unable to help. I see there are a lot of helpful comments. I thank each and everyone for making this better. Cheers.
Could you update this then? I think that's why you're still getting so much traffic here.
https://levelup.gitconnected.com/how-to-run-eslint-using-pre-commit-hook-25984fbce17e
Edit: nevermind :D lol big notice right at the top, I skimmed past it - my bad.
Could you update this then? I think that's why you're still getting so much traffic here.
https://levelup.gitconnected.com/how-to-run-eslint-using-pre-commit-hook-25984fbce17eEdit: nevermind :D lol big notice right at the top, I skimmed past it - my bad.
Edited the notice to clearly indicate I am not maintaining this gist anymore. Thank you for the suggestion @julix-unity ;)
I had the same problem at @cowCrazy and changing
if [[ "$?" == 0 ]]; then
toif "$ESLINT" "$FILE"; then
resolved it for me.