Pre Commit Haken für JSLint in Mercurial und Git
-
11-09-2019 - |
Frage
Ich möchte JSLint vor dem Fest in laufen entweder ein Mercurial oder Git Repo durchgeführt wird.
Ich möchte dies als ein automatischer Schritt, anstatt sich auf den Entwickler eingerichtet ist (vor allem mir) erinnern JSLint vor Hand zu laufen. Ich normalerweise JSLint laufen, während der Entwicklung, sondern wollen einen Vertrag über JS-Dateien angeben, die sie JSLint vergehen, bis zu dem Repo begangen werden.
Für Mercurial, diese Seite precommit Syntax formuliert, aber die einzigen Variablen, die verfügbar zu sein scheinen, sind die parent1 und parent2 changeset IDs in den beteiligten zu begehen. Was ich wirklich will, ist eine Liste von Dateinamen, die mit der Commit beteiligt sind, so dass ich dann die JS-Datei auswählen und ausführen JSLint über sie.
ähnliche Ausgabe für GIT , die Standard-Informationen als Teil des precommit Skript scheint begrenzt.
Was funktionieren könnte ist hg Status / git Status als Teil des precommit Skript aufrufen, analysieren, die Ausgabedateien JS dann zu finden, die Arbeit auf diese Weise. Ich hatte gehofft, für etwas einfacher aber, und ich bin nicht sicher, ob Status Aufruf als Teil eines precommit Haken die richtigen Informationen zu reflektieren. Zum Beispiel in Git, wenn die Änderungen von Dateien noch nicht hinzugefügt worden, aber die git commit -a verwendet, würden die Dateien im richtigen Abschnitt des git Statusausgang zeigen sich als Teil des Satzes commit zu sein?
Aktualisieren : Ich habe etwas Arbeits bekam, ist es hier zu sehen: http: // github.com/jrburke/dvcs_jslint/
Lösung
Für git gibt es Beispiele in dem .git / Haken-Verzeichnis. Wenn Sie nur die Dateinamen für JSLint benötigen, könnten Sie git diff --name-only
verwenden, was in meinem Beispiel werden die Namen der Dateien aufgelistet, die von der aktuellen HEAD
abweichen.
Andere Tipps
Das folgende ist eine Variation von @ Bitbieger Git-Lösung, die mit Node.js und einer lokalen Kopie von node-JSLint (dh Sie in Ihrem root-Repository-Verzeichnis npm install jslint
benötigen).
Zusätzlich das Skript:
- Führt JSLint über alle .html und .json Dateien sowie js
- läuft nur JSLint über Dateien, die hinzugefügt, kopiert oder verändert wurden. Dies verhindert, dass JSLint von erroring auf Dateien, die umbenannt oder gelöscht wurden.
- Repliziert alle JSLint Fehler für den Benutzer sehen
- Verwendet die
--indent 4 --white true
JSLint Optionen Quellcode Konsistenz , um sicherzustellen,
Um es folgendes zu arbeiten kopieren .git/hooks/pre-commit
und vergessen Sie nicht chmod +x .git/hooks/pre-commit
# Pre-commit hook passing files through jslint
#
# This ensures that all js, html and json files are valid and conform
# to expectations.
ROOT_DIR=$(git rev-parse --show-toplevel)
JSLINT="${ROOT_DIR}/node_modules/.bin/jslint --indent 4 --white true"
for file in $(git diff-index --name-only --diff-filter=ACM --cached HEAD -- | grep -P '\.((js)|(html)|(json))$'); do
if node $JSLINT $file 2>&1 | grep 'No errors found' ; then
echo "jslint passed ${file}"
exit 0
else
node $JSLINT $file
exit 1
fi
done
for js in $(git diff-index --name-only --cached HEAD -- | grep '\.js$'); do
if jslint.sh $js 2>&1 | grep 'Lint at line' ; then
echo $js
exit 1
else
echo "js files validated"
exit 0
fi
done