aboutsummaryrefslogtreecommitdiff
path: root/scripts/package-check.sh
blob: 9f4a9da2160933233169edaefdc936e63a9d84bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/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'
failed=false
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."
      failed=true
    fi
  fi
done
if [[ "${failed}" == "true" ]]; then
  exit 1
fi
IFS=${old_ifs}