#! /bin/sh
# Package Create  -  @2000 by Antonio Gallo
# agx@linux.it - www.badpenguin.org - www.linux.it/~agx
# 20 May 2000, This script is used to help a mantainer to create
#              a package to be used on Bad Penguin.
# Requirements: awk, cat, du, grep
# Mon Jul 17 20:58:43 2000, can build packages without source
# Mon Aug 21 23:07:05 2000, contribution from Biagio Lucini


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



fn_package_banner() {
  # Announce
  [ $SHOW_BANNER -eq 1 ] && return
  echo "----------------------------------------------------------------------"
  echoc CYAN	"Bad Penguin - Package Create 2.0.0"
  echo "----------------------------------------------------------------------"
  SHOW_BANNER=1
}



fn_package_help() {
  fn_package_banner
  echo
  echo -n "Usage: "
  echoc GREEN "package-create <package-temp-dir> [options]"
  echo
  echo "If you specify any options you can resume the building"
  echo "of the package to a specific steps. Do not specify any"
  echo "options normally."
  echo
  echo "Options (into execution order):"
  echo "- info,          set package's basic informations"
  echo "- sourceinfo,    set package's source informations"
  echo "- sourcerequest, install packages required to build the source"
  echo "- fetch,         download the tarballs and patches"
  echo "- checksum,      check for checksum of downloaded files"
  echo "- extract,       extract the source to a tempirary directory"
  echo "- patch,         apply patches to the extracted source"
  echo "- configure,     configure the source before to build"
  echo "- build,         compile the source"
  echo "- install,       install the compiled source"
  echo "- scan,          scan the filesystem to find modified files"
  echo "- pack,          copy scanned files from the filesystem"
  echo "- check,         check files inside the package"
  echo "- request,       build the dependencies"
  echo "- package,       build the package"
  echo "- announce,      announce, after hard testing, a package"
  echo
  exit 1
}



fn_read_info() {
  echo -n "- Reading: "
  # read release file
  if [ ! -f $DIST_VERSION ]; then
    echo
    echoc RED "! Global file $DIST_VERSION not found"
    exit 1
  fi
  echo -n "release, "
  . "$DIST_VERSION"
  set +e
  DISTRELEASE="$NAME $VERSION"
  # Clean up version because it conflicts with the package version
  VERSION=""
  
  # read main BPP option file
  if [ ! -f $PACKAGE_CONF ]; then
    echo
    echoc RED "! Global file $PACKAGE_CONF not found"
    exit 1
  fi
  echo -n "package.conf, "
  . "$PACKAGE_CONF"
  set +e

  # read package'sINFO
  if [ -f "$PKGINFO" ]; then
    echo -n "package informations... "
    # Default
    COPYRIGHT="GPL"
    DISKNAME="1"
    DISKUSAGE=0
    STATUS="UNSTABLE"
    OSNAME="`uname -s`"
    OSVERSION="`uname -r`"
    ARCH="i386"
    OPTIM="`uname -m`"
    DISTRIBUTION="$DISTRELEASE"
    BUILDHOST="`hostname`.`domainname`"
    BUILDTIME="`date`"
    BUILDNUMBER=0
    BPPVERSION="$PKG_VERSION"
    # Read
    . "$PKGINFO"
    set +e    
    FULLVERSION="${SONAME}_${VERSION}"
    echo "done."
  else
    echo
    echoc YELLOW "- No Package Informations are available"
  fi
}



fn_write_info() {
  # FULLVERSION
  echoc GREEN "- Updating package infoes"

  > "$PKGINFO"

  echo "# Global"			>>"$PKGINFO"
  echo "SONAME=$SONAME"			>>"$PKGINFO"
  echo "VERSION=\"$VERSION\""		>>"$PKGINFO"
  echo "CATEGORY=$CATEGORY"		>>"$PKGINFO"
  echo "ARCH=$ARCH"			>>"$PKGINFO"
  echo "OPTIM=$OPTIM"			>>"$PKGINFO"

  echo "# Credits"			>>"$PKGINFO"
  echo "SUMMARY=\"$SUMMARY\""		>>"$PKGINFO"
  echo "AUTHOR=\"$AUTHOR\""		>>"$PKGINFO"
  echo "COPYRIGHT=\"$COPYRIGHT\""	>>"$PKGINFO"
  echo "MANTAINER=\"$MANTAINER\""	>>"$PKGINFO"
  echo "HOMEPAGE=$HOMEPAGE"		>>"$PKGINFO"

  echo "# Distrib"			>>"$PKGINFO"
  echo "DISKNAME=$DISKNAME"		>>"$PKGINFO"
  echo "DISKUSAGE=$DISKUSAGE"		>>"$PKGINFO"
  echo "STATUS=$STATUS"			>>"$PKGINFO"

  echo "# Build Info"			>>"$PKGINFO"
  echo "OSNAME=$OSNAME"			>>"$PKGINFO"
  echo "OSVERSION=\"$VERSION\""		>>"$PKGINFO"  
  echo "DISTRIBUTION=\"$DISTRIBUTION\""	>>"$PKGINFO"
  echo "BUILDHOST=$BUILDHOST"		>>"$PKGINFO"
  echo "BUILDTIME=\"$BUILDTIME\""	>>"$PKGINFO"
  echo "BUILDNUMBER=$BUILDNUMBER"	>>"$PKGINFO"
  echo "BPPVERSION=\"$BPPVERSION\""	>>"$PKGINFO"

  echo "# Checks"			>>"$PKGINFO"
  echo "CONFLICTS=\"$CONFLICTS\""	>>"$PKGINFO"
  echo "DISKUSAGES=\"$DISKUSAGES\""	>>"$PKGINFO"
  echo "REQUEST=\"$REQUEST\""		>>"$PKGINFO"

  echo "# Build Info"			>>"$PKGINFO"
  echo "SOURCEFILES=\"$SOURCEFILES\""	>>"$PKGINFO"
  echo "SOURCEMIRRORS=\"$SOURCEMIRRORS\"" >>"$PKGINFO"
  echo "SOURCEDIR=$SOURCEDIR"		>>"$PKGINFO"
  echo "PATCHFILES=\"$PATCHFILES\""	>>"$PKGINFO"
  echo "PATCHMIRRORS=\"$PATCHMIRRORS\""	>>"$PKGINFO"
  echo "SOURCEREQUEST=\"$SOURCEREQUEST\"" >>"$PKGINFO"
}



fn_package_info() {
  fn_package_banner
  echoc CYAN "(1) Package info"
  fn_read_info
  
  # Directories
  if [ ! -d "$PKGROOT" ]; then
    echoc YELLOW "- Creating directory $PKGROOT"
    mkdir -p -m 750 "$PKGROOT"
  fi
  if [ ! -d "$PKGROOT" ]; then
    echoc RED "! Cannot create $PKGROOT"
    exit 1
  fi
  if [ ! -d "$PKGINST" ]; then
    echoc YELLOW "- Creating directory $PKGINST"
    mkdir -p -m 750 "$PKGINST"
  fi
  if [ ! -d "$PKGINST" ]; then
    echoc RED "! Cannot create $PKGINST"
    exit 1
  fi

  # SONAME
  echo "> Please, enter the package SONAME without any version number"
  echo -n "  ($SONAME): "
  read XSONAME
  [ "$XSONAME" != "" ] && SONAME="$XSONAME"
  if [ "$SONAME" = "" ]; then
    echoc RED "! Nothing specified ($SONAME), giving up."
    exit 1
  fi

  # VERSION
  echo "> Please, enter the complete package's VERSION number: "
  echo -n "  ($VERSION): "
  read XVERSION
  [ "$XVERSION" != "" ] && VERSION="$XVERSION"
  if [ "$VERSION" = "" ]; then
    echoc RED "! Nothing specified, giving up."
    exit 1
  fi

  # CONFLICTS
  echo "> Press, enter the complete CONFLICTS line:"
  if [ "$CONFLICTS" = "" ]; then
    echo -n "  Suggested value: "
    echo -n $SONAME
    echo -n '_'
    echo "`echo $VERSION | cut -f 1 -d'.'`"
  fi
  echo -n "  ($CONFLICTS): "
  read XCONFLICTS
  [ "$XCONFLICTS" != "" ] && CONFLICTS="$XCONFLICTS"

  # CATEGORY
  echo "> Please, enter the package CATEGORY from this list"
  #<lucini>
  echo -n "  : "
  for CATEGORYITEM in $PKG_CATEGORIES
  do
    echo -n "$CATEGORYITEM "
  done
  echo
  #</lucini>
  echo -n "  ($CATEGORY): "  
  read XCATEGORY
  [ "$XCATEGORY" != "" ] && CATEGORY="$XCATEGORY"
  if [ "$CATEGORY" = "" ]; then
    echoc RED "! Nothing specified, giving up."
    exit 1
  fi
  #<lucini>
  CHECKVAR=0
  for CATEGORYCHECK in $PKG_CATEGORIES; do
   if [ "$CATEGORY" = "$CATEGORYCHECK" ]; then
    CHECKVAR=1
   fi
  done
  if [ $CHECKVAR -eq 0 ]; then
    echoc RED "! Invalid category, giving up."
    exit 1
  fi
  #</lucini>

  # SUMMARY
  echo "> Please, enter a brief summary at least 50 chars: "
  echo -n "  ($SUMMARY): "
  read XSUMMARY
  [ "$XSUMMARY" != "" ] && SUMMARY="$XSUMMARY"

  # COPYRIGHT
  echo "> Please, enter the License of this software (es. GPL): "
  echo -n "  ($COPYRIGHT): "  
  read XCOPYRIGHT
  [ "$XCOPYRIGHT" != "" ] && COPYRIGHT="$XCOPYRIGHT"
  
  # AUTHOR
  echo "> Please, enter the AUTHOR of this software: "
  echo -n "  ($AUTHOR): "  
  read XAUTHOR
  [ "$XAUTHOR" != "" ] && AUTHOR="$XAUTHOR"  
  
  # HOMEPAGE
  echo "> Please, enter the HOMEPAGE of this software: "
  echo -n "  ($HOMEPAGE): "  
  read XHOMEPAGE
  [ "$XHOMEPAGE" != "" ] && HOMEPAGE="$XHOMEPAGE"
  
  # ARCH
  echo "> Please, enter the ARCHitecture of this package, use 'i386' or 'ANY' : "
  echo -n "  ($ARCH): "  
  read XARCH
  [ "$XARCH" != "" ] && ARCH="$XARCH"
  
  # OPTIM
  echo "> Please, enter the OPTIMized arch. of this package, use 'i386' or 'ANY' : "
  echo -n "  ($OPTIM): "
  read XOPTIM
  [ "$XOPTIM" != "" ] && OPTIM="$XOPTIM"  

  # MANTAINER
  echo "> Please, enter the MANTAINER of this package: "
  echo -n "  ($MANTAINER): "  
  read XMANTAINER
  [ "$XMANTAINER" != "" ] && MANTAINER="$XMANTAINER"
  
  # Save changes
  fn_write_info
  
  # read DESCRIPTION
  echo  "! DESCRIPTION"
  echo  -n "  Press ENTER to edit the file with a full description of this package"
  read x
  touch "$PKGINST/DESCRIPTION"
  edit "$PKGINST/DESCRIPTION"
  echo "- DESCRIPTION done."

  # Next Step
  echo "2" >"$PKGSTEP"
  PKGLEVEL=2
}



fn_package_sourceinfo() {
  fn_package_banner
  echoc CYAN "(2) source package's info"
  fn_read_info

  # SOURCEFILES
  echo "> Please, enter the list of tarball to download, some sources available:"
  color PURPLE
  ( cd ${PKG_SRCDEPOT} ; ls *.gz *.bz2 2>/dev/null )
  color WHITE
  echo -n "  ($SOURCEFILES): "  
  read XSOURCEFILES
  [ "$XSOURCEFILES" != "" ] && SOURCEFILES="$XSOURCEFILES"
  #<lucini>
  if [ "$SOURCEFILES" != "" ]; then
    if [ ! -f "$PKG_SRCDEPOT/$SOURCEFILES" ]; then
      echoc YELLOW "- The source file $SOURCEFILES is not in ${PKG_SRCDEPOT}"
      exit 1
    fi
  fi
  #</lucini>

  # SOURCEMIRRORS
  if [ $SOURCEFILES != "" ]; then
    echo "> Please, enter the list of mirrors for the source"
    #<lucini>
    echo "> or enter one of the following pre-defined list"
    echo -n "  : "
    color PURPLE ; ls $SOURCE_DEPOTS 2>/dev/null ; color WHITE
    echo
    #</lucini>
    echo -n "  ($SOURCEMIRRORS): "  
    read XSOURCEMIRRORS
    [ "$XSOURCEMIRRORS" != "" ] && SOURCEMIRRORS="$XSOURCEMIRRORS"
    #<lucini>
    if [ "$SOURCEMIRRORS" = ""  ]; then
      echoc RED "! No mirrors has been specified, giving up"
      exit 1
    fi
  fi
  #</lucini>

  # PATCHFILES
  echo "> Please, enter the list of patches to download"
  echo -n "  ($PATCHFILES): "  
  read XPATCHFILES
  [ "$XPATCHFILES" != "" ] && PATCHFILES="$XPATCHFILES"

  # PATCHMIRRORS
  #<lucini>
  if [ "$PATCHFILES" != "" ]; then
  #</lucini>
    echo "> Please, enter the list of mirrors for the patches"
    #<lucini>
    echo "> or enter one of the following pre-defined list"
    echo -n "  : "
    color PURPLE ; ls $SOURCE_DEPOTS 2>/dev/null ; color WHITE
    echo
    #</lucini>    
    echo -n "  ($PATCHMIRRORS): "  
    read XPATCHMIRRORS
    [ "$XPATCHMIRRORS" != "" ] && PATCHMIRRORS="$XPATCHMIRRORS"
    #<lucini>
    if [ "$PATCHMIRRORS" = ""  ]; then
      echoc RED "! No mirrors has been specified, giving up"
      exit 1
    fi
    #</lucini>    
  fi
  
  # SOURCEREQUEST
  echo "> Please, enter the list of packages needed to build this source"
  echo -n "  ($SOURCEREQUEST): "  
  read XSOURCEREQUEST
  [ "$XSOURCEREQUEST" != "" ] && SOURCEREQUEST="$XSOURCEREQUEST"

  #
  fn_write_info
    
  # Next Level
  echo "3" >"$PKGSTEP"
  PKGLEVEL=3
}



fn_package_sourcerequest() {
  fn_package_banner
  echoc CYAN "(3) source package's request"
  fn_read_info
  
  # Check
  if [ "$SOURCEREQUEST" = "" ]; then
    echoc GREEN "- no packages are requested to build this source"
    return
  fi
  
  # TODO
  echoc YELLOW "! Until package-setup will be completed we cannot install those requested"
  echoc YELLOW "  packages: $SOURCEREQUEST"
  
  # Next Level
  echo "4" >"$PKGSTEP"
  PKGLEVEL=4
}



fn_fetch_file() {
  TARBALL="$1"
  for j in $SOURCEMIRRORS
  do
    REMOTEFILE="$SOURCEMIRRORS/$TARBALL"
    echo "- Attempt to download $REMOTEFILE"
    ( cd $PKG_SRCDEPOT ; ncftp $REMOTEFILE )
    REPLY=$?
    if [ $REPLY -eq 0 ]; then
      echoc GREEN "- Tarball $REMOTEFILE has been downloaded."
      break
    else
      echoc YELLOW "- Tarball $REMOTEFILE has not been downloaded ($REPLY)."
    fi
  done
  # Check if tarball is really there
  if [ ! -f "$PKG_SRCDEPOT/$TARBALL" ]; then
    echoc RED "Tarball $TARBALL was not found on the internet"
    exit 1
  fi
}



fn_package_fetch() {
  fn_package_banner
  echoc CYAN "(4) fetch packages and patches"
  fn_read_info

  # Check if there is some source to fetch
  if [ "$SOURCEFILES" = "" ]; then
    echoc GREEN "- no tarballs need to be downloaded"
  else
    for i in $SOURCEFILES ; do
      if [ -f "$PKG_SRCDEPOT/$i" ]; then
        echoc GREEN "- tarball $i is already there"
      else
        echoc YELLOW "- tarball $i was not found locally"
        fn_fetch_file $i
      fi
    done
  fi
  
  # Patches
  if [ "$PATCHFILES" = "" ]; then
    echoc GREEN "- no patches need to be downloaded"
    for i in $PATCHFILES ; do
      if [ -f $PKG_SRCDEPOT/$i ]; then
        echoc GREEN "- patch $i is already there"
      else
        echoc YELLOW "- patch $i was not found locally"
        fn_fetch_file $i      
      fi
    done
  fi

  # Next Level
  echo "5" >"$PKGSTEP"
  PKGLEVEL=5
}



fn_package_checksum() {
  fn_package_banner
  echoc CYAN "(5) package's checksums"
  fn_read_info

  # Check if there is something to be checked
  TEMPFILE="$PKGCOMPILE/CHECKSUMS"
  if [ ! -f $TEMPFILE ]; then
    # Anything to check ?
    if [ "$SOURCEFILES$PATCHFILES" = "" ]; then
      echoc GREEN "- there is no sources to be checked"
      return
    fi
    # Creating
    echoc YELLOW "? The file with the MD5 keys of the tarballs have"
    echoc YELLOW -n "   not been created, press ENTER to do it now."
    read x
    mkdir -p -m 700 $PKGCOMPILE
    > "$TEMPFILE"
    for i in $SOURCEFILES $PATCHFILES
    do
      # Paranoia: check file exists again
      if [ ! -f "$PKG_SRCDEPOT/$i" ]; then
        echoc RED "! File $i no more exist under $PKG_SRCDEPOT"
	exit 1
      fi
      # Add MD5 key
      echo "- checksumming $i"
      ( cd $PKG_SRCDEPOT ; md5sum "$i" >> "$TEMPFILE" )
    done
    echoc GREEN "- md5 keys has been successfully created."
    return
  fi

  echo "- checking MD5 checksums"
  color PURPLE
  ( cd $PKG_SRCDEPOT && md5sum --check $TEMPFILE )
  if [ $? -ne 0 ]; then
    echoc RED "! Some files has an invalid checksum"
    exit 1
  fi
  color WHITE  
  
  # Next Level
  echo "6" >"$PKGSTEP"
  PKGLEVEL=6
}



