setup pre-commit hook jshint

Niedawno rozpocząłem projekt na GitHubie. Udało mi się ustawić automatyczne testowanie po każdym commicie używając Travisa. Ale teraz chciałbym również skonfigurować hook Pre-commit z jshint. Więc jeśli jshint zgłosi błędy, commit powinien zawieść. Ale czy jest to możliwe, a jeśli tak, to jak to zrobić ?

Author: neontapir, 2013-03-29

4 answers

Ale czy to możliwe?..
Tak! To jest możliwe. Ja [[6]}ostatnio o tym pisałem . Zauważ, że nie jest specyficzny dla Githuba, tylko Git w ogóle - ponieważ jest to hook przed zatwierdzeniem, uruchamia zanim jakiekolwiek dane zostaną wysłane do Githuba.

Dowolne odpowiednio nazwane pliki wykonywalne w /.katalog Git / hooks twojego repozytorium zostanie uruchomiony jako hooks. Prawdopodobnie będzie tam już domyślnie kilka przykładowych hooków. oto prosta powłoka skrypt , którego używam jako haka przed zatwierdzeniem jslinta (możesz go bardzo łatwo zmodyfikować, aby pracować z JSHint):

#!/bin/sh

files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$")
if [ "$files" = "" ]; then 
    exit 0 
fi

pass=true

echo "\nValidating JavaScript:\n"

for file in ${files}; do
    result=$(jslint ${file} | grep "${file} is OK")
    if [ "$result" != "" ]; then
        echo "\t\033[32mJSLint Passed: ${file}\033[0m"
    else
        echo "\t\033[31mJSLint Failed: ${file}\033[0m"
        pass=false
    fi
done

echo "\nJavaScript validation complete\n"

if ! $pass; then
    echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.\n"
    exit 1
else
    echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi

Możesz po prostu umieścić to w pliku wykonywalnym o nazwie pre-commit w katalogu Git hooks, i będzie on uruchamiany przed każdym commitem.

 39
Author: James Allardice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 19:11:37

Jest łatwiejszy sposób jshint) w Twoim węźle.js workflow:

Zainstaluj jshint z NPM:

npm install jshint

Następnie utwórz .jshintrc plik w Twoim projekcie, jeśli go jeszcze nie masz. e. G: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Teraz zainstaluj Pre-commit moduł (i zapisz go jako zależność dev):

npm install pre-commit --save-dev

Następnie będziesz musiał zdefiniuj zadanie (skrypt), które będzie uruchomione dla JSHint w twoim pakiecie .json

E. g:

{ "scripts": { "jshint": "jshint -c .jshintrc --exclude-path .gitignore ." } }

Następnie rejestrujesz skrypty, które chcesz uruchomić przed zatwierdzeniem (również w pakiecie.json) np.:

"pre-commit": [ "jshint", "coverage", "etc" ]

Pozwala to na więcej niż jedną kontrolę w przepływie pracy przed zatwierdzeniem. (Mamy kontrole, aby upewnić się, że Kod członków zespołu jest zgodny z JSHint, styl kodu i pokrycie testu jest w 100%)

Aby uzyskać bardziej szczegółowy samouczek, możesz podzielić się nim ze swoim zespołem Zobacz też: https://github.com/nelsonic/learn-pre-commit

 40
Author: nelsonic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 07:24:52

Kilka zmian w skrypcie @ James Allardice w celu dostosowania JSHint . Dzięki za oryginalny kod.

#!/bin/sh
#
# Run JSHint validation before commit.

files=$(git diff --cached --name-only --diff-filter=ACMR -- *.js **/*.js)
pass=true


if [ "$files" != "" ]; then
    for file in ${files}; do
        result=$(jshint ${file})

        if [ "$result" != "" ]; then
            echo "$result"
            echo "\n"
            pass=false
        fi
    done
fi


if $pass; then
    exit 0
else
    echo ""
    echo "COMMIT FAILED:"
    echo "Some JavaScript files are invalid. Please fix errors and try committing again."
    exit 1
fi
 16
Author: igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 08:43:21

Podobny skrypt do @ Igora z pewnymi poprawkami:

  • wskaźniki kolorów
  • no --diff-filter, grep used insead
  • help message (Git style), aby uniknąć wywołania przed zatwierdzeniem

#!/bin/sh
#
# Run JSHint validation before commit.

RED='\033[0;31m'
REDBOLD='\033[1;31m'
ORANGE='\033[0;33m'
NC='\033[0m' # No Color

files=$(git diff --cached --name-only | grep .js)
pass=true
totalErrors=0

if [ "$files" != "" ]; then
    for file in ${files}; do
        result=$(jshint ${file})
        if [ "$result" != "" ]; then
            echo "${RED}$result${NC}"
            pass=false
            totalErrors=$((totalErrors+1))
        fi
        echo ""
    done
fi

if $pass; then
    exit 0
else
    echo "${ORANGE}===== ${totalErrors} JSHint Error${NC}"
    echo ""
    echo "${REDBOLD}COMMIT FAILED: Some JavaScript files are invalid. Please fix errors and try committing again.${NC}"
    echo ""
    echo "  (use -n option \"git commit -n -m <message>\" to avoid call pre-commit hook and JSHint check)"
    echo ""
    exit 1
fi
 2
Author: EnriMR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 08:59:55