#!/bin/bash
#
# Copyright (C) 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
if [[ $# -le 1 ]]; then
cat <<EOF
Usage:
package-check.sh <jar-file> <package-list>
Checks that the class files in the <jar file> are in the <package-list> or
sub-packages.
EOF
exit 1
fi
jar_file=$1
shift
if [[ ! -f ${jar_file} ]]; then
echo "jar file \"${jar_file}\" does not exist."
exit 1
fi
prefixes=()
while [[ $# -ge 1 ]]; do
package="$1"
if [[ "${package}" = */* ]]; then
echo "Invalid package \"${package}\". Use dot notation for packages."
exit 1
fi
# Transform to a slash-separated path and add a trailing slash to enforce
# package name boundary.
prefixes+=("${package//\./\/}/")
shift
done
# Get the file names from the jar file.
zip_contents=`zipinfo -1 $jar_file`
# Check all class file names against the expected prefixes.
old_ifs=${IFS}
IFS=$'\n'
for zip_entry in ${zip_contents}; do
# Check the suffix.
if [[ "${zip_entry}" = *.class ]]; then
# Match against prefixes.
found=false
for prefix in ${prefixes[@]}; do
if [[ "${zip_entry}" = "${prefix}"* ]]; then
found=true
break
fi
done
if [[ "${found}" == "false" ]]; then
echo "Class file ${zip_entry} is outside specified packages."
exit 1
fi
fi
done
IFS=${old_ifs}