#! /bin/sh
# Package Build - @2000 by Antonio Gallo
# agx@linux.it - www.badpenguin.org - www.linux.it/~agx
# 11 Sep 2000, This script is used to build a .bpp package
#              from his port directory
# Requirements: awk, cat, du, grep, df

##### =====================      tools    =========================  #####
. /usr/local/libexec/package-library

##### =====================   fn_package_check         =========================  #####

fn_package_check() {
  echoc CYAN "(*) check package's files"
  
  # Squeeze
  echo - "> squeezing $PKGROOT ..."
  find  $PKGROOT \( -name \*~ -or -name \*\# \) -exec rm -vf {} \;

  # Deprecated dirs
  if [ -e $PKGROOT/usr/doc ]; then
    if [ ! -L $PKGROOT/usr/doc ]; then
      echoc YELLOW "> moveing /usr/doc to /usr/share/doc"
      mkdir -p $PKGROOT/usr/share/
      mv -v $PKGROOT/usr/doc/ $PKGROOT/usr/share/doc/
    fi
  fi
  if [ -e $PKGROOT/usr/man ]; then
    if [ ! -L $PKGROOT/usr/man ]; then
      echoc YELLOW "> moveing /usr/man to /usr/share/man"
      mkdir -p $PKGROOT/usr/share/
      mv -v $PKGROOT/usr/man/ $PKGROOT/usr/share/man/
    fi
  fi
  if [ -e $PKGROOT/usr/info ]; then
    if [ ! -L $PKGROOT/usr/info ]; then
      echoc YELLOW "> moveing /usr/info to /usr/share/info"
      mkdir -p $PKGROOT/usr/share/    
      mv -v $PKGROOT/usr/info/ $PKGROOT/usr/share/info/
    fi
  fi
  
  # Check obsolete files  
  for i in PRE-DELETE DELETE POST-DELETE PRUNE CONFIGURE doinst.sh \
           PRE-INSTALL INSTALL POST-INSTALL X-POST-INSTALL PRE-REMOVE REMOVE \
           POST-REMOVE CLEANUP PURGE PRUNE 
  do
    if [ -f $PKGINST/$i ]; then
      echoc YELLOW "! file $PKGINST/$i is obsolete !"
      exit 1
    fi
  done

  # Check install scripts
  for i in PRE-INSTALL  INSTALL  POST-INSTALL X-POST-INSTALL \
	    PRE-REMOVE REMOVE POST-REMOVE CLEANUP
  do
    TEMPSCRIPT="$PKGSCRIPT/$i"
    if [ -f $TEMPSCRIPT ]; then
      echo $i
      chmod 700 $TEMPSCRIPT
      chown root.root $TEMPSCRIPT

      grep -q "^set -e" $TEMPSCRIPT
      if [ $? -ne 0 ]; then
        echoc YELLOW "! you are not using 'set -e' into this script."
        echo "  Press ENTER to continue"
        read x
      fi

      grep -q "^set -x" $TEMPSCRIPT
      if [ $? -eq 0 ]; then
        echoc YELLOW "! you are using 'set -x' into this script."
        echo "  Press ENTER to continue"
        read x
      fi
    fi
  done

  # Se c'e' incoming ci deve essere anche CLEANUP
  if [ -d $PKGROOT/incoming ]; then
    if [ ! -f $PKGSCRIPT/CLEANUP ]; then
      echoc YELLOW "! directoy 'incoming' is present, you should write a CLEANUP script !"
      echoc YELLOW "  Press ENTER to continue"
      read x
    fi
  fi

  # Icons
  #if [ -d $PKGROOT/usr/bin -o -d $PKGROOT/usr/local/bin ]; then
    #if [ ! -d $PKGROOT/usr/share/gnome/apps ]; then
     # echoc YELLOW "! There are programs but no icons under /usr/share/gnome/apps"
      #echoc YELLOW "  Press ENTER to continue"
      #read x
    #fi
  #fi

  # DOCDIR
  DOCDIR="$PKGROOT/usr/share/doc/"
  if [ -d $DOCDIR ]; then
    echoc GREEN "> changeing mode to docs ..."
    find $DOCDIR -type f -exec chmod 644 {} \;
    #rmdir $DOCDIR          2>/dev/null
  fi

  # INFO
  if [ -d "$PKGROOT/usr/share/info" ]; then
    #TODO echoc GREEN "- Adding texinfo to the deps"
    #TODO echo $DEPS_INFO >> $PKG_INSTALL/REQUEST
    echo "> compressing infoes ..."
    find "$PKGROOT/usr/share/info" -type f -exec gzip -9f {} 2>/dev/null \;
    echo "> changing mode to infoes ..."
    find "$PKGROOT/usr/share/info" -type f -exec chmod 644 {} \;
    # Scripts
    mkdir -m 700 -p $PKGSCRIPT
    touch $PKGSCRIPT/POST-INSTALL
    touch $PKGSCRIPT/PRE-REMOVE
    grep -q "install-info" $PKGSCRIPT/PRE-REMOVE
    if [ $? -ne 0 ]; then
      echoc YELLOW "! you are not handling info files in PRE-REMOVE."
      echo "  Press ENTER to continue"
      read x
    fi
    grep -q "install-info" $PKGSCRIPT/POST-INSTALL
    if [ $? -ne 0 ]; then
      echoc YELLOW "! you are not handling info files in POST-INSTALL."
      echo "  Press ENTER to continue"
      read x
    fi
  fi

  # MAN
  if [ -d "$PKGROOT/usr/share/man" ]; then
    #echoc GREEN "[MAN] Adding man to the deps"
    #echo $DEPS_MAN >> $PKG_INSTALL/REQUEST
    echo "> compressing manpages ..."
    find $PKGROOT/usr/share/man -type f -exec gzip -v9f {} 2>/dev/null \;
    echo "> changing mode to manpages ..."
    find $PKGROOT/usr/share/man -type f -exec chmod 644 {} \;
  fi

  # Stripping Binaries
  echoc GREEN -n "> stripping  binaries:"
  for i in  "bin"  "sbin"  "usr/bin"  "usr/X11R6/bin"  "usr/sbin"  "usr/local/bin"  "usr/local/sbin" \
		"opt/bin" "opt/sbin"
  do
    if [ -d $PKGROOT/$i ]; then
      echo -n " $i"
      find "$PKGROOT/$i"  -type f -exec strip --strip-unneeded {} 2>/dev/null \;
    fi
    if [ -d $PKGROOT/incoming/$i ]; then
      echo -n "incoming/$i"
      find "$PKGROOT/incoming/$i" -type f -exec strip --strip-unneeded {} 2>/dev/null \;
    fi
  done
  echo "  done."

  # Stripping Libraries
  echoc GREEN -n "> stripping libraries:"
  for i in  "lib"  "sbin"  "usr/lib"  "usr/X11R6/lib"  "usr/local/lib" "opt/lib" ; do
    if [ -d $PKGROOT/$i ]; then
      echo -n " $i"
      find "$PKGROOT/$i" -type f -iname "lib*so*"  -not -name "*.a" -exec strip --strip-unneeded {} \;
    fi
    if [ -d $PKGROOT/incoming/$i ]; then
      echo "incoming/$i"
      find "$PKGROOT/incoming/$i"  -type f  -iname "lib*so*"  -not -name "*.a" -exec strip --strip-unneeded {} \;
    fi
  done
  echo "  done."

  # Permissions
  echoc GREEN "> setting permissions:"
  install-permissions $PKGROOT
  if [ -d $PKGROOT/incoming ]; then
    install-permissions $PKGROOT/incoming
  fi
  echo "  done."
}


##### =====================   fn_package_build       =========================  #####

fn_package_build() {
  echoc CYAN "(*) building BPP packages"

  # Checking BPP structure
  echo "> checking package structure"
  if [ ! -d $PKGROOT ]; then
      echoc RED "! the package main directory was not found"
      exit 1
  fi
  # Check
  if [ ! -d $PKGINST ]; then
      echoc RED "! the package install directory was not found"
      exit 1
  fi
  # Checking files
  for f in  DESCRIPTION  INFO  ; do
    if [ ! -f $PKGINST/$f ]; then
	echoc RED "! required file $f not found under $PKGINST"
      exit 1
    fi
  done    

  # Checking INFO
  echo "> checking package infoes"
  if [ "$SONAME" = "" ]; then
    echoc RED "! SONAME is empty"
    exit 1
  fi
  if [ "$VERSION" = "" ]; then
    echoc RED "! VERSION is empty"
    exit 1
  fi

  echo "> cleaning up ..."
  ( cd $PKGROOT ; rm -f *.tar *.gz *.tgz *.bpp install/MANIFEST.* install/AUTOBUILD *.lsm $FULLVERSION )
  find  $PKGROOT \( -name \*~ -or -name \*\# \) -exec rm -vf {} \;

  echo "> preparing BUILDINFO"
  OSNAME="`uname -s`"
  OSVERSION="`uname -r`"
  DISTRIBUTION="$DISTRELEASE"
  BUILDHOST="`hostname`.`domainname`"
  BUILDTIME="`date`"
  BPPVERSION="$PKG_VERSION"

  echo -n "> preparing DISKUSAGES"
  DISKUSAGES=""
  >$PKGINST/.usagetemp
  for i in $PKGROOT/* ; do
    [ ! -d "$i" ] && continue
    BASEDIR="`basename $i`"
    case $BASEDIR in
      usr) continue;;
      install) continue;;
      incoming) continue;;
    esac
    ( cd $PKGROOT ; du -s -b $BASEDIR ) >>$PKGINST/.usagetemp
  done
  #( cd $PKGROOT ; du -s -b * ; echo ) | grep -v install | grep -v incoming | grep -v usr | grep -v "^$" >$PKGINST/.usagetemp
  if [ -d $PKGROOT/usr ]; then
    ( cd $PKGROOT ; du usr/* -s -b ; echo ) >>$PKGINST/.usagetemp
  fi
  DISKUSAGES=`cat $PKGINST/.usagetemp | while read A B ; do
                [ "$A" = "" ] && continue
                [ "$B" = "" ] && continue
                echo -n "$A:$B "
              done`
  rm -f $PKGINST/.usagetemp
  echo "  ($DISKUSAGES)"
  # check problems
  if [ "$DISKUSAGES" = "" ]; then
    echoc RED "! the package is empty !"
    echoc YELLOW "  maybe you used 'build' after 'announce'"
    echoc YELLOW "  use 'rebuild' to recover !"
    exit 1
  fi
  
  # Diskusage
  DISKUSAGE=`du $PKGROOT -s -b | cut -d / -f 1`
  echoc GREEN "- disk usage of this package is $DISKUSAGE bytes"

  # No more wars to be set then we can save the changes
  BUILDNUMBER=$(( BUILDNUMBER + 1 ))
  fn_write_info

  echo "> calculating MD5 Checksums ..."
  >$PKGINST/MD5MANIFEST
  ( cd $PKGROOT ; find . -type f -perm +111 | grep -v "^./install/" 1>$PKGINST/.md5temp ) 
  ( cat $PKGINST/.md5temp ; echo ) | while read f
  do
    [ "$f" = "" ] && continue
    ( cd $PKGROOT ; md5sum "$f" >>$PKGINST/MD5MANIFEST )
  done
  rm -f $PKGINST/.md5temp
  cat $PKGINST/MD5MANIFEST
  gzip -9f $PKGINST/MD5MANIFEST

  # Preparing new manifest
  echoc GREEN "> preparing new MANIFEST"
  ( 
    cd $PKGROOT
    > install/MANIFEST
    [ -d install  ] && find install | grep -v "^$" | grep -v "^install/\."  >> install/MANIFEST
    find | cut -b 3- | grep -v "^$" | grep -v "^install/" | sort  >> install/MANIFEST
    wc -l install/MANIFEST
  )

if [ 1 -eq 0 ]; then  
  # Preparing TAR archive
  echoc GREEN "> tarring ..."
  #( cd $PKGROOT ; tar  --sparse  --exclude install/.*  --verify  -p  -f $FULLVERSION  -c * )
  ( cd $PKGROOT ; tar  --exclude "install/.*"  --verify  -p -f $FULLVERSION -c * )
  if [ $? -ne 0 ] ; then 
    echo " * * *  T A R - E R R O R  * * *"
    exit 1
  fi

  # Compressing Package
  echo -n "> gzipping: "
  ( cd $PKGROOT ; gzip -v9 -S .bpp $FULLVERSION )
  if [ $? -ne 0 ] ; then
    echo " * * *  G Z I P - E R R O R  * * *"
    exit 1
  fi
fi

  echoc GREEN "> packaging ..."
  ( 
    cd $PKGROOT
    tar  --exclude "install/.*"  -p -O -c * | \
    gzip -v9 -c 1>"${FULLVERSION}.bpp"
  )
  if [ $? -ne 0 ] ; then 
    echo " * * *  T A R + G Z I P - E R R O R  * * *"
    exit 1
  fi

  
  FSIZEB=`filesize $PKGROOT/$FULLVERSION.bpp`
  FSIZEK="$(( FSIZEB / 1024 ))"
  echoc CYAN "- $FULLVERSION.bpp: $FSIZEK Kb"
  echoc GREEN "! package $FULLVERSION has been successfully builded." 
}

##### =====================   M  A  I  N   =========================  #####

# Banner
echo "======================================================================"
echoc CYAN  "Bad Penguin - Package Build 2.0.0"
echo "======================================================================"

# Constants
DIST_VERSION="/etc/badpenguin/release"
PACKAGE_CONF="/etc/badpenguin/bpp/package.conf"

# Check Parameters
if [ "$1" = "" ]; then
  echoc RED "package-build: need at least 1 argument !"
  exit 1
fi

# Define package subdirs
fn_read_settings
#PKGROOT="$PKG_PORTSDIR/$1"
PKGROOT="`findport $PKG_PORTSDIR $1`"
PKGINST="$PKGROOT/install"
PKGINFO="$PKGINST/INFO"
PKGPATCH="$PKGINST/patches"
PKGCOMPILE="$PKGINST/compile"
PKGSCRIPT="$PKGINST/scripts"
fn_read_info

# Checking
for i in $PKGROOT $PKGINST $PKGINFO ; do
  if [ ! -e $i ]; then
    echoc RED "! $i does not exists, unable to continue"
    exit 1
  fi
done


# Repack first !
if [ "$2" != "norepack" -a ! -f "$PKGCOMPILE/NOREPACK" ]; then
  if [ -f "$PKGINST/MANIFEST" ]; then
    echoc GREEN "> repacking ..."
    set -e
    package-repack "$1" "$PKGINST/MANIFEST" "nobuild"
    set +e
  else
    echoc YELLOW "! cannot repack because MANIFEST is missing"
  fi
fi

# Globals
fn_package_check
fn_package_build
if [ "$STATUS" != "CERTIFIED" ]; then
  exit 0
fi


# ANNOUNCING THE PACKAGE
echo "----------------------------------------------------------------------"
echoc CYAN "(*) announcing the package"

# Moving...
echo "> moving to package depots"
mkdir -p $PKG_PKGDEPOT
mv -v "${PKGROOT}/${FULLVERSION}.bpp"  "$PKG_PKGDEPOT/"

# Clean Up Root
cd $PKGROOT
for i in *; do
  if [ "$i" != "install" ]; then
    echo "> removing $i/"
    #rm -fR "$i"
  fi
done

# Make ports
echo "> porting ..."
tar  --exclude "install/.*"  --verify  -p -f $FULLVERSION -c install/*
if [ $? -ne 0 ] ; then 
  echo " * * *  T A R - E R R O R  * * *"
  exit 1
fi
gzip -v9 -S .port.tar.gz $FULLVERSION
if [ $? -ne 0 ] ; then
  echo " * * *  G Z I P - E R R O R  * * *"
  exit 1
fi
mv -v  ${FULLVERSION}.port.tar.gz  ..

# end of the story
echoc GREEN "! port done."
exit 0
