xref: /aosp_15_r20/frameworks/av/tools/mainline_hook_partial.sh (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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