xref: /aosp_15_r20/tools/metalava/scripts/merge-from-metalava-main.sh (revision 115816f9299ab6ddd6b9673b81f34e707f6bacab)
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