1*333d2b36SAndroid Build Coastguard Worker#!/bin/bash 2*333d2b36SAndroid Build Coastguard Worker# 3*333d2b36SAndroid Build Coastguard Worker# Copyright (C) 2019 The Android Open Source Project 4*333d2b36SAndroid Build Coastguard Worker# 5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*333d2b36SAndroid Build Coastguard Worker# 9*333d2b36SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*333d2b36SAndroid Build Coastguard Worker# 11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*333d2b36SAndroid Build Coastguard Worker# limitations under the License. 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerset -e 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerif [[ $# -le 1 ]]; then 20*333d2b36SAndroid Build Coastguard Worker cat <<EOF 21*333d2b36SAndroid Build Coastguard WorkerUsage: 22*333d2b36SAndroid Build Coastguard Worker package-check.sh <jar-file> <package-list> 23*333d2b36SAndroid Build Coastguard WorkerChecks that the class files in the <jar file> are in the <package-list> or 24*333d2b36SAndroid Build Coastguard Workersub-packages. 25*333d2b36SAndroid Build Coastguard WorkerEOF 26*333d2b36SAndroid Build Coastguard Worker exit 1 27*333d2b36SAndroid Build Coastguard Workerfi 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerjar_file=$1 30*333d2b36SAndroid Build Coastguard Workershift 31*333d2b36SAndroid Build Coastguard Workerif [[ ! -f ${jar_file} ]]; then 32*333d2b36SAndroid Build Coastguard Worker echo "jar file \"${jar_file}\" does not exist." 33*333d2b36SAndroid Build Coastguard Worker exit 1 34*333d2b36SAndroid Build Coastguard Workerfi 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerprefixes=() 37*333d2b36SAndroid Build Coastguard Workerwhile [[ $# -ge 1 ]]; do 38*333d2b36SAndroid Build Coastguard Worker package="$1" 39*333d2b36SAndroid Build Coastguard Worker if [[ "${package}" = */* ]]; then 40*333d2b36SAndroid Build Coastguard Worker echo "Invalid package \"${package}\". Use dot notation for packages." 41*333d2b36SAndroid Build Coastguard Worker exit 1 42*333d2b36SAndroid Build Coastguard Worker fi 43*333d2b36SAndroid Build Coastguard Worker # Transform to a slash-separated path and add a trailing slash to enforce 44*333d2b36SAndroid Build Coastguard Worker # package name boundary. 45*333d2b36SAndroid Build Coastguard Worker prefixes+=("${package//\.//}/") 46*333d2b36SAndroid Build Coastguard Worker shift 47*333d2b36SAndroid Build Coastguard Workerdone 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker# Get the file names from the jar file. 50*333d2b36SAndroid Build Coastguard Workerzip_contents=`zipinfo -1 $jar_file` 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker# Check all class file names against the expected prefixes. 53*333d2b36SAndroid Build Coastguard Workerold_ifs=${IFS} 54*333d2b36SAndroid Build Coastguard WorkerIFS=$'\n' 55*333d2b36SAndroid Build Coastguard Workerfailed=false 56*333d2b36SAndroid Build Coastguard Workerfor zip_entry in ${zip_contents}; do 57*333d2b36SAndroid Build Coastguard Worker # Check the suffix. 58*333d2b36SAndroid Build Coastguard Worker if [[ "${zip_entry}" = *.class ]]; then 59*333d2b36SAndroid Build Coastguard Worker # Match against prefixes. 60*333d2b36SAndroid Build Coastguard Worker found=false 61*333d2b36SAndroid Build Coastguard Worker for prefix in ${prefixes[@]}; do 62*333d2b36SAndroid Build Coastguard Worker if [[ "${zip_entry}" = "${prefix}"* ]]; then 63*333d2b36SAndroid Build Coastguard Worker found=true 64*333d2b36SAndroid Build Coastguard Worker break 65*333d2b36SAndroid Build Coastguard Worker fi 66*333d2b36SAndroid Build Coastguard Worker done 67*333d2b36SAndroid Build Coastguard Worker if [[ "${found}" == "false" ]]; then 68*333d2b36SAndroid Build Coastguard Worker echo "Class file ${zip_entry} is outside specified packages." 69*333d2b36SAndroid Build Coastguard Worker failed=true 70*333d2b36SAndroid Build Coastguard Worker fi 71*333d2b36SAndroid Build Coastguard Worker fi 72*333d2b36SAndroid Build Coastguard Workerdone 73*333d2b36SAndroid Build Coastguard Workerif [[ "${failed}" == "true" ]]; then 74*333d2b36SAndroid Build Coastguard Worker exit 1 75*333d2b36SAndroid Build Coastguard Workerfi 76*333d2b36SAndroid Build Coastguard WorkerIFS=${old_ifs} 77