diff --git a/tools/push.sh b/tools/push.sh new file mode 100755 index 000000000..435c5f6dc --- /dev/null +++ b/tools/push.sh @@ -0,0 +1,108 @@ +# Copyright 2014 Samsung Electronics Co., Ltd. +# +# 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. + +#!/bin/bash + +GIT_STATUS_NOT_CLEAN_MSG="Git status of current directory is not clean" +GIT_STATUS_CONSIDER_CLEAN_MSG="Consider removing all untracked files, locally commiting all changes and running $0 again" + +trap ctrl_c INT + +function ctrl_c() { + git checkout master >&/dev/null + + exit 1 +} + +clear + +if [ "`git status --porcelain 2>&1 | wc -l`" != "0" ] +then + echo -e "\n \e[1;90m$GIT_STATUS_NOT_CLEAN_MSG:\n" + git status + echo -e "\n\n $GIT_STATUS_CONSIDER_CLEAN_MSG.\e[0m\n" +fi + +ok_to_push=1 + +current_branch=`git branch | grep "^* " | cut -d ' ' -f 2` + +if [ "$current_branch" != "master" ] +then + echo "Current branch is '$current_branch', not 'master'." + + exit 1 +fi + +commits_to_push=`git log origin/master..master | grep "^commit [0-9a-f]*$" | awk 'BEGIN { s = "";} {s = $2" "s;} END {print s;}'` + +echo +echo "===== Starting pre-push commit testing series =====" +echo +echo "Commits list: $commits_to_push" +echo + +for commit_hash in $commits_to_push +do + echo " > Testing $commit_hash" + echo + + git checkout $commit_hash >&/dev/null + status_code=$? + if [ $status_code -ne 0 ] + then + echo "git checkout $commit_hash failed" + + exit 1 + fi + + precommit_testing_output=`make -j precommit 2>&1` + status_code=$? + if [ $status_code -ne 0 ] + then + echo "Pre-commit testing for '$commit_hash' failed" + echo + echo $precommit_testing_output + echo + + ok_to_push=0 + break + fi +done + +git checkout master >&/dev/null + +echo +echo "Pre-commit testing passed successfully" +echo + +if [ $ok_to_push -eq 1 ] +then + if [ "`git status --porcelain 2>&1 | grep -v -e '^?? out/$$' | wc -l`" == "0" ] + then + echo "git push" + echo + + git push + exit 0 + else + echo -e "\e[1;33m $GIT_STATUS_NOT_CLEAN_MSG. $GIT_STATUS_CONSIDER_CLEAN_MSG.\e[0m\n" + + exit 1 + fi +else + echo "\e[1;33mPre-commit testing not passed. Cancelling push.\e[0m" + + exit 1 +fi