#!/bin/bash
#
# Copyright (C) 2007 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.
#

PROGNAME=`basename $0`

function fail ()
{
    if [ ! -z "$@" ]
    then
        echo "$PROGNAME: ERROR: $@" >&2
    fi
    echo "$PROGNAME: ERROR: failed." >&2
    exit 1
}

function usage ()
{
    cat << HERE
usage: $PROGNAME <.jar/.apk-file-list>
    Dumps a summary of the compressed and uncompressed sizes of various
    types of files in each package.  Emits one line per package.
    Packages must be zipfiles, readable using "unzip".

    Example output line:

        filesize=642684 all=603288/919304 dex=119529/353815 name="out/App.apk"

    filesize: the size of the package on disk
    name: the name of the package as passed to $PROGNAME

    These fields are presented as <uncompressed bytes>/<compressed bytes>:

        all: the sum of all entries in the package
        dex: the sum of all "*.dex" entries in the package
HERE
    exit 1
}

if [ $# -lt 1 ]
then
    usage
fi

UNAME=`uname`
if [ "x$UNAME" = "xDarwin" ]
then
    statArgs="-f %z"
elif [ "x$UNAME" = "xLinux" ]
then
    statArgs="-c %s"
else
    fail "Unknown uname $UNAME"
fi

function printFileSize ()
{
    stat $statArgs $1
}

for file
do
    if [ ! -f "$file" ]
    then
        fail "$file doesn't exist or isn't a file"
    fi
    unzip -lvq "$file" | awk '
        BEGIN {
          total_compressed = 0;
          total_uncompressed = 0;
          dex_compressed = 0;
          dex_uncompressed = 0;
        }

        # Make sure the output of unzip -lv looks like something we expect.
        #
        NR == "1" {
            if (NF != "8" ||
                $1 != "Length" ||
                $2 != "Method" ||
                $3 != "Size" ||
                ($4 != "Ratio" && $4 != "Cmpr") ||
                $5 != "Date" ||
                $6 != "Time" ||
                $7 != "CRC-32" ||
                $8 != "Name")
            {
                print "'$PROGNAME': ERROR: Unexpected zip listing format" > \
                        "/dev/stderr";
                print "'$PROGNAME': ERROR: Line 2 is \"" $0 "\"" > \
                        "/dev/stderr";
                failed = 1;
                exit 1;
            } else {
                saw_listing = 1;
            }
        }

        # Only look for lines where the ratio is the fourth column;
        # this filters out the header and footer.
        #
        $4 ~ /%$/ {
            uncompressed = $1;
            compressed = $3;
            if ($0 ~ /.dex$/) {
                dex_compressed += compressed;
                dex_uncompressed += uncompressed;
            }
            total_compressed += compressed;
            total_uncompressed += uncompressed;
        }
        { next }

        END {
            if (!failed && saw_listing) {
                print "filesize='$(printFileSize "$file")'",
                      "all=" total_compressed "/" total_uncompressed,
                      "dex=" dex_compressed "/" dex_uncompressed,
                      "name=\"'"$file"'\"";
            } else {
                exit 1;
            }
        }
    '
    if [ $? -ne 0 ]
    then
        fail "Could not get stats for $file"
    fi
done
