diff --git a/.travis.yml b/.travis.yml index bb0ad50ba4fa8a06694b98e25d8295ed33b2a003..daf6b71dabf17ff0f7161fc24cb460a13dfb212e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -59,6 +59,7 @@ script: - make -C ./tests/unittests all test BOARD=qemu-i386 || exit - ./dist/tools/compile_test/compile_test.py + - ./dist/tools/pr_check/pr_check.sh riot/master notifications: email: false diff --git a/dist/tools/pr_check/README.md b/dist/tools/pr_check/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2215399652aedf2c3dd3feca0bb056ea4bf56730 --- /dev/null +++ b/dist/tools/pr_check/README.md @@ -0,0 +1,18 @@ +# About + +This script checks if a Pull Request needs squashing or if it is waiting for +another Pull Request. + +# Usage + +```bash +./pr_check.sh [<master branch>] +``` + +The optional `<master branch>` parameter refers to the branch the pull request's +branch branched from. The script will output all commits marked as squashable +from `HEAD` to the merge-base with `<master branch>`. The default for +`<master branch>` is `master`. + +A commit is marked as squashable if it contains the keywords SQUASH or FIX +(case insensitive) within the first five characters of it's subject title. diff --git a/dist/tools/pr_check/pr_check.sh b/dist/tools/pr_check/pr_check.sh new file mode 100755 index 0000000000000000000000000000000000000000..d1f4ebb3652098450140e2f35447643ff3e5739d --- /dev/null +++ b/dist/tools/pr_check/pr_check.sh @@ -0,0 +1,67 @@ +#! /bin/bash +# +# Copyright (C) 2014 Martin Lenders <mlenders@inf.fu-berlin.de> +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. +# + +EXIT_CODE=0 +GITHUB_API_HOST="https://api.github.com" +GITHUB_REPO="RIOT-OS/RIOT" + +if which wget &> /dev/null; then + GET="wget -O -" +elif which curl &> /dev/null; then + GET="curl" +else + echo "Script needs wget or curl" >&2 + exit 2 +fi + +LABELS_JSON=$(${GET} "${GITHUB_API_HOST}/repos/${GITHUB_REPO}/issues/${TRAVIS_PULL_REQUEST}/labels" 2> /dev/null) + +if tput colors &> /dev/null && [ $(tput colors) -ge 8 ]; then + CERROR="\e[1;31m" + CRESET="\e[0m" +else + CERROR= + CRESET= +fi + +check_gh_label() { + LABEL="${1}" + + echo "${LABELS_JSON}" | grep -q "${LABEL}" + return $? +} + +if [[ ${#} -eq 1 ]]; then + RIOT_MASTER="${1}" +else + RIOT_MASTER="master" +fi + +SQUASH_COMMITS="$(git log $(git merge-base HEAD "${RIOT_MASTER}")...HEAD --pretty=format:"\t%C(auto)%h %s%Creset" \ + -i --grep "^.\{0,2\}SQUASH" --grep "^.\{0,2\}FIX")" + +if [ -n "${SQUASH_COMMITS}" ]; then + echo -e "${CERROR}Pull request needs squashing:${CRESET}" 1>&2 + echo -e "${SQUASH_COMMITS}" + EXIT_CODE=1 +fi + +if [ -n "$TRAVIS_PULL_REQUEST" ]; then + if check_gh_label "NEEDS SQUASHING"; then + echo -e "${CERROR}Pull request needs squashing according to its labels${CRESET}" + EXIT_CODE=1 + fi + + if check_gh_label "Waiting For Other PR"; then + echo -e "${CERROR}Pull request is waiting for another pull request according to its labels${CRESET}" + EXIT_CODE=1 + fi +fi + +exit ${EXIT_CODE}