1*115816f9SAndroid Build Coastguard Worker#! /bin/sh 2*115816f9SAndroid Build Coastguard Worker 3*115816f9SAndroid Build Coastguard Worker# 'strict' mode 4*115816f9SAndroid Build Coastguard Workerset -euo pipefail 5*115816f9SAndroid Build Coastguard Worker 6*115816f9SAndroid Build Coastguard WorkerSOURCE_BRANCH=${1-aosp/metalava-main} 7*115816f9SAndroid Build Coastguard Worker 8*115816f9SAndroid Build Coastguard Workerecho -n "Checking status" 9*115816f9SAndroid Build Coastguard WorkerSTATUS=$(git status -s | grep -v "??" || true) 10*115816f9SAndroid Build Coastguard Workerif [[ $STATUS ]]; then 11*115816f9SAndroid Build Coastguard Worker echo " - ERROR" 12*115816f9SAndroid Build Coastguard Worker echo 13*115816f9SAndroid Build Coastguard Worker echo "The following changed files would interfere with merge:" 14*115816f9SAndroid Build Coastguard Worker echo "$STATUS" 15*115816f9SAndroid Build Coastguard Worker exit 1 16*115816f9SAndroid Build Coastguard Workerelse 17*115816f9SAndroid Build Coastguard Worker echo " - OK" 18*115816f9SAndroid Build Coastguard Workerfi 19*115816f9SAndroid Build Coastguard Worker 20*115816f9SAndroid Build Coastguard Workerecho -n "Checking current branch" 21*115816f9SAndroid Build Coastguard WorkerBRANCH=$(git branch --show-current) 22*115816f9SAndroid Build Coastguard Workerif [[ $BRANCH ]]; then 23*115816f9SAndroid Build Coastguard Worker echo " - OK ($BRANCH)" 24*115816f9SAndroid Build Coastguard Workerelse 25*115816f9SAndroid Build Coastguard Worker echo " - ERROR" 26*115816f9SAndroid Build Coastguard Worker echo 27*115816f9SAndroid Build Coastguard Worker echo "No branch found, please run 'repo start <branch>'." 28*115816f9SAndroid Build Coastguard Worker exit 1 29*115816f9SAndroid Build Coastguard Workerfi 30*115816f9SAndroid Build Coastguard Worker 31*115816f9SAndroid Build Coastguard Workerecho -n "Current upstream branch" 32*115816f9SAndroid Build Coastguard WorkerCURRENT_BRANCH=$(git rev-parse --abbrev-ref --symbolic-full-name @{u}) 33*115816f9SAndroid Build Coastguard Workerecho " - ${CURRENT_BRANCH}" 34*115816f9SAndroid Build Coastguard Worker 35*115816f9SAndroid Build Coastguard Workerfunction output_only_on_failure() { 36*115816f9SAndroid Build Coastguard Worker set +e 37*115816f9SAndroid Build Coastguard Worker OUTPUT=$(eval "$@" 2>&1) 38*115816f9SAndroid Build Coastguard Worker EXIT_CODE=$? 39*115816f9SAndroid Build Coastguard Worker set -e 40*115816f9SAndroid Build Coastguard Worker if [[ $EXIT_CODE != 0 ]]; then 41*115816f9SAndroid Build Coastguard Worker echo " - ERROR" 42*115816f9SAndroid Build Coastguard Worker echo "Command: $@" 43*115816f9SAndroid Build Coastguard Worker echo $OUTPUT 44*115816f9SAndroid Build Coastguard Worker exit 1 45*115816f9SAndroid Build Coastguard Worker fi 46*115816f9SAndroid Build Coastguard Worker} 47*115816f9SAndroid Build Coastguard Worker 48*115816f9SAndroid Build Coastguard Worker# Make sure that ${SOURCE_BRANCH} is up to date. 49*115816f9SAndroid Build Coastguard Workerecho -n "Making sure that ${SOURCE_BRANCH} is up to date" 50*115816f9SAndroid Build Coastguard WorkerSPLIT_REPOSITORY_BRANCH=${SOURCE_BRANCH/\// } 51*115816f9SAndroid Build Coastguard Workeroutput_only_on_failure git fetch ${SPLIT_REPOSITORY_BRANCH} 52*115816f9SAndroid Build Coastguard Workerecho " - OK" 53*115816f9SAndroid Build Coastguard Worker 54*115816f9SAndroid Build Coastguard Workerecho -n "Checking to see if there is anything to merge" 55*115816f9SAndroid Build Coastguard WorkerMERGE_BASE=$(git merge-base HEAD ${SOURCE_BRANCH}) 56*115816f9SAndroid Build Coastguard Workerif [[ ${MERGE_BASE} == $(git rev-parse ${SOURCE_BRANCH}) ]]; then 57*115816f9SAndroid Build Coastguard Worker echo " - NOTHING TO DO" 58*115816f9SAndroid Build Coastguard Worker exit 0 59*115816f9SAndroid Build Coastguard Workerelse 60*115816f9SAndroid Build Coastguard Worker echo " - CHANGES FOUND" 61*115816f9SAndroid Build Coastguard Workerfi 62*115816f9SAndroid Build Coastguard Worker 63*115816f9SAndroid Build Coastguard Workerecho -n "Extracting bugs from merged in changes" 64*115816f9SAndroid Build Coastguard WorkerBUGS=$(git log ${MERGE_BASE}..${SOURCE_BRANCH} --no-merges | (grep -E "^ *Bug: *[0-9]+" || true) | sed "s/Bug://" | sort -u -n) 65*115816f9SAndroid Build Coastguard Workerecho " - DONE" 66*115816f9SAndroid Build Coastguard Worker 67*115816f9SAndroid Build Coastguard Workerecho -n "Extracting change list from merged in changes" 68*115816f9SAndroid Build Coastguard Worker 69*115816f9SAndroid Build Coastguard Worker# Get the Change-Id from the non-merge changes. 70*115816f9SAndroid Build Coastguard Worker# This uses the Change-Id rather than the SHA as the Change-Id is consistent 71*115816f9SAndroid Build Coastguard Worker# across branches but the SHA might not be. 72*115816f9SAndroid Build Coastguard WorkerCHANGE_IDS=$(git log ${MERGE_BASE}..${SOURCE_BRANCH} --no-merges | (grep -E "^ *Change-Id: I*[0-9a-f]+" || true) | sed "s/^ *Change-Id: //") 73*115816f9SAndroid Build Coastguard Worker 74*115816f9SAndroid Build Coastguard Worker# Generate a query which will find only those changes which are from metalava-main. 75*115816f9SAndroid Build Coastguard Worker# All changes to tools/metalava must come from metalava-main or main (build changes). 76*115816f9SAndroid Build Coastguard WorkerQUERY="(branch:metalava-main or branch:main) and ($(echo $CHANGE_IDS | sed 's/ / or /g')) and status:merged" 77*115816f9SAndroid Build Coastguard Worker 78*115816f9SAndroid Build Coastguard Worker# Generate a list of changes to insert in the commit message. 79*115816f9SAndroid Build Coastguard Worker# This queries the Android Gerrit as metalava development is always done in AOSP. 80*115816f9SAndroid Build Coastguard WorkerCHANGE_LIST=$(/google/data/ro/projects/android/gerrit -g android -r --custom_raw_format '{o.number} {o.subject}' search "$QUERY" | while read NUMBER SUBJECT 81*115816f9SAndroid Build Coastguard Workerdo 82*115816f9SAndroid Build Coastguard Worker echo "* $SUBJECT" 83*115816f9SAndroid Build Coastguard Worker echo " - https://r.android.com/$NUMBER" 84*115816f9SAndroid Build Coastguard Workerdone) 85*115816f9SAndroid Build Coastguard Workerecho " - DONE" 86*115816f9SAndroid Build Coastguard Worker 87*115816f9SAndroid Build Coastguard Workerecho -n "Performing the merge" 88*115816f9SAndroid Build Coastguard WorkerMESSAGE_FILE=$(mktemp) 89*115816f9SAndroid Build Coastguard Workertrap "rm -f ${MESSAGE_FILE}" EXIT 90*115816f9SAndroid Build Coastguard Worker 91*115816f9SAndroid Build Coastguard WorkerSCRIPT_PATH=${0##*metalava/} 92*115816f9SAndroid Build Coastguard Worker 93*115816f9SAndroid Build Coastguard Workercat > ${MESSAGE_FILE} <<EOF 94*115816f9SAndroid Build Coastguard WorkerMerge remote-tracking branch '${SOURCE_BRANCH}' into '${CURRENT_BRANCH}' 95*115816f9SAndroid Build Coastguard Worker 96*115816f9SAndroid Build Coastguard WorkerMerge performed by: 97*115816f9SAndroid Build Coastguard Worker ${SCRIPT_PATH}${1+ $@} 98*115816f9SAndroid Build Coastguard Worker 99*115816f9SAndroid Build Coastguard WorkerChanges includes in this merge (from newest to oldest): 100*115816f9SAndroid Build Coastguard Worker${CHANGE_LIST} 101*115816f9SAndroid Build Coastguard Worker 102*115816f9SAndroid Build Coastguard WorkerThis merge includes a number of changes so this contains a list of all 103*115816f9SAndroid Build Coastguard Workerthe affected bugs in order from oldest to newest. 104*115816f9SAndroid Build Coastguard Worker 105*115816f9SAndroid Build Coastguard Worker$(for BUG in $BUGS; do echo "Bug: $BUG"; done) 106*115816f9SAndroid Build Coastguard WorkerTest: m checkapi 107*115816f9SAndroid Build Coastguard WorkerEOF 108*115816f9SAndroid Build Coastguard Worker 109*115816f9SAndroid Build Coastguard Workeroutput_only_on_failure git merge ${SOURCE_BRANCH} --no-ff -F ${MESSAGE_FILE} 110*115816f9SAndroid Build Coastguard Worker 111*115816f9SAndroid Build Coastguard Workerecho " - DONE" 112*115816f9SAndroid Build Coastguard Workerecho "The merge commit has been created. Please do the following before uploading:" 113*115816f9SAndroid Build Coastguard Workerecho "1. Verify the commit by running 'm checkapi'" 114*115816f9SAndroid Build Coastguard Workerecho "2. Review the commit to make sure it includes what is expected" 115*115816f9SAndroid Build Coastguard Worker 116