1*ec779b8eSAndroid Build Coastguard Worker#!/bin/bash 2*ec779b8eSAndroid Build Coastguard Worker#set -x 3*ec779b8eSAndroid Build Coastguard Worker 4*ec779b8eSAndroid Build Coastguard Worker# used for projects where some files are mainline, some are not 5*ec779b8eSAndroid Build Coastguard Worker# we get a list of the files/directories out of the project's root. 6*ec779b8eSAndroid Build Coastguard Worker# 7*ec779b8eSAndroid Build Coastguard Worker# invocation $0 ${repo_root} ${preupload_files} 8*ec779b8eSAndroid Build Coastguard Worker# 9*ec779b8eSAndroid Build Coastguard Worker# Example PREUPLOAD.cfg: 10*ec779b8eSAndroid Build Coastguard Worker# 11*ec779b8eSAndroid Build Coastguard Worker# [Hook Scripts] 12*ec779b8eSAndroid Build Coastguard Worker# mainline_hook = ${REPO_ROOT}/frameworks/av/tools/mainline_hook_partial.sh ${REPO_ROOT} ${PREUPLOAD_FILES} 13*ec779b8eSAndroid Build Coastguard Worker# 14*ec779b8eSAndroid Build Coastguard Worker# MainlineFiles.cfg syntax: 15*ec779b8eSAndroid Build Coastguard Worker# 16*ec779b8eSAndroid Build Coastguard Worker# ignore comment (#) lines and blank lines 17*ec779b8eSAndroid Build Coastguard Worker# rest are path prefixes starting at root of the project 18*ec779b8eSAndroid Build Coastguard Worker# (so OWNERS, not frameworks/av/OWNERS) 19*ec779b8eSAndroid Build Coastguard Worker# 20*ec779b8eSAndroid Build Coastguard Worker# path 21*ec779b8eSAndroid Build Coastguard Worker# INCLUDE path 22*ec779b8eSAndroid Build Coastguard Worker# EXCLUDE path 23*ec779b8eSAndroid Build Coastguard Worker# 24*ec779b8eSAndroid Build Coastguard Worker# 'path' and 'INCLUDE path' are identical -- they both indicate that this path 25*ec779b8eSAndroid Build Coastguard Worker# is part of mainline 26*ec779b8eSAndroid Build Coastguard Worker# EXCLUDE indicates that this is not part of mainline, 27*ec779b8eSAndroid Build Coastguard Worker# so 'foo/' and 'EXCLUDE foo/nope' 28*ec779b8eSAndroid Build Coastguard Worker# means everything under foo/ is part of mainline EXCEPT foo/nope. 29*ec779b8eSAndroid Build Coastguard Worker# INCLUDE/EXCLUDE/INCLUDE nested structuring is not supported 30*ec779b8eSAndroid Build Coastguard Worker# 31*ec779b8eSAndroid Build Coastguard Worker# matching is purely prefix 32*ec779b8eSAndroid Build Coastguard Worker# so 'foo' will match 'foo', 'foo.c', 'foo/bar/baz' 33*ec779b8eSAndroid Build Coastguard Worker# if you want to exclude a directory, best to use a pattern like "foo/" 34*ec779b8eSAndroid Build Coastguard Worker# 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker## tunables: 37*ec779b8eSAndroid Build Coastguard Worker## 38*ec779b8eSAndroid Build Coastguard Worker## as of 2024/5, things are all on the same branch. 39*ec779b8eSAndroid Build Coastguard WorkerDEV_BRANCH=main 40*ec779b8eSAndroid Build Coastguard WorkerMAINLINE_BRANCH=main 41*ec779b8eSAndroid Build Coastguard Workerfilelist_file=MainlineFiles.cfg 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker### 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard WorkerREPO_ROOT=$1; shift 46*ec779b8eSAndroid Build Coastguard Worker# the rest of the command line is the file list 47*ec779b8eSAndroid Build Coastguard WorkerPREUPLOAD_FILES="$*" 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard WorkerRED=$(tput setaf 1) 50*ec779b8eSAndroid Build Coastguard WorkerNORMAL=$(tput sgr0) 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker## get the active branch: 53*ec779b8eSAndroid Build Coastguard Worker## * <localbranch> <shainfo> [goog/master] Fix to handle missing checks on error returned 54*ec779b8eSAndroid Build Coastguard Worker## strip this down to "master" 55*ec779b8eSAndroid Build Coastguard Worker## * b157501573_advisory 25521834a6 [goog/sc-dev] Merge "PlayerBase: add audio session ID" into sc-dev 56*ec779b8eSAndroid Build Coastguard Worker## 57*ec779b8eSAndroid Build Coastguard Workercurrent=`git branch -vv | grep -P "^\*[^\[]+\[goog/"|sed -e 's/^.*\[//' | sed -e 's/\].*$//'|sed -e 's/:.*$//'| sed -e 's/^goog\///'` 58*ec779b8eSAndroid Build Coastguard Workerif [ "${current}" = "" ] ; then 59*ec779b8eSAndroid Build Coastguard Worker current=unknown 60*ec779b8eSAndroid Build Coastguard Workerfi 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker## figure out whether which files are for mainline and which are not 63*ec779b8eSAndroid Build Coastguard Workerif [ "${PREUPLOAD_FILES}" = "" ] ; then 64*ec779b8eSAndroid Build Coastguard Worker # empty files? what's up there, i suppose we'll let that go 65*ec779b8eSAndroid Build Coastguard Worker exit 0 66*ec779b8eSAndroid Build Coastguard Workerfi 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker## get the list of files out of the project's root 69*ec779b8eSAndroid Build Coastguard Worker## figure out which way I'm going .. 70*ec779b8eSAndroid Build Coastguard Worker## use list of files to scan PREUPLOAD_FILES 71*ec779b8eSAndroid Build Coastguard Worker## use PREUPLOAD_FILES to scan the list of good/bad from the project root 72*ec779b8eSAndroid Build Coastguard Worker## 73*ec779b8eSAndroid Build Coastguard Worker## remember to do an exclude, so I can say 74*ec779b8eSAndroid Build Coastguard Worker## include/these/files/ 75*ec779b8eSAndroid Build Coastguard Worker## EXCLUDE include/these/files/nested/ 76*ec779b8eSAndroid Build Coastguard Worker## 77*ec779b8eSAndroid Build Coastguard Worker## and it should all be prefix based stuff... 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Workerif [ ! -f ${REPO_ROOT}/${REPO_PATH}/${filelist_file} ] ; then 80*ec779b8eSAndroid Build Coastguard Worker echo "Poorly Configured project, missing ${filelist_file} in root of project" 81*ec779b8eSAndroid Build Coastguard Worker exit 1 82*ec779b8eSAndroid Build Coastguard Workerfi 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker# is 1st arg a prefix of 2nd arg 85*ec779b8eSAndroid Build Coastguard Workerbeginswith() { case $2 in "$1"*) true;; *) false;; esac; } 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Workerexclusions="" 88*ec779b8eSAndroid Build Coastguard Workerinclusions="" 89*ec779b8eSAndroid Build Coastguard Workerwhile read p1 p2 90*ec779b8eSAndroid Build Coastguard Workerdo 91*ec779b8eSAndroid Build Coastguard Worker # ignore comment lines in the file 92*ec779b8eSAndroid Build Coastguard Worker # ignore empty lines in the file 93*ec779b8eSAndroid Build Coastguard Worker if beginswith "#" "${p1}" ; then 94*ec779b8eSAndroid Build Coastguard Worker # ignore this line 95*ec779b8eSAndroid Build Coastguard Worker true 96*ec779b8eSAndroid Build Coastguard Worker elif [ -z "${p1}" ] ; then 97*ec779b8eSAndroid Build Coastguard Worker # ignore blanks 98*ec779b8eSAndroid Build Coastguard Worker true 99*ec779b8eSAndroid Build Coastguard Worker elif [ ${p1} = "EXCLUDE" ] ; then 100*ec779b8eSAndroid Build Coastguard Worker # add to the exclusion list 101*ec779b8eSAndroid Build Coastguard Worker if [ ! -z ${p2} ] ; then 102*ec779b8eSAndroid Build Coastguard Worker exlusions="${exclusions} ${p2}" 103*ec779b8eSAndroid Build Coastguard Worker fi 104*ec779b8eSAndroid Build Coastguard Worker elif [ ${p1} = "INCLUDE" ] ; then 105*ec779b8eSAndroid Build Coastguard Worker # add to the inclusion list 106*ec779b8eSAndroid Build Coastguard Worker if [ ! -z ${p2} ] ; then 107*ec779b8eSAndroid Build Coastguard Worker inclusions="${inclusions} ${p2}" 108*ec779b8eSAndroid Build Coastguard Worker fi 109*ec779b8eSAndroid Build Coastguard Worker elif [ ! -z ${p1} ] ; then 110*ec779b8eSAndroid Build Coastguard Worker inclusions="${inclusions} ${p1}" 111*ec779b8eSAndroid Build Coastguard Worker fi 112*ec779b8eSAndroid Build Coastguard Workerdone < ${REPO_ROOT}/${REPO_PATH}/${filelist_file} 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker# so we can play with array syntax 115*ec779b8eSAndroid Build Coastguard Worker#INCLUSIONS=( ${inclusions} ) 116*ec779b8eSAndroid Build Coastguard Worker#EXCLUSIONS=( ${exclusions} ) 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Workermainline_yes="" 119*ec779b8eSAndroid Build Coastguard Workermainline_no="" 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker# is it part of the list of mainline files/directories? 122*ec779b8eSAndroid Build Coastguard Workerfor path in ${PREUPLOAD_FILES} ; do 123*ec779b8eSAndroid Build Coastguard Worker #echo is ${path} a mainline file... 124*ec779b8eSAndroid Build Coastguard Worker for aprefix in ${inclusions} .. ; do 125*ec779b8eSAndroid Build Coastguard Worker #echo compare against ${aprefix} ... 126*ec779b8eSAndroid Build Coastguard Worker if [ "${aprefix}" = ".." ] ; then 127*ec779b8eSAndroid Build Coastguard Worker mainline_no="${mainline_no} ${path}" 128*ec779b8eSAndroid Build Coastguard Worker elif beginswith ${aprefix} ${path} ; then 129*ec779b8eSAndroid Build Coastguard Worker mainline_yes="${mainline_yes} ${path}" 130*ec779b8eSAndroid Build Coastguard Worker break # on to next uploaded file 131*ec779b8eSAndroid Build Coastguard Worker fi 132*ec779b8eSAndroid Build Coastguard Worker done 133*ec779b8eSAndroid Build Coastguard Workerdone 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker# TODO: audit the yes list to see if some should be moved to the no list 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker# 3 situations 138*ec779b8eSAndroid Build Coastguard Worker# -- everything is on mainline (mainline_yes non-empty, other empty) 139*ec779b8eSAndroid Build Coastguard Worker# -- some is mainline, some is not (files_* both non-empty) 140*ec779b8eSAndroid Build Coastguard Worker# -- none is mainline (mainline_yes empty, other non_empty 141*ec779b8eSAndroid Build Coastguard Worker# -- both empty only happens if PREUPLOAD_FILES is empty, covered above 142*ec779b8eSAndroid Build Coastguard Worker 143*ec779b8eSAndroid Build Coastguard Workerif [ -z "${mainline_yes}" ] ; then 144*ec779b8eSAndroid Build Coastguard Worker # no mainline files, everything else is non-mainline, let it go 145*ec779b8eSAndroid Build Coastguard Worker exit 0 146*ec779b8eSAndroid Build Coastguard Workerfi 147*ec779b8eSAndroid Build Coastguard Worker 148*ec779b8eSAndroid Build Coastguard Worker# 149*ec779b8eSAndroid Build Coastguard Worker# exit 0 is "all good, no output passed along to user" 150*ec779b8eSAndroid Build Coastguard Worker# exit 77 is "a warning, pass along the output to the user" 151*ec779b8eSAndroid Build Coastguard Worker# exit 1 will be a failure. 152*ec779b8eSAndroid Build Coastguard Worker# 153*ec779b8eSAndroid Build Coastguard Workerresult=0 154*ec779b8eSAndroid Build Coastguard Worker 155*ec779b8eSAndroid Build Coastguard Worker# simple reminder that it should also land in mainline branch 156*ec779b8eSAndroid Build Coastguard Worker# 157*ec779b8eSAndroid Build Coastguard Workerif [ "${current}" != "${MAINLINE_BRANCH}" ] ; then 158*ec779b8eSAndroid Build Coastguard Worker # simple reminder to ensure it hits mainline 159*ec779b8eSAndroid Build Coastguard Worker result=77 160*ec779b8eSAndroid Build Coastguard Worker cat - <<EOF 161*ec779b8eSAndroid Build Coastguard WorkerYou are uploading repo ${RED}${REPO_PATH}${NORMAL} to branch ${RED}${current}${NORMAL}. 162*ec779b8eSAndroid Build Coastguard WorkerThe mainline branch for ${RED}${REPO_PATH}${NORMAL} is branch ${RED}${MAINLINE_BRANCH}${NORMAL}. 163*ec779b8eSAndroid Build Coastguard Worker 164*ec779b8eSAndroid Build Coastguard WorkerEnsure an appropriate cherry pick or equivalent lands in branch ${RED}${MAINLINE_BRANCH}${NORMAL}. 165*ec779b8eSAndroid Build Coastguard WorkerSecurity bulletin timing or unreleased functionality may drive when this can be landed. 166*ec779b8eSAndroid Build Coastguard WorkerEOF 167*ec779b8eSAndroid Build Coastguard Workerfi 168*ec779b8eSAndroid Build Coastguard Worker 169*ec779b8eSAndroid Build Coastguard Worker# watch for the mixed some mainline / some not CL 170*ec779b8eSAndroid Build Coastguard Worker# we usually want to reject such mixed CLs 171*ec779b8eSAndroid Build Coastguard Worker# 172*ec779b8eSAndroid Build Coastguard Worker 173*ec779b8eSAndroid Build Coastguard Workerif [ ! -z "${mainline_no}" ] ; then 174*ec779b8eSAndroid Build Coastguard Worker # mixed bag, suggest (not insist) that developer split them. 175*ec779b8eSAndroid Build Coastguard Worker result=1 176*ec779b8eSAndroid Build Coastguard Worker cat - <<EOF 177*ec779b8eSAndroid Build Coastguard WorkerThis change contains both mainline and non-mainline files. Please separate 178*ec779b8eSAndroid Build Coastguard Workerthem into separate CLs. It may also be appropriate to update the list of mainline 179*ec779b8eSAndroid Build Coastguard Workerfiles in ${RED}${REPO_ROOT}/${filelist_file}${NORMAL}. 180*ec779b8eSAndroid Build Coastguard Worker 181*ec779b8eSAndroid Build Coastguard WorkerEOF 182*ec779b8eSAndroid Build Coastguard Worker echo "===== Mainline files =====" 183*ec779b8eSAndroid Build Coastguard Worker echo -e ${RED} 184*ec779b8eSAndroid Build Coastguard Worker echo ${mainline_yes} | sed -e 's/ / 185*ec779b8eSAndroid Build Coastguard Worker/g' 186*ec779b8eSAndroid Build Coastguard Worker echo -e ${NORMAL} 187*ec779b8eSAndroid Build Coastguard Worker 188*ec779b8eSAndroid Build Coastguard Worker echo "===== Non-Mainline files =====" 189*ec779b8eSAndroid Build Coastguard Worker echo -e ${RED} 190*ec779b8eSAndroid Build Coastguard Worker echo ${mainline_no} | sed -e 's/ / 191*ec779b8eSAndroid Build Coastguard Worker/g' 192*ec779b8eSAndroid Build Coastguard Worker echo -e ${NORMAL} 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker cat - <<EOF 195*ec779b8eSAndroid Build Coastguard Worker 196*ec779b8eSAndroid Build Coastguard WorkerIf you are sure you want to proceed uploading to branch ${RED}${current}${NORMAL}, 197*ec779b8eSAndroid Build Coastguard Workerre-run your repo upload command with the '--no-verify' option 198*ec779b8eSAndroid Build Coastguard Worker 199*ec779b8eSAndroid Build Coastguard WorkerEOF 200*ec779b8eSAndroid Build Coastguard Workerfi 201*ec779b8eSAndroid Build Coastguard Worker 202*ec779b8eSAndroid Build Coastguard Worker# result will be: 203*ec779b8eSAndroid Build Coastguard Worker# 0: all good, no output passed to user 204*ec779b8eSAndroid Build Coastguard Worker# 77: warnings (but we pass), output passed along to user 205*ec779b8eSAndroid Build Coastguard Worker# else: failure, output passed along to the user 206*ec779b8eSAndroid Build Coastguard Worker 207exit ${result} 208 209