xref: /aosp_15_r20/build/soong/scripts/package-check.sh (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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