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