diff --git a/tools/pre-commit-hook b/tools/pre-commit-hook new file mode 100755 index 0000000000..699cb978ee --- /dev/null +++ b/tools/pre-commit-hook @@ -0,0 +1,45 @@ +#!/bin/sh + +TOPLEVEL=$(git rev-parse --show-toplevel) +RES=0 + +cd $TOPLEVEL + +if [ "$1" == "--install" ]; then + ln -sf ../../tools/pre-commit-hook .git/hooks/pre-commit + exit +fi + +tmpdir=$(mktemp -d precommit.XXXXXX) || exit 1 +trap "rm -rf $TOPLEVEL/$tmpdir" 0 + +git diff --cached --name-only --diff-filter=ACMR | + xargs git checkout-index --prefix=$tmpdir/ -- + +cd $tmpdir + +echo "=== starting pre-commit checks ===" + +echo "Checking the following files:" + +find . -type f + +echo "=== bashate checks ===" + +find . -type f -print0 | + xargs -0 --no-run-if-empty egrep -lZ '^#!/bin/(ba)?sh' | + xargs -0 bashate || RES=1 + +echo "=== yaml checks ===" + +find . -name '*.yaml' -print0 | + xargs -0 --no-run-if-empty python ${TOPLEVEL}/tools/try-parse-yaml.py + +echo "=== json checks ===" + +find . -name '*.json' -print0 | + xargs -0 -n1 --no-run-if-empty python -mjson.tool \ + || RES=1 + +exit $RES + diff --git a/tools/validate-all-json.sh b/tools/validate-all-json.sh new file mode 100755 index 0000000000..ce85fadd69 --- /dev/null +++ b/tools/validate-all-json.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +TOPLEVEL=$(git rev-parse --show-toplevel) + +cd $TOPLEVEL + +git ls-files -z '*.json' | + xargs -0 python tools/validate-json.py || exit 1 + diff --git a/tools/validate-all-yaml.sh b/tools/validate-all-yaml.sh new file mode 100755 index 0000000000..6a16d9a980 --- /dev/null +++ b/tools/validate-all-yaml.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +TOPLEVEL=$(git rev-parse --show-toplevel) + +cd $TOPLEVEL + +git ls-files -z '*.yaml' | + xargs -0 python tools/validate-yaml.py || exit 1 + diff --git a/tools/validate-json.py b/tools/validate-json.py new file mode 100755 index 0000000000..d7e1cd8733 --- /dev/null +++ b/tools/validate-json.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import os +import sys +import argparse +import json +import logging + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument('input', nargs='*') + return p.parse_args() + +def main(): + args = parse_args() + logging.basicConfig() + res = 0 + + for filename in args.input: + with open(filename) as fd: + try: + data = json.load(fd) + except ValueError as error: + res = 1 + logging.error('%s failed validation: %s', + filename, error) + + sys.exit(res) + +if __name__ == '__main__': + main() + + diff --git a/tools/validate-json.sh b/tools/validate-json.sh index 35338e8d95..296ef781c6 100755 --- a/tools/validate-json.sh +++ b/tools/validate-json.sh @@ -1,34 +1,3 @@ -#!/bin/bash -set -e -ret=0 +#!/bin/sh -# For MacOSX users the freebsd's mktemp by default behave diferently, -# installing the coreutils from brew would give you this but that would be -# renamed to gmktemp to don't conflict with the stand mktemp, so let just use -# that if available. -if type -p gmktemp &>/dev/null; then - TMPFILE=$(gmktemp) -else - TMPFILE=$(mktemp) -fi - -function clean { - rm -f ${TMPFILE} -} -trap clean EXIT - -linter=jsonlint -type -p jsonlint &>/dev/null || linter=python - -for f in $(find docker -type f -name '*.json');do - if [[ ${linter} == jsonlint ]];then - jsonlint -s ${f} >${TMPFILE} - egrep -q 'has errors$' ${TMPFILE} && { cat ${TMPFILE}; ret=1 ;} - else - python -m json.tool ${f} &>/dev/null || { echo "$f: has json errors"; ret=1; } - fi -done - -cat ${TMPFILE} - -exit ${ret} +true diff --git a/tools/validate-yaml.py b/tools/validate-yaml.py new file mode 100755 index 0000000000..9799a7aba5 --- /dev/null +++ b/tools/validate-yaml.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import os +import sys +import argparse +import yaml +import logging + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument('input', nargs='*') + return p.parse_args() + +def main(): + args = parse_args() + logging.basicConfig() + res = 0 + + for filename in args.input: + with open(filename) as fd: + try: + data = yaml.load(fd) + except yaml.error.YAMLError as error: + res = 1 + logging.error('%s failed validation: %s', + filename, error) + + sys.exit(res) + +if __name__ == '__main__': + main() + +