#!/bin/sh
#
# Copyright (C) 2005 Lasse Collin <lasse.collin@slackware.fi>
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Last modified: Sat Apr 23 13:09:21 EEST 2005

# This script is not speed optimized like installpkg and upgradepkg are
# when handling compressed files. I will optimize this for the next release.

# Exit status:
# 0 - All OK
# 1 - File not found
# 2 - Unknown package format
# 99 - Invalid parameters, usage shown

# Load shared functions:
. /usr/share/pkgtools/shared_functions.sh

usage() {
  cat << EOF

Show information about a package file.

Usage: viewpkg [options] package_file [package_file_2 ...]

Options:
    -n, --name                  File and path name in one line.
    -N, --verbose-name          Filename and location in two lines.
    -s, --size                  Compressed and uncompressed size.
    -d, --description           Package description.
    -D, --verbose-description   Package description including basename prefix.
    -R, --raw-description       Show slack-desc file as is.
    -f, --filelist              List files and directories in the package.
    -F, --verbose-filelist      List with owner and permission information.
    -i, --installscript         Show installation script.
    -q, --quiet                 Supress headers and delimiters.
    -h, --help                  Show this help.

Output order is fixed: name, sizes, description, file list, installation script

If no options are given viewpkg defaults to -NsdFi.

EOF
  exit 0
}

# Parse options:
ARGS=$(getopt -n viewpkg -o nNdDRsfFiqh \
  -l name,verbose-name,description,verbose-description,raw-description \
  -l size,filelist,verbose-filelist,installscript,quiet,help -- "$@")
[ $? != 0 ] && exit 99
eval set -- "$ARGS"
unset ARGS NAME DESCRIPTION SIZES FILELIST SCRIPT QUIET
while : ; do
  case "$1" in
    -n|--name)                  NAME=normal ;;
    -N|--verbose-name)          NAME=verbose ;;
    -d|--description)           DESCRIPTION=normal ;;
    -D|--verbose-description)   DESCRIPTION=verbose ;;
    -R|--raw-description)       DESCRIPTION=raw ;;
    -s|--size)                  SIZES=yes ;;
    -f|--filelist)              FILELIST=normal ;;
    -F|--verbose-filelist)      FILELIST=verbose ;;
    -i|--installscript)         SCRIPT=yes ;;
    -q|--quiet)                 QUIET=yes ;;
    -h|--help)                  usage ;;
    --)                         shift 1; break ;;
    *)                          exit_getopt_error ;;
  esac
  shift 1
done
[ $# = 0 ] && usage
# If no options were given, show all information:
if [ "$NAME$DESCRIPTION$SIZES$FILELIST$SCRIPT$QUIET" = "" ]; then
  NAME=verbose
  DESCRIPTION=normal
  SIZES=yes
  FILELIST=verbose
  SCRIPT=yes
fi

EXITSTATUS=0

while [ $# != 0 ]; do
  # First check that we have been given something we can understand:
  if [ ! -f "$1" ]; then
    echo
    echo "File not found: $1"
    EXITSTATUS=1
  elif [ "$(package_type "$1")" = "" ]; then
    echo
    echo "Package type unknown: $1"
    EXITSTATUS=2
  else
    # File exists and has a known extension, let's show the requested information:
    # Package name:
    [ "$QUIET" = "" -a "$NAME$SIZES$DESCRIPTION" != "" ] && echo
    if [ "$NAME" = "normal" ]; then
      echo "$1"
    elif [ "$NAME" = "verbose" ]; then
      if [ "$QUIET" = "" ]; then
        echo "PACKAGE NAME:      $(basename "$1")"
        echo "PACKAGE LOCATION:  $(dirname "$1")"
      else
        echo "$(basename "$1")"
        echo "$(dirname "$1")"
      fi
    fi
    # Sizes:
    if [ "$SIZES" = "yes" ]; then
      # With gzipped packages we can cheat:
      if [ "$(package_type "$1")" = "tgz" ]; then
        UNCOMPRESSED=$(gzip -l "$1" | sed -n '2{s/^ *[0-9]* *\([0-9]*\) *.*$/\1/p}')
      else
        UNCOMPRESSED=$(uncompress_pkg "$1" | wc -c | tr -d ' ')
      fi
      UNCOMPRESSED=$(($UNCOMPRESSED / 1024))
      COMPRESSED=$(ls -sk "$1" | tr -s ' ' | cut -f 1 -d ' ')
      if [ "$QUIET" = "" ]; then
        printf "PACKAGE SIZE (compressed):   %7d K\n" "$COMPRESSED"
        printf "PACKAGE SIZE (uncompressed): %7d K\n" "$UNCOMPRESSED"
      else
        echo "$COMPRESSED"
        echo "$UNCOMPRESSED"
      fi
    fi
    # Description (slack-desc):
    [ "$DESCRIPTION" != "" -a "$QUIET" = "" ] && echo "PACKAGE DESCRIPTION:"
    if [ "$DESCRIPTION" = "normal" ]; then
      uncompress_pkg "$1" | $TAR xOf - install/slack-desc 2> /dev/null \
          | uniq | sed '/^[^: ]*:/!d;s/^[^: ]*: \{0,1\}//;${/^ *$/d}'
    elif [ "$DESCRIPTION" = "verbose" ]; then
      uncompress_pkg "$1" | $TAR xOf - install/slack-desc 2> /dev/null | sed '/^[^: ]*:/!d'
    elif [ "$DESCRIPTION" = "raw" ]; then
      uncompress_pkg "$1" | $TAR xOf - install/slack-desc 2> /dev/null
    fi
    # File list:
    [ "$FILELIST" != "" -a "$QUIET" = "" ] && echo -e '\nFILE LIST:'
    [ "$FILELIST" = "verbose" ] && uncompress_pkg "$1" | $TAR tvf - 2> /dev/null
    [ "$FILELIST" = "normal" ] && uncompress_pkg "$1" | $TAR tf - 2> /dev/null | sort
    # Installation script (doinst.sh):
    [ "$SCRIPT" != "" -a "$QUIET" = "" ] && echo -e '\nINSTALLATION SCRIPT:'
    [ "$SCRIPT" = "yes" ] && uncompress_pkg "$1" | $TAR xOf - install/doinst.sh 2> /dev/null
  fi
  shift 1
  [ $# != 0 -a "$QUIET" = "" ] && echo -e '\n---'
done

[ "$QUIET" = "" ] && echo

exit $EXITSTATUS
