#!/bin/bash

#
# Copyright (c) 2015 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


# crawls the source tree to find out the amount of checkpatch issues
# and optionally update scripts/known_checkpatch_issues
# usage: check_known_checkpatch_issues.sh [-u]
# where: -u updates the known_checkpatch_issues db and commits it
#        -q is the quiet mode (don't display the diff on stdout)

exe_name=$(basename $0)

do_checkpatch_bin=${ZEPHYR_BASE}/scripts/do_checkpatch.sh
timestamp_bin=${ZEPHYR_BASE}/scripts/timestamp

declare update=n
declare quiet=n

function usage {
	printf "usage: %s [-u][-q]\n" ${exe_name} >&2
}

function fail {
	usage
	exit -1
}
function verify_needed {
	needed="\
		${do_checkpatch_bin} \
		${timestamp_bin} \
	"
	for i in ${needed}; do
		type $i &>/dev/null
		if [ $? != 0 ]; then
			printf "need '%s' but not found in PATH\n" $i >&2
			exit -1
		fi
	done
}

function get_opts {
	declare -r optstr="quh"
	while getopts ${optstr} opt; do
		case ${opt} in
		u) update=y ;;
		q) quiet=y ;;
		h) usage; exit 0 ;;
		*) fail ;;
		esac
	done
}

verify_needed
get_opts $@

do_checkpatch=${do_checkpatch_bin}
timestamp="${timestamp_bin} -u"
ts=$(${timestamp})
uid=$(id -u)
pid=$$
suffix=${uid}-${pid}-${ts}
checkpatch_results=/tmp/checkpatch.results-${suffix}
known_checkpatch_issues=${ZEPHYR_BASE}/scripts/known_checkpatch_issues
checkpatch_issues=/tmp/checkpatch_issues-${suffix}
git_log_params="\
	--abbrev=8 \
	--abbrev-commit \
"

commit_id_str=$(git log ${git_log_params} HEAD | head -n 1)
echo ${commit_id_str} > ${checkpatch_issues}

${do_checkpatch} ${checkpatch_results} >> ${checkpatch_issues}

diff_file=/tmp/checkpatch.results.diff-${suffix}
diff -u ${known_checkpatch_issues} ${checkpatch_issues} > ${diff_file}

if [ ${quiet} = n ]; then
	cat ${diff_file}
fi

# find all lines that starts with '+' but not '+commit' or '+++ diff'
minuses_err_str=(\
	$(cat ${diff_file} | \
	grep -v -E "^\-\-\-" | grep -v -E "^\-commit " | grep -E "^\-" | \
	awk '{print $1}' | cut -d\- -f 2-) \
)
minuses_num_err=(\
	$(cat ${diff_file} | \
	grep -v -E "^\-\-\-" | grep -v -E "^\-commit " | grep -E "^\-" | \
	awk '{print $2}') \
)
plusses_err_str=(\
	$(cat ${diff_file} | \
	grep -v -E "^\+\+\+" | grep -v -E "^\+commit " | grep -E "^\+" | \
	awk '{print $1}' | cut -d\+ -f 2-) \
)
plusses_num_err=(\
	$(cat ${diff_file} | \
	grep -v -E "^\+\+\+" | grep -v -E "^\+commit " | grep -E "^\+" | \
	awk '{print $2}') \
)

exit_code=0
declare -i num_plusses=${#plusses_num_err[@]}
declare -i num_minuses=${#minuses_num_err[@]}
declare -i test_num=${num_plusses}
while [ ${test_num} -gt 0 ]; do
	test_num+=-1
	match=n
	declare -i i=${num_minuses}
	while [ $i -gt 0 ]; do
		i+=-1
		if [ ${plusses_err_str[${test_num}]} = ${minuses_err_str[$i]} ]; then
			n_minus=${minuses_num_err[$i]}
			n_plus=${plusses_num_err[${test_num}]}
			if [ ${n_plus} -gt ${n_minus} ]; then
				exit_code=1
				break 2
			fi
			match=y
			break 1
		fi
	done

	if [ ${match} = n ]; then
		# there was no match for the plus line, so that is a new error
		exit_code=1
		break 1
	fi
done

if [ ${update} = y ]; then
	msg="known_checkpatch_issues: updating to ${commit_id_str}"
	cp ${checkpatch_issues} ${known_checkpatch_issues}
	git add ${known_checkpatch_issues}
	git commit -m "${msg}"
fi

exit ${exit_code}
