#!/bin/bash
# mk-spec <packagename>
pkname=$1
[[ ${#pkname} = 0 ]] && { echo "Useage: mk-spec <[pcb-rnd|camv-rnd|sch-rnd]>"; exit 1; }
################################

[[ -f /usr/include/librnd4/librnd/core/unit.h ]] || { echo "librnd-devel is not installed"; exit 1; }

currdir=$(pwd)
dirname=$(pwd|rev|cut -d/ -f1|rev)
[[ $dirname != SOURCES ]] && { echo "Not in SOURCES"; exit 1; }

# Create new spec file in SPECS
cp -f spec.tpl ../SPECS/"$pkname".spec.new

# Change references in comments to pkg name
sed -i "s/\@pkgname\@/$pkname/" "$currdir"/../SPECS/"$pkname".spec.new

# Get version from old spec
ver=$(grep -v '^#' < ../SPECS/"$pkname".spec | grep -m1 "Version:" |tr '\t' ' '|tr -s ' '| cut -d' ' -f2)

# Get rel from old spec
rel=$(grep -v '^#' < ../SPECS/"$pkname".spec | grep -m1 "%define rel"|tr '\t' ' '|tr -s ' '| cut -d' ' -f3)

# Check if define svn is commented in old spec
svn=$(grep -v '^#' < ../SPECS/"$pkname".spec | grep -m1 "define svn"|cut -c1)
if [[ $svn == "%" ]]; then # Use svn snapshot tarball
    svnrev=$(grep -v '^#' < ../SPECS/"$pkname".spec | grep -m1 "%define svn"|rev|cut -d' ' -f1|rev)
    sed -i "s/\@svn-revision\@/%define svn     $svnrev/" "$currdir"/../SPECS/"$pkname".spec.new
    version=$svnrev
else
    sed -i "s/\@svn-revision\@/#define svn/" "$currdir"/../SPECS/"$pkname".spec.new
    version=$ver
fi

# Only extract tarball and run packages.sh if auto is empty
if ! test -f "${pkname}-${svnrev}"/doc/developer/packaging/auto/List; then
# Extract tarball in SOURCES
    tar -xf "${pkname}-${version}".tar.gz

# Generate upstream packaging lists
    if uname -m|grep -q 64; then
        LIBDIR=lib64
    else
        LIBDIR=lib
    fi
    devname=${LIBDIR}rnd-devel

# Check librnd(64)-devel is installed
    if rpm -q $devname; then
        cd "${pkname}-$version" || exit 1
        ./configure --libarchdir="$LIBDIR" > /dev/null 2>&1
        cd "$currdir"  || exit 1
        cd "${pkname}-$version"/doc/developer/packaging  || exit 1
        ./packages.sh || { echo "packages.sh failed"; exit 1; }
    else
        echo "ERROR: librnd-devel must be installed"
        exit 1
    fi
fi

cd "$currdir" || exit 1
# Set version from old spec into new spec
sed -i "s/\@version\@/Version:        $ver/" "$currdir"/../SPECS/"$pkname".spec.new
# Set rel from old spec into new spec
sed -i "s/\@release\@/%define rel     $rel/" "$currdir"/../SPECS/"$pkname".spec.new
# Save path to auto dir 
auto="${pkname}-${version}/doc/developer/packaging/auto/"

# Configure args
args=$(tr '\n' ':' < "$auto"Configure.args|tr ':' ' ')
sed -i "s:@MAIN_CONFIGURE_OPTIONS@:$args:" ../SPECS/"${pkname}".spec.new

# Get librnd major and librnd min version from auto
cd "$auto" || exit 1
librnd_maj=$(cat ver_librnd_major)
librnd_min_ver="$(cat librnd_min_ver)"

#Requires
for p in *.deps; do
    pkg="$(echo "$p"|cut -d. -f1)"
    tr ' ' '\n ' < "$p" > "$pkg".tmp
    pk=$(echo "$pkg" | cut -d. -f1)
    while read -r line; do
        line=${line/wget /}
        line=$(echo "$line"|sed "s/$pkname/%{name}/g")
        line=$(echo "$line" | sed "s/librnd$librnd_maj/%{_lib}rnd$librnd_maj/g")
        if [[ $pkg = "$pkname" ]]; then
           if [[ $line == *core* ]]; then
             echo "Requires:       $line = %{version}-%{release}" >> "$currdir"/tmp.txt
             continue
           fi
            if [[ $line == *'%{_lib}'* ]]; then
             echo "Recommends:     $line >= $librnd_min_ver" >> "$currdir"/tmp.txt
             continue
           fi
             echo "Recommends:     $line = %{version}-%{release}" >> "$currdir"/tmp.txt
        else
           if [[ $line == *'%{_lib}'* ]]; then
             echo "Requires:       $line >= $librnd_min_ver" >> "$currdir"/tmp.txt
           else  
             echo "Requires:       $line = %{version}-%{release}" >> "$currdir"/tmp.txt
           fi  
        fi
    done < "$pkg".tmp
tmptxt="$(cat "$currdir"/tmp.txt)"
sed -i "s/@${pk}-req@/${tmptxt//$'\n'/\\n}/" "$currdir"/../SPECS/"$pkname".spec.new
rm -f "$currdir"/tmp.txt
rm -f "$pkg".tmp
done

# files
for p in *.files; do
pkg=$(echo $p|cut -d. -f1|cut -d- -f3-)
    [[ $pkg == "doc"  ]] && continue
	files=$(cat "$p"|sed 's:\\n: :g')
	files=$(echo "$files"|sed -e 's/$PREFIX/%{_usr}/g')
	files=$(echo "$files"|sed -e 's:%{_usr}/share:%{_datadir}:g')
	files=$(echo "$files"|sed -e 's:%{_datadir}/man:%{_mandir}:g')
	files=$(echo "$files"|sed -e 's:%{_usr}/include:%{_includedir}:g')
	files=$(echo "$files"|sed -e 's:%{_usr}/bin:%{_bindir}:g')
	files=$(echo "$files"|sed -e 's:%{_usr}/lib/librnd/plugins:%{libplugindir}:g')
	files=$(echo "$files"|sed -e 's/$P/%{plugindir}/g')
    files=$(echo "$files"|sed -e 's/$C/%config(noreplace)\@%{_sysconfdir}\/%{name}/g')
	files=$(echo "$files"|sed -e 's/$LP/%{libplugindir}/g')
    files=$(echo "$files"|sed -e "s/$pkname/%{name}/g")
    files=$(echo "$files"|sed -e 's/ /\\n/g')
    files=$(echo "$files"|sed -e 's/@/ /g')
    files=$(echo "$files"|sed -e 's@/\*\.scm@/g\*\.scm@g')
    files=$(echo "$files"|sed -e 's@/[*]@/@g')
sed -i "s:@${pkg}-files@:${files//$'\n'/\\n}:" $currdir/../SPECS/$pkname.spec.new
done

# Summary
for p in *.short; do
pkg=$(echo $p|cut -d. -f1|cut -d- -f3-)
summary=$(cat $p|sed 's_\.$__'|sed "s/^$pkname //"|sed "s/ for $pkname//"|sed 's_._\u&_')
sed -i "s_@${pkg}-summary@_${summary//$'\n'/\\n}_" $currdir/../SPECS/$pkname.spec.new
done

# Main description
fmt -s -w 80 < ../description.txt > desc.txt
if [[ $pkname == pcb-rnd ]]; then
    sed -i '20,$d' desc.txt
elif [[ $pkname == sch-rnd ]]; then
    sed -i '19,$d' desc.txt
fi

echo -e "\nFor full details of supported formats etc. \
please visit:\nhttp://www.repo.hu/projects/$pkname/datasheet.html" >> desc.txt
sed -i -l 79 '/%description/{
       r desc.txt
       :a
       n
       ba
     }' "$currdir"/../SPECS/"$pkname".spec.new

# Sub-package descriptions
for p in *.long; do
pkg=$(echo "$p"|cut -d. -f1|cut -d- -f3-)
#desc=$(cat $p|sed 's/\t//g'|fmt -w79)
desc=$(sed 's/\t//g' < "$p"|fmt -w79)
sed -i "s_@${pkg}-desc@_${desc//$'\n'/\\n}_" "$currdir"/../SPECS/"$pkname".spec.new
done

# Add * to man files for compressed versions
sed -i 's/%{_man.*/&*/g' "$currdir"/../SPECS/"$pkname".spec.new
# Move these files to /usr/lib on 64 bit
sed -i 's:%{_libdir}/%{name}/\*.scm:%{_usr}/lib/%{name}/\*.scm:' "$currdir"/../SPECS/"$pkname".spec.new

# Save original spec as backup
cp -f "$currdir"/../SPECS/"$pkname".spec "$currdir"/../SPECS/"$pkname".spec~ || \
{ echo "Problem backing up old spec"; exit 1; }

# Write new spec.
cp -f "$currdir"/../SPECS/"$pkname".spec.new "$currdir"/../SPECS/"$pkname".spec || \
{ echo "Problem writing new spec"; exit 1; }

# Remove $pkname.spec.new
rm -f "$currdir"/../SPECS/"$pkname".spec.new

echo "../SPECS/$pkname.spec has been updated :)"
