#!/bin/sh

# usage: $0 DIRNAME PHASE
#   PHASE is 1 (checksum) or 2 (package)

dir=$1
phase=$2

if [ $phase = 1 ]; then

  cd $dir || exit 1
  echo "maintained by: $(make maintainer)"
  echo "build started at $(date)"

  cd /tmp/depends
  export PKG_PATH=/tmp/depends
  if [ "$(echo $(/bin/ls | wc -c))" != 0 ]; then
    echo "adding dependencies"
    for i in *.t[bg]z; do
      echo "pkg_add $i"
      base=$(basename $i .tgz)
      base=$(basename $base .tbz)
      if pkg_info -q -e $base; then
	echo "skipping $base, already added"
      else
	if ! pkg_add $i; then
	  echo "error in dependency $i, exiting"
	  echo "1" > /tmp/status
	  exit 1
	fi
      fi
    done
  fi

  mtree -xcn -k uid,gid,mode -p / > /tmp/mtree

  cd $dir || exit 1
  pkgname=$(make package-name)
  echo "================================================================"
  echo "====================<phase 1: make checksum>===================="

  if /pnohang $TIMEOUT /tmp/make.log1 ${pkgname} make checksum; then
    cat /tmp/make.log1
    echo "0" > /tmp/status
  else
    cat /tmp/make.log1
    echo "1" > /tmp/status
    echo "================================================================"
    echo -n "build ended at "
    date
  fi

else

  echo "====================<phase 2: make package>====================="
  xvfb=0
  if which -s Xvfb; then
    xvfb=1
    pid=$(echo $$ % 32768 | bc)
    X11BASE=$(which Xvfb | sed -e 's./bin/Xvfb..')
    Xvfb :${pid} -fp ${X11BASE}/lib/X11/fonts/misc &
    DISPLAY=:${pid}
    export DISPLAY
  fi

  cd $dir || exit 1
  pkgname=$(make package-name)
  if /pnohang $TIMEOUT /tmp/make.log2 ${pkgname} make package; then
    cat /tmp/make.log2
    echo "0" > /tmp/status
    prefix=$(make -V PREFIX)
    echo "================================================================"
    echo "checking installed files"
    find ${prefix} \( \( -perm -4000 -o -perm -2000 -a \! -type d \) -o \( -perm -0002 -o -perm -0020 \) \) -a \! -type l -ls | sort > /tmp/list1
    echo "pkg_delete ${pkgname}"
    pkg_delete ${pkgname}
    find ${prefix} \( \( -perm -4000 -o -perm -2000 -a \! -type d \) -o \( -perm -0002 -o -perm -0020 \) \) -a \! -type l -ls | sort > /tmp/list2
    if ! diff -qb /tmp/list1 /tmp/list2 2>/dev/null; then
      echo "================================================================"
      echo "found set[ug]id or world-writable files and directories"
      diff -b /tmp/list2 /tmp/list1 | grep '^>'
    fi

    mtree -x -f /tmp/mtree -p / | egrep -v '^(var/tmp|tmp/|var/db/pkg/)' > /tmp/list3

    cd /var/db/pkg
    if [ $(echo $(echo * | wc -c)) != 2 ]; then
      echo "================================================================"
      echo "deleting dependencies"
      prevlist=""
      count=1
      while [ $(echo $(echo * | wc -c)) != 2 -a $(echo $(echo * | wc -c)) != $(echo $(echo $prevlist | wc -c)) ]; do
	echo "== phase $count =="
	prevlist="$(echo *)"
	for i in *; do
	  echo "pkg_delete $i"
	  pkg_delete $i
	done
	count=$(($count + 1))
      done
#      if [ $(echo $(echo * | wc -c)) != 2 ]; then
#	echo "leftover packages:" *
#	for i in *; do
#	  echo "pkg_delete -f $i"
#	  pkg_delete -f $i
#	done
#      fi
    fi

    if [ -s /tmp/list3 ]; then
      echo "================================================================"
      echo "list of extra files and directories in /"
      cat /tmp/list3
#      echo "list of all files and directories in ${prefix}"
#      cd ${prefix}
#      find . -exec echo -n 'path: ' \; -exec ls -1d \{} \; | sort
#      echo "ls -alR ${prefix}"
#      ls -alR ${prefix}
      if [ "x${PLISTCHECK}" != "x" ]; then
        echo "1" > /tmp/status
      fi
    fi

  else
    cat /tmp/make.log2
    echo "1" > /tmp/status
  fi

  if [ ${xvfb} = 1 ]; then
    kill $(jobid %1)
  fi

  if [ -e ${dir}/.keep ]; then
    cd ${dir}
    objdir=$(make -V WRKDIR)
    tar cvfjC /tmp/work.tbz ${objdir}/.. work
  fi

  echo "================================================================"
  echo -n "build ended at "
  date

fi

exit 0
