#!/usr/bin/perl -w

# Create a SB.o compliant .info file
# (and a .SlackBuild from a template, if one doesn't already exist,
# and a slack-desc if a README exists)

# Fill in your name and email address here:
$name = 'B. Watson';
$email = 'yalhcru@gmail.com';

use LWP::Simple;
use Digest::MD5 'md5_hex';

sub usage {
	die "usage: mkslackinfo url [homepage] [version]\n";
}

$url = shift || &usage;

# Take package name from the current dir
chomp ($package = `pwd`);
$package =~ s,.*/,,;

# Take filename from last part of URL
($file = $url) =~ s,.*/,,;

# Generate appropriate extract command
if($file =~ /\.zip$/i) {
	$extract = "unzip \$CWD/\$PRGNAM-\$VERSION.zip";
} elsif($file =~ /\.rar$/i) {
	$extract = "unrar x \$CWD/\$PRGNAM-\$VERSION.rar";
} elsif($file =~ /\.7z$/i) {
	$extract = "7za x \$CWD/\$PRGNAM-\$VERSION.rar";
} elsif($file =~ /(\.tar(?:$|\..*)|\.t[bxg]z)/i) {
	$extract = "tar xvf \$CWD/\$PRGNAM-\$VERSION$1";
}

$homepage = shift;
if(!$homepage) {
	if($url =~ m{http://downloads.(?:sourceforge|sf).net/([^/]+)/}) {
		$homepage = "http://sourceforge.net/projects/$1/";
	} elsif($url =~ m,((?:ht|f)tp://[^/]+/),) {
		$homepage = $1;
	} else {
		die "Can't figure out homepage\n";
	}

	warn "Assuming homepage is $homepage\n";
}

$version = shift || 0;
if(!$version) {
	# Try to figure out the version number. The regex is fairly dumb.
	if($file =~ /-(\d[\d._]+(?:[a-z]+)?)\.(?:tar|t[gzb]z|zip|rar|7z)/) {
		$version = $1;
		warn "Version appears to be $version\n";
	} else {
		die "Can't figure out version number\n";
	}
}

if(not -e "$package.SlackBuild") {
	warn "$package.SlackBuild does not exist, creating from template\n";
	open my $build, ">$package.SlackBuild" or die $!;
	while(<DATA>) {
		s/__NAME__/$name/g;
		s/__EMAIL__/$email/g;
		s/__PRGNAM__/$package/g;
		s/__VERSION__/$version/g;
		s/__EXTRACT__/$extract/g;
		print $build "$_";
	}
	close $build;
	chmod 0755, "$package.SlackBuild";
}

if((-e "README") && (! -e "slack-desc")) {
	warn "slack-desc does not exist, creating from existing README\n";
	system("mkslackdesc");
}

print STDERR "Downloading $url...";
$content = get($url);
if($content) {
	$md5 = md5_hex($content);
	print STDERR "OK\nWriting $package.info\n";
} else {
	warn "Can't download $url with LWP::Simple, MD5SUM will be wrong in .info\n";
	$md5 = "FIXME";
}

open $f, ">$package.info" or die $!;
$content = <<EOF;
PRGNAM="$package"
VERSION="$version"
HOMEPAGE="$homepage"
DOWNLOAD="$url"
MD5SUM="$md5"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
MAINTAINER="$name"
EMAIL="$email"
EOF
print $content;
print $f $content;
close $f;

if($url =~ /sourceforge\.net/i) {
	$extra_wget_params = "--user-agent wget";
} else {
	$extra_wget_params = "--referer='$url'";
}

exec("wget $extra_wget_params $url");

__DATA__
#!/bin/sh

# Slackware build script for __PRGNAM__

# Written by __NAME__ (__EMAIL__)

# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.

PRGNAM=__PRGNAM__
VERSION=${VERSION:-__VERSION__}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i486 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
__EXTRACT__
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
 -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --mandir=/usr/man \
  --docdir=/usr/doc/$PRGNAM-$VERSION \
  --build=$ARCH-slackware-linux

make
make install-strip DESTDIR=$PKG

find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done

rm -f $PKG/usr/info/dir
gzip -9 $PKG/usr/info/*.info*

find $PKG -name perllocal.pod \
  -o -name ".packlist" \
  -o -name "*.bs" \
  | xargs rm -f

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a <documentation> \
  $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}