VulpesOS/gaia/tools/pre-commit
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

211 lines
6.2 KiB
Shell
Executable file

#!/bin/bash
export LC_ALL=C
############################### JS Lint #####################################
LINTED_DIRECTORIES="apps shared build/test/unit tv_apps"
JSHINT_EXECUTABLE="node_modules/.bin/jshint"
JSHINT_ARGS="--reporter=build/jshint/reporter $JSHINT_ARGS"
ESLINT_EXECUTABLE="node_modules/.bin/eslint"
ESLINT_XFAIL_LIST="build/eslint/xfail.list"
ESLINT_ARGS="--ignore-path ${ESLINT_XFAIL_LIST}.tmp -f compact -c .eslintrc"
excluded_list=".jshintignore"
L10N_XFAIL_LIST="build/l10n/xfail.list"
jshint_information() {
echo "Please read https://github.com/mozilla-b2g/gaia/tree/master/build/jshint/README.md for more information.\n"
}
mozL10n_information() {
echo "Please read https://github.com/mozilla-b2g/gaia/tree/master/build/l10n/README.md for more information.\n"
}
eslint_information() {
echo "Please read https://github.com/mozilla-b2g/gaia/tree/master/build/eslint/README.md for more information.\n"
}
if [ ! -r $excluded_list ];
then
exit 0
fi
hash node > /dev/null 2>&1
if [ $? -eq 1 ];
then
echo >&2 "You should install node to lint your patch"
echo >&2 "http://nodejs.org/download/"
exit 0
fi
if [ ! -x "$JSHINT_EXECUTABLE" ];
then
echo >&2 'You should run `npm install` to lint your patch'
exit 0
fi
# Skips if this repo is on an older commit where eslint is not yet available
if [ ! -x "$ESLINT_EXECUTABLE" -a -r ".eslintrc" ];
then
echo >&2 'You should run `npm install` to lint your patch'
exit 0
fi
js_changed_files=`git diff --staged --name-only --diff-filter=ACMRT -- $LINTED_DIRECTORIES | grep '\.js$'`
if [ -n "$js_changed_files" ]
then
echo "jshint check:"
# using the real jshint instead of the make target to prevent running npm
# install at commit time
$JSHINT_EXECUTABLE $JSHINT_ARGS $js_changed_files
jshint_result=$?
eslint_result=0
# Skip if this repo is on an older commit where eslint is not yet available
if [ -r ".eslintrc" ];
then
echo "eslint check:"
# filter comments from xfail.list:
sed 's/\s*#.*$//' "$ESLINT_XFAIL_LIST" | sort -u > "$ESLINT_XFAIL_LIST".tmp
# check if a changed file is in the eslint xfail list
xfailed_eslint=`echo "$js_changed_files" | sort | comm -12 "$ESLINT_XFAIL_LIST".tmp - | tr '[:space:]' ' '`
if [ -n "$xfailed_eslint" ] ; then
# warn about files being xfailed
for file in $js_changed_files ; do
one_was_ignored=""
if grep -q $file "$ESLINT_XFAIL_LIST" ; then
one_was_ignored="1"
echo "$file: eslint errors are ignored. Please consider fixing these errors and removing the filename from $ESLINT_XFAIL_LIST."
fi
done
test -n "$one_was_ignored" && eslint_information
fi
$ESLINT_EXECUTABLE $ESLINT_ARGS $js_changed_files
eslint_result=$?
rm "$ESLINT_XFAIL_LIST".tmp
fi
if [ $jshint_result -ne 0 -o $eslint_result -ne 0 ] ; then
echo "There were errors while linting the files, please see above."
test $jshint_result -ne 0 && jshint_information
test $eslint_result -ne 0 && eslint_information
exit 1
fi
# XXX migrate this to an eslint plugin: https://bugzil.la/1159667
if [ -r "$L10N_XFAIL_LIST" ]; then
echo
echo "mozL10n check:"
# warn about files being xfailed
for file in $js_changed_files ; do
one_was_ignored=""
if grep -q $file "$L10N_XFAIL_LIST" ; then
one_was_ignored="1"
echo "$file: mozL10n errors are ignored. Please consider fixing errors and removing it from $L10N_XFAIL_LIST."
fi
done
test -n "$one_was_ignored" && mozL10n_information
to_lint=`echo "$js_changed_files" | sort | comm -13 "$L10N_XFAIL_LIST" - | tr '[:space:]' ' '`
# check for deprecated mozL10n API uses
for file in $to_lint ; do
one_failed=""
if grep -q "mozL10n.get\b" "$file" ; then
one_failed="1"
echo "$file uses mozL10n.get which is deprecated."
fi
done
test -n "$one_failed" && mozL10n_information && exit 1
fi
fi
############################### CSS Lint #####################################
css_changed_files=`git diff --staged --name-only --diff-filter=ACMRT -- apps shared/ | grep '\.css$' | tr '\n' ' '`
if [ -n "$css_changed_files" ]
then
XULRUNNER_SDK=$(make xulrunner_sdk)
XPCSHELL_SDK=$(make xpcshell_sdk)
# $XULRUNNER_SDK is an environment variable assignment on some platforms, for
# example: LD_LIBRARY_PATH=/xxx/xxx/xxx
# so we need to use "env" to properly execute this command expanding this
# variable assignment as intended.
env GAIA_DIR=$(pwd) $XULRUNNER_SDK $XPCSHELL_SDK \
-f build/xpcshell-commonjs.js \
-e "quit(require('csslint').lint('$(pwd)', '$css_changed_files'));"
if [ $? -ne 0 ]
then
echo "There were errors while linting the files, please see above."
exit 1
fi
fi
echo "No errors - committing"
############################# locale check #####################################
locales_changed_files=`git diff --staged --name-only --diff-filter=ACMRT | grep '\.properties$'`
if [ -n "$locales_changed_files" ]
then
updatedL10nIds=()
needToHintDevelopers=0
for file in $locales_changed_files ; do
grepRuleForBoth="^[+-].*=.*"
grepRuleForAddition="^[+](.*)="
grepRuleForDeletion="^[-](.*)="
addition_locale_ids=()
deletion_locale_ids=()
count=0
while read -r eachLine
do
if [[ "$eachLine" =~ $grepRuleForAddition ]]
then
addition_locale_ids+=(${BASH_REMATCH[1]})
fi
if [[ "$eachLine" =~ $grepRuleForDeletion ]]
then
deletion_locale_ids+=(${BASH_REMATCH[1]})
fi
# check http://mywiki.wooledge.org/BashFAQ/024
done < <(git diff HEAD~ --staged $file | grep $grepRuleForBoth)
# final compare
for eachAdditionId in "${addition_locale_ids[@]}"
do
for eachDeletionId in "${deletion_locale_ids[@]}"
do
if [[ "$eachAdditionId" =~ "$eachDeletionId" ]]
then
needToHintDevelopers=1
updatedL10nIds+=($eachAdditionId)
fi
done
done
done
if [ $needToHintDevelopers -ne 0 ]
then
echo "[NOTE] You are updating the same translation under these locale ids :"
for eachL10nId in "${updatedL10nIds[@]}"
do
echo "Updated id : $eachL10nId"
done
echo "Please double check whether you should introduce a new locale id or not."
fi
fi