1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# patchtest: Run patchtest on commits starting at master 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Copyright (c) 2017, Intel Corporation. 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunset -o errexit 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun# Default values 13*4882a593Smuzhiyunpokydir='' 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunusage() { 16*4882a593SmuzhiyunCMD=$(basename $0) 17*4882a593Smuzhiyuncat <<EOM 18*4882a593SmuzhiyunUsage: $CMD [-h] [-p pokydir] 19*4882a593Smuzhiyun -p pokydir Defaults to current directory 20*4882a593SmuzhiyunEOM 21*4882a593Smuzhiyun>&2 22*4882a593Smuzhiyun exit 1 23*4882a593Smuzhiyun} 24*4882a593Smuzhiyun 25*4882a593Smuzhiyunfunction clone() { 26*4882a593Smuzhiyun local REPOREMOTE=$1 27*4882a593Smuzhiyun local REPODIR=$2 28*4882a593Smuzhiyun if [ ! -d $REPODIR ]; then 29*4882a593Smuzhiyun git clone $REPOREMOTE $REPODIR --quiet 30*4882a593Smuzhiyun else 31*4882a593Smuzhiyun ( cd $REPODIR; git pull --quiet ) 32*4882a593Smuzhiyun fi 33*4882a593Smuzhiyun} 34*4882a593Smuzhiyun 35*4882a593Smuzhiyunwhile getopts ":p:h" opt; do 36*4882a593Smuzhiyun case $opt in 37*4882a593Smuzhiyun p) 38*4882a593Smuzhiyun pokydir=$OPTARG 39*4882a593Smuzhiyun ;; 40*4882a593Smuzhiyun h) 41*4882a593Smuzhiyun usage 42*4882a593Smuzhiyun ;; 43*4882a593Smuzhiyun \?) 44*4882a593Smuzhiyun echo "Invalid option: -$OPTARG" >&2 45*4882a593Smuzhiyun usage 46*4882a593Smuzhiyun ;; 47*4882a593Smuzhiyun :) 48*4882a593Smuzhiyun echo "Option -$OPTARG requires an argument." >&2 49*4882a593Smuzhiyun usage 50*4882a593Smuzhiyun ;; 51*4882a593Smuzhiyun esac 52*4882a593Smuzhiyundone 53*4882a593Smuzhiyunshift $((OPTIND-1)) 54*4882a593Smuzhiyun 55*4882a593SmuzhiyunCDIR="$PWD" 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun# default pokydir to current directory if user did not specify one 58*4882a593Smuzhiyunif [ -z "$pokydir" ]; then 59*4882a593Smuzhiyun pokydir="$CDIR" 60*4882a593Smuzhiyunfi 61*4882a593Smuzhiyun 62*4882a593SmuzhiyunPTENV="$PWD/patchtest" 63*4882a593SmuzhiyunPT="$PTENV/patchtest" 64*4882a593SmuzhiyunPTOE="$PTENV/patchtest-oe" 65*4882a593Smuzhiyun 66*4882a593Smuzhiyunif ! which virtualenv > /dev/null; then 67*4882a593Smuzhiyun echo "Install virtualenv before proceeding" 68*4882a593Smuzhiyun exit 1; 69*4882a593Smuzhiyunfi 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun# activate the virtual env 72*4882a593Smuzhiyunvirtualenv $PTENV --quiet 73*4882a593Smuzhiyunsource $PTENV/bin/activate 74*4882a593Smuzhiyun 75*4882a593Smuzhiyuncd $PTENV 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun# clone or pull 78*4882a593Smuzhiyunclone git://git.yoctoproject.org/patchtest $PT 79*4882a593Smuzhiyunclone git://git.yoctoproject.org/patchtest-oe $PTOE 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun# install requirements 82*4882a593Smuzhiyunpip install -r $PT/requirements.txt --quiet 83*4882a593Smuzhiyunpip install -r $PTOE/requirements.txt --quiet 84*4882a593Smuzhiyun 85*4882a593SmuzhiyunPATH="$PT:$PT/scripts:$PATH" 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun# loop through parent to HEAD and execute patchtest on each commit 88*4882a593Smuzhiyunfor commit in $(git rev-list master..HEAD --reverse) 89*4882a593Smuzhiyundo 90*4882a593Smuzhiyun shortlog="$(git log "$commit^1..$commit" --pretty='%h: %aN: %cd: %s')" 91*4882a593Smuzhiyun log="$(git format-patch "$commit^1..$commit" --stdout | patchtest - -r $pokydir -s $PTOE/tests --base-commit $commit^1 --json 2>/dev/null | create-summary --fail --only-results)" 92*4882a593Smuzhiyun if [ -z "$log" ]; then 93*4882a593Smuzhiyun shortlog="$shortlog: OK" 94*4882a593Smuzhiyun else 95*4882a593Smuzhiyun shortlog="$shortlog: FAIL" 96*4882a593Smuzhiyun fi 97*4882a593Smuzhiyun echo "$shortlog" 98*4882a593Smuzhiyun echo "$log" | sed -n -e '/Issue/p' -e '/Suggested fix/p' 99*4882a593Smuzhiyun echo "" 100*4882a593Smuzhiyundone 101*4882a593Smuzhiyun 102*4882a593Smuzhiyundeactivate 103*4882a593Smuzhiyun 104*4882a593Smuzhiyuncd $CDIR 105