#!/bin/sh

#// repacman.sh
#// (c) 2008 - gyo <gyo_at_archlinux_dot_fr>
#// license : GPL
#// description : utilitaire permettant de reconstruire le paquet d'origine d'un paquet install  partir des informations contenus dans la base de donnes pacman

_prg_name="${0##*/}"
_prg_version='0.98'

# Rcupration de certains paramtres de pacman.conf
eval $(sed -re '/^[[:space:]]#/d' -e '/(DBPath|CacheDir)/s:([^[:space:]]+)[[:space:]]*=[[:space:]]*([^[:space:]]+):\1="\2":p;d' /etc/pacman.conf)

PACMAN_DB_DIR=${DBPath:-'/var/lib/pacman/'}
PACMAN_CACHE_DIR=${CacheDir:-'/var/cache/pacman/pkg/'}
FILE_PREP_DIR="/tmp/${_prg_name}_$$"
CURRENT_DIR="`pwd`"

DEBUG=0

#------ function ------#

function f_generate_pkginfo {
[ -e $package_dir/desc ] || _f_missed_file desc 3

dateR=`date -R`
cat << EOF > .PKGINFO
# Generated by $_prg_name $_prg_version
# $dateR
EOF

function file_stream {
cat $package_dir/desc
[ -e $package_dir/depends ] && cat $package_dir/depends
sed -rne '/%BACKUP%/,$s/^([^[:space:]]+).*/\1/p' $package_dir/files
}
file_stream | while read; do
  case $REPLY in
    %NAME%)	  pkginfo_var='pkgname';;
    %VERSION%)	  pkginfo_var='pkgver';;
    %DESC%)	  pkginfo_var='pkgdesc';;
    %GROUPS%)	  pkginfo_var='group';;
    %URL%)	  pkginfo_var='url';;
    %LICENSE%)	  pkginfo_var='license';;
    %ARCH%)	  pkginfo_var='arch';;
    %BUILDDATE%)  pkginfo_var='builddate';;
    %PACKAGER%)	  pkginfo_var='packager';;
    %SIZE%)	  pkginfo_var='size';;
    %REPLACES%)	  pkginfo_var='replace';;
    %DEPENDS%)	  pkginfo_var='depend';;
    %CONFLICTS%)  pkginfo_var='conflict';;
    %PROVIDES%)	  pkginfo_var='provide';;
    %BACKUP%)	  pkginfo_var='backup';;
    %*%) unset pkginfo_var;;
    *) 
      if [ -n "$REPLY" -a -n "$pkginfo_var" ]; then
        echo "$pkginfo_var = $REPLY" >> .PKGINFO
      fi
    ;;
  esac
done
}

function f_create_tar {
mkdir $FILE_PREP_DIR
cd $FILE_PREP_DIR
[ -e $package_dir/files ] || _f_missed_file files 2

sed -rne '/%FILES%/,/%BACKUP%/{/^(%FILES%|%BACKUP%| *)$/d;s:^:/:p}' $package_dir/files > .FILELIST

if [ -e $package_dir/install ]; then
  cd $FILE_PREP_DIR
  cp $package_dir/install .INSTALL
fi

if [ -e $package_dir/changelog ]; then
  cd $FILE_PREP_DIR
  cp $package_dir/changelog .CHANGELOG
fi

f_generate_pkginfo

bsdtar czvf $CURRENT_DIR/$pkgname_ver.pkg.tar.gz --exclude=. --exclude=.. --exclude=.FILELIST -n -T .FILELIST .*
}

function _f_missed_file {
  echo "! Fichier \"$1\" manquant" >&2
  exit $2
}

function f_help {
  cat << EOF
[ $_prg_name $_prg_version ]
  $_prg_name nom_du_paquet (ex: $_prg_name hal)
  -h : affiche cette aide
EOF
}

#------ end function ------#

#------ MAIN ------#

if [ "`id -u`" != 0 -a `type -p fakeroot` ]; then
  fakeroot -- $0 $@
  exit $?
fi

if ((!$#)); then
  echo "Erreur : pas assez d'arguments"
  echo
  f_help
  exit 1
fi

if [ "$1" = '-h' ]; then f_help; exit 0; fi

pkgname="$1"

package_dir=`echo $PACMAN_DB_DIR/local/$pkgname-[0-9]*`

if [ ! -d $package_dir ]; then
  echo "Le paquet \"$pkgname\" est inexistant dans la base !"
  exit 1
fi

pkgname_ver=${package_dir##*/}

if [ -f $PACMAN_CACHE_DIR/$pkgname_ver.pkg.tar.gz ]; then
  echo "Paquet \"$pkgname_ver.pkg.tar.gz\" dj existant dans le rpertoire de cache : $PACMAN_CACHE_DIR"

read -n 1 -p 'Continuer (o/N) ? '  
case $REPLY in
  o|O) ;;
  *) echo -e '\nBye.'; exit 0;;
esac

  echo
fi

echo "- Nom complet du paquet : $pkgname_ver"
if (($DEBUG)); then
echo $package_dir
fi

read -n 1 -p 'Continuer (O/n) ? '  
case $REPLY in
   n|N) echo -e '\nBye.'; exit 0;;
   *) ;;
 esac


pkgname_ver="${package_dir##*/}"

f_create_tar

if ((!$DEBUG)); then
rm -fr $FILE_PREP_DIR
fi

cd $CURRENT_DIR

echo "--> $CURRENT_DIR/$pkgname_ver.pkg.tar.gz cr !"

exit 0

#------ END MAIN ------#