fn_package_extract() {
  fn_package_banner
  echoc CYAN "(6) extract sources"
  fn_read_info

  # Exploding the tarball
  echoc YELLOW -n "? Press ENTER to explode the sources into $PKG_WORKDIR"
  read x
  mkdir -p $PKG_WORKDIR
  for i in $SOURCEFILES
  do
    echo "- untarring $i ..."
    ( cd $PKG_WORKDIR && untar $PKG_SRCDEPOT/$i )
    if [ $? -ne 0 ]; then
      echoc RED "! Tarball $i has not been successfully untarred"
      exit 1
    fi
  done

  # Next Level
  echo "7" >"$PKGSTEP"
  PKGLEVEL=7
}



fn_package_patch() {
  fn_package_banner
  echoc CYAN "(7) apply patches"
  fn_read_info

  # External patch
  if [ "$PATCHFILES" != "" ]; then
    for i in $PATCHFILES ; do
      echoc YELLOW -n "? press ENTER to apply the patch $i"
      read x
      ( cd $PKG_WORKDIR && patch $PKG_SRCDEPOT/$i )
      if [ $? -ne 0 ]; then
        echoc RED "! Patch $i has not been successfully applied"
        exit 1
      fi
    done
  fi

  # Internal patch
  if [ -d "$PKGPATCH" ]; then
    for i in $PKGPATCH/* ; do
      echoc YELLOW -n "? press ENTER to apply the patch $i"
      read x
      ( cd $PKG_WORKDIR && patch $i )
      if [ $? -ne 0 ]; then
        echoc RED "! Patch $i has not been successfully applied"
        exit 1
      fi
    done
  fi

  # Next Level
  echo "8" >"$PKGSTEP"
  PKGLEVEL=8
}



fn_run_script() {
  [ ! -f $1 ] && return 1
  [ ! -x $1 ] && chmod 700 $1
  echoc GREEN "> Running script $1"
  OLDPWD="$PWD"
  if [ "$2" != "" ] ; then
    cd $2
  fi
  . "$1"
  REPLY=$?
  set +e  
  cd $OLDPWD
  if [ $REPLY -ne 0 ]; then
    if [ $REPLY -eq 2 ]; then
      echoc YELLOW "! If it is a Makefile error you can skip it with ENTER"
      echoc YELLOW "  otherwise press CTRL + C to QUIT and try again"
      read x
    else
      echoc RED "! $1 has returned error nr. $REPLY"
      exit 1
    fi
  fi
  return 0
}



fn_package_configure() {
  fn_package_banner
  echoc CYAN "(8) configuring source"
  fn_read_info

  # Check if package use sources
  if [ "$SOURCEFILES" = "" ]; then
    echoc YELLOW "> Package does not uses any source"
    return 1
  fi

  # SOURCEDIR
  echo "> Please, enter the package SOURCEDIR without any path"
  echo -n "  ($SOURCEDIR): "
  read XSOURCEDIR
  [ "$XSOURCEDIR" != "" ] && SOURCEDIR="$XSOURCEDIR"
  if [ "$SOURCEDIR" = "" ]; then
    echoc RED "! Nothing specified ($SOURCEDIR), giving up."
    exit 1
  fi

  # Check if SOURCEDIR really exists
  if [ ! -d $PKG_WORKDIR/$SOURCEDIR ]; then
    echoc RED "! Directory $SOURCEDIR does not exist under $PKG_WORKDIR"
    exit 1
  fi

  # Save changes to SOURCEDIR
  fn_write_info

  # Make dir compile
  mkdir -m 700 -p $PKGCOMPILE

  # PRE-CONFIG
  TEMPFILE="$PKGCOMPILE/PRE-CONFIG"
  echo "> PRE-CONFIG (make distclean), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run PRE-CONFIG
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # Ask for docs
  if [ -x "$PKG_WORKDIR/$SOURCEDIR/configure" ]; then
    echo "? Did you read README, INSTALL and the output from ./configure --help"
    echo -n "Type YES to continue without reading it: "
    read IAGREE
    if [ "$IAGREE" != "YES" ]; then
      for i in $PKG_WORKDIR/$SOURCEDIR/*
	do
        case "`basename $i`" in
	    [a-z]*) continue ;;
          COPYING*) continue ;;
          Makefile*) continue ;;
        esac
        clear
        echoc CYAN $i
        more $i
        echoc GREEN "- Press ENTER to display the next file"
        read x
      done
      clear
      echoc CYAN "Configure help"
      $PKG_WORKDIR/$SOURCEDIR/configure --help | more
      clear
    fi
  fi

  # CONFIGURE
  TEMPFILE="$PKGCOMPILE/CONFIGURE"
  # Ask for common
  CONFIGURE="CFLAGS='-O6 -mcpu=pentium -malign-loops=2 -malign-jumps=2 -malign-functions=2 -D_REENTRANT' LDFLAGS='-s' ./configure --prefix=/usr --cache-file=/dev/null"
  echo "? Do you want to use the standard configure command"
  echo "  ( $CONFIGURE )"    
  echo -n "Type YES to accept: "
  read DCHECK
  if [ "$DCHECK" = "YES" ]; then
    echo "$CONFIGURE" > $TEMPFILE
  fi

  # Do the job
  echo "> CONFIGURE (./configure --prefix=/usr), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run CONFIGURE
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # POST-CONFIG
  TEMPFILE="$PKGCOMPILE/POST-CONFIG"
  echo "> POST-CONFIG (make clean), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run POST-CONFIG
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # Next Level
  echo "9" >"$PKGSTEP"
  PKGLEVEL=9
}



fn_package_build() {
  fn_package_banner
  echoc CYAN "(9) compiling source"
  fn_read_info

  # Check if package use sources
  if [ "$SOURCEFILES" = "" ]; then
    echoc YELLOW "> Package does not uses any source"
    return 1
  fi

  # COMPILE
  TEMPFILE="$PKGCOMPILE/COMPILE"
  echo "> COMPILE (make), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run COMPILE
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # Make Test
  TEMPFILE="$PKGCOMPILE/MAKETEST"
  echo "> MAKE TEST (make check), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run Make Test
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # Next Level
  echo "10" >"$PKGSTEP"
  PKGLEVEL=10
}



fn_package_install() {
  fn_package_banner
  echoc CYAN "(10) installing source"
  fn_read_info

  # Check if package use sources
  if [ "$SOURCEFILES" = "" ]; then
    echoc YELLOW "> Package does not uses any source"
    return 1
  fi

  # PRE-INSTALL
  TEMPFILE="$PKGCOMPILE/PRE-INSTALL"
  echo "> PRE-INSTALL (make uninstall), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run PRE-INSTALL
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # MILESTONE
  if [ ! -f "$MILESTONE" ]; then
    echoc GREEN "> Creating MILESTONE"
    > "$MILESTONE"
  else
    echo "- Milestone is here"
  fi

  # INSTALL
  TEMPFILE="$PKGCOMPILE/INSTALL"
  echo "> INSTALL (make install), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run INSTALL
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # POST-INSTALL
  TEMPFILE="$PKGCOMPILE/POST-INSTALL"
  echo "> POST-INSTALL (ldconfig), leave blank to skip or edit to launch an editor or just type a command"
  echo -n "  (`head -1 $TEMPFILE 2>/dev/null`): "
  read XTEMPFILE
  if [ "$XTEMPFILE" = "edit" ] ; then
    touch $TEMPFILE
    edit $TEMPFILE
    echo "- $TEMPFILE done"
  elif [ "$XTEMPFILE" != "" ]; then
    echo "$XTEMPFILE" > $TEMPFILE
  fi
  # Run POST-INSTALL
  fn_run_script  "$TEMPFILE"  "$PKG_WORKDIR/$SOURCEDIR"

  # Next Level
  echo "11" >"$PKGSTEP"
  PKGLEVEL=11
}



fn_package_scan() {
  fn_package_banner
  echoc CYAN "(11) scanning filesystem"
  fn_read_info

  # Milestone
  if [ ! -f "$MILESTONE" ]; then
    echoc RED    "! No MILESTONE was found"
    echoc YELLOW "  You can press ENTER to continue and create a new MILESTONE ..."
    read x
    touch "$MILESTONE"
    echoc YELLOW "  Milestone has been created, please, now you can just switch"
    echoc YELLOW "  to another vcs to install the software to be packaged, after that"
    echoc YELLOW "  you can press ENTER to begin the analisys of changed files ..."
    read x
  fi

  # Hold your horses
  echo -n "> Syncing disks ..."
  sync ; sleep 2
  echo " done."
  if [ ! -f "$PKGCOMPILE/INSTALL" -a ! -f "$PKGCOMPILE/CONFIGURE" ]; then
    echoc GREEN -n "? press ENTER to begin the filesystem scanning"
    read x
  fi
   
  # Scanning ...
  echoc GREEN "- Finding changes into the filesystem ... "
  echo "# Package Create - scanning on `date` " >$CHANGETEMP
  echo "# Please, edit this file removing comment and unwanted entries " >>$CHANGETEMP
  echo -n "> Scanning : "
  echo -n " var "  ; find /var  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " bin "  ; find /bin  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " etc "  ; find /etc  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " lib "  ; find /lib  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " root " ; find /root -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " sbin " ; find /sbin -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " usr "  ; find /usr  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo -n " opt "  ; find /opt  -xdev -cnewer $MILESTONE -newer $MILESTONE >>$CHANGETEMP
  echo " sorting "
  sort $CHANGETEMP > $CHANGELIST
  rm -f $CHANGETEMP
  echoc YELLOW -n "? Press ENTER to edit the file with the list of changes"
  edit $CHANGELIST
  echo "- $CHANGELIST done"
  # TEST
  rm -f $MILESTONE
  
  # Next Level
  echo "12" >"$PKGSTEP"
  PKGLEVEL=12
}



fn_package_pack() {
  fn_package_banner
  echoc CYAN "(12) packing files from filesystem"
  fn_read_info

  # Check changelist  
  if grep -q "^#" $CHANGELIST ; then
    echoc RED "! Please remove comments from $CHANGELIST, then try again"
    exit 1
  fi
  
  # Pack
  ( cd / ; tar -O -p -T $CHANGELIST -c | tar -v -x -p -C $PKGROOT )
  if [ $? -ne 0 ]; then
    echoc RED "! Error while gathering files from the filesystem"
    exit 1
  fi
  echo "> done." 

  # Next Level
  echo "13" >"$PKGSTEP"
  PKGLEVEL=13
}



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

  # Deprecated dirs
  if [ -d $PKGROOT/usr/doc ]; then
    echoc YELLOW "- moveing /usr/doc to /usr/share/doc"
    mv -v $PKGROOT/usr/doc/ $PKGROOT/usr/share/doc/
  fi
  if [ -d $PKGROOT/usr/man ]; then
    echoc YELLOW "- moveing /usr/man to /usr/share/man"
    mv -v $PKGROOT/usr/man/ $PKGROOT/usr/share/man/
  fi
  if [ -d $PKGROOT/usr/info ]; then
    echoc YELLOW "- moveing /usr/info to /usr/share/info"
    mv -v $PKGROOT/usr/info/ $PKGROOT/usr/share/info/
  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 "- Changing 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."

  # Next Level
  echo "14" >"$PKGSTEP"
  PKGLEVEL=14
}



fn_package_request() {
  fn_package_banner
  echoc CYAN "(14) specify dependencies"
  fn_read_info

  # REQUEST
  echo "> Please, complete the REQUEST line."
  echo -n "  ($REQUEST): "
  read XREQUEST
  if [ "$XREQUEST" != "" ] ; then 
    REQUEST="$XREQUEST"
    # Save changes
    fn_write_info
  fi

  # Next Level
  echo "15" >"$PKGSTEP"
  PKGLEVEL=15
}



fn_package_package() {
  fn_package_banner
  echoc CYAN "(15) building BPP packages"
  fn_read_info

  # Checking BPP structure
  echo "- Checking package structure"
  if [ ! -d $PKGROOT ]; then
      echoc RED "! The package main directory was not found"
      exit 1
  fi
  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=""
  ( cd $PKGROOT ; du -s -b * ; echo ) | grep -v install | grep -v incoming | grep -v usr >$USAGETEMP
  ( cd $PKGROOT ; du usr/* -s -b ; echo ) >>$USAGETEMP
  DISKUSAGES=`cat $USAGETEMP | awk '{ if ($0!="") { print $1 ":" $2 " " } }'`
  echo "  ($DISKUSAGES)"
  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 TAR archive
  echoc GREEN "- Tarring ..."
  ( cd $PKGROOT ; tar  --sparse  --verify  -p  -f $FULLVERSION  -c * )
  if [ $? -ne 0 ] ; then 
    echo " * * *  T A R - E R R O R  * * *"
    exit 1
  fi

  # Removing some files
  echo "- Removing dot files ..."
  ( cd $PKGROOT ; tar -v -f "$PKGROOT/$FULLVERSION" --delete install/.[a-z]* )
  if [ $? -ne 0 ] ; then 
    echo " * * *  T A R (u) - E R R O R  * * *"
    exit 1
  fi

  # Creating Manifest
  echo "- Creating MANIFEST file"
  rm -f $PKGINST/MANIFEST
  tar -tf "$PKGROOT/$FULLVERSION" > "$PKGINST/MANIFEST"

  # Adding Manifest
  echo "- Appending MANIFEST ..."
  ( cd $PKGROOT ; tar -f "$PKGROOT/$FULLVERSION" -u install/MANIFEST )
  if [ $? -ne 0 ] ; then 
    echo " * * *  T A R (u) - E R R O R  * * *"
    exit 1
  fi

  # Compressing Package
  echo "- 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

  #
  echoc GREEN "Package $FULLVERSION has been successfully builded." 

  # Next Level
  echo "16" >"$PKGSTEP"
  PKGLEVEL=16
}



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

# Init
SHOW_BANNER=0

# Parameters
[ "$1" = "" ] && fn_package_help
PKGROOT="$1"
PKGINST="$PKGROOT/install"
PKGINFO="$PKGINST/INFO"
PKGPATCH="$PKGINST/patches"
PKGCOMPILE="$PKGINST/compile"
PKGSCRIPT="$PKGINST/scripts"
PKGSTEP="$PKGINST/.package-create"
PKGLEVEL=1
PKGMODE="$2"
if [ "$2" = "" ]; then 
  if [ -f $PKGSTEP ]; then
    PKGLEVEL="`cat $PKGSTEP`"
  fi
else
  # Convert PKGLEVEL
  case $PKGMODE in
    info)			PKGLEVEL=1 ;;
    sourceinfo)		PKGLEVEL=2 ;;
    sourcerequest)	PKGLEVEL=3 ;;
    fetch)			PKGLEVEL=4 ;;
    checksum)		PKGLEVEL=5 ;;
    extract)		PKGLEVEL=6 ;;
    patch)			PKGLEVEL=7 ;;
    configure)		PKGLEVEL=8 ;;
    build)			PKGLEVEL=9 ;;
    install)		PKGLEVEL=10 ;;
    scan)			PKGLEVEL=11 ;;
    pack)			PKGLEVEL=12 ;;
    check)			PKGLEVEL=13 ;;
    request)		PKGLEVEL=14 ;;
    package)		PKGLEVEL=15 ;;
    announce)		PKGLEVEL=16 ;;
    *) 			PKGLEVEL=0 ;;
  esac
fi

# Temp files
MILESTONE="$PKGINST/.milestone"
CHANGELIST="$PKGINST/.changelist"
CHANGETEMP="$PKGINST/.changetemp"
USAGETEMP="$PKGINST/.usagetemp"


# Default Values
COPYRIGHT="GPL"
DISKNAME="1"
DISKUSAGE=0
STATUS="UNSTABLE"
OSNAME="`uname -s`"
OSVERSION="`uname -r`"
ARCH="i386"
OPTIM="`uname -m`"
DISTRIBUTION="$DISTRELEASE"
BUILDHOST="`hostname`.`domainname`"
BUILDTIME="`date`"
BUILDNUMBER=0
BPPVERSION="$PKG_VERSION"


# Make options
[ $PKGLEVEL -le  0 ] && fn_package_help
[ $PKGLEVEL -le  1 ] && fn_package_info
[ $PKGLEVEL -le  2 ] && fn_package_sourceinfo
[ $PKGLEVEL -le  3 ] && fn_package_sourcerequest
[ $PKGLEVEL -le  4 ] && fn_package_fetch
[ $PKGLEVEL -le  5 ] && fn_package_checksum
[ $PKGLEVEL -le  6 ] && fn_package_extract
[ $PKGLEVEL -le  7 ] && fn_package_patch
[ $PKGLEVEL -le  8 ] && fn_package_configure
[ $PKGLEVEL -le  9 ] && fn_package_build
[ $PKGLEVEL -le 10 ] && fn_package_install
[ $PKGLEVEL -le 11 ] && fn_package_scan
[ $PKGLEVEL -le 12 ] && fn_package_pack
[ $PKGLEVEL -le 13 ] && fn_package_check
[ $PKGLEVEL -le 14 ] && fn_package_request
[ $PKGLEVEL -le 15 ] && fn_package_package
#[ $PKGLEVEL -le 16 ] && fn_package_announce

echo "package-create: done at level $PKGLEVEL."
exit 0
