#!/usr/bin/perl -w

=pod

    Скрипт для создания директорий 'packages' для сборки deb пакетов
    в стиле Я.Директ

=cut

use strict;
use Template;
use Getopt::Long;

# разбираем параметры
my $DESCRIPTION;
GetOptions(
    'description=s' => \$DESCRIPTION,
) || die "Incorrect options: $!";

if (@ARGV != 1 || $ARGV[0] !~ /^yandex(-[a-z0-9]+)*$/) {
    die "Usage: $0 package_name\n"
        ."    package_name must be in format yandex-.*\n";
} 
my $PACKAGE = $ARGV[0];

# считываем шаблоны управляющих файлов из скрипта
my %TEMPLATES;
my $tmpl_name;
while(<DATA>) {
    if (/^<<\s*(\w+)/) {
        $tmpl_name = $1;
        $TEMPLATES{$tmpl_name} = '';
    } elsif ($tmpl_name) {
        $TEMPLATES{$tmpl_name} .= $_;
    }
}

my $t = Template->new({
    PRE_DEFINE => {
        maintainer => ($ENV{DEBFULLNAME} || 'unknown')." <".($ENV{EMAIL} || 'unknown@unknown.ru').">",
        package_name => $PACKAGE,
        description => $DESCRIPTION || '<add package description here>',
    }
});

my_mkdir("packages");
my_mkdir("packages/$PACKAGE");
my_mkdir("packages/$PACKAGE/debian");
my_create_file("packages/Makefile", "packages_makefile");
my_create_file("packages/$PACKAGE/Makefile", "empty_makefile");
my_create_file("packages/$PACKAGE/debian/control", "debian_control");
my_create_file("packages/$PACKAGE/debian/compat", "debian_compat");
my_create_file("packages/$PACKAGE/debian/$PACKAGE.dirs", "debian_dirs");
my_create_file("packages/$PACKAGE/debian/rules", "debian_rules");
chmod(0775, "packages/$PACKAGE/debian/rules");
my_system("svn", "add", "packages");

sub debug {
    my $msg = shift;
    print "$msg\n";
}

sub my_mkdir {
    my $dir = shift;
    debug("mkdir $dir");
    mkdir($dir) || die "Can't mkdir $dir: $!";
}

sub my_create_file {
    my ($file, $tmpl_name) = @_;
    die "Template $tmpl_name is not found" if !exists $TEMPLATES{$tmpl_name};
    $t->process(\$TEMPLATES{$tmpl_name}, {}, $file) || die "template error: ".$t->error();
}

sub my_system {
    my @args = @_;
    debug("system call: ".join(" ", @args));
    system(@args) && die "Error occured: $!";
}

#sub my_chdir {
#    my $dir = shift;
#    debug("cd $dir");
#    chdir($dir) || die "Can't chdir $dir: $!";
#    $ENV{PWD} = Cwd::cwd();
#}
#
#sub my_write_file {
#    my ($file, $message) = @_;
#    debug("create file $file");
#    write_file($file, $message);
#}
#
#
#sub my_rename {
#    my ($from, $to) = @_;
#    debug("rename $from -> $to");
#    rename($from, $to) || die "Can't rename $from -> $to: $!";
#}

__DATA__
<<packages_makefile
SHELL=/bin/bash

DEFAULT: clean deb
all: DEFAULT repos
co: svn_checkout

REPOS_DIR = /opt/ppc-data/repos
DEBS_DIR = $(REPOS_DIR)/debian/debs

SRC_ROOT ?= svnroot

SVN_ROOT = $(PWD)/$(SRC_ROOT)

SVN_REVISION ?= HEAD

SVN_URL = `svn info | grep '^URL: ' | sed 's/^URL: //' |sed 's!/packages$$!!'`/

svn_checkout:
	svn co -r $(SVN_REVISION) $(SVN_URL) $(SVN_ROOT)

deb:
	dh-svn-release $(SVN_ROOT) [% package_name %]/debian
	cd [% package_name %]; SVN_ROOT=$(SVN_ROOT) dpkg-buildpackage -rfakeroot

dirty: 
	SRC_ROOT=.. DH_SVN_RELEASE_NO_CHECK=1 make clean deb

repos:
	cp *.deb $(DEBS_DIR)
	make -f $(REPOS_DIR)/Makefile

clean:
	rm -f [% package_name %]/debian/{changelog,version}
	rm -f [% package_name %]*.{deb,changes,dsc,tar.gz,upload}
	cd [% package_name %]; dh_clean
<<empty_makefile
#!/usr/bin/make -f
# -*- makefile -*-

# put all instalation commands into debian/rules
install:

<<debian_dirs
usr/local/bin
<<debian_compat
5
<<debian_control
Source: [% package_name %]
Section: unknown
Priority: extra
Maintainer: [% maintainer %]
Build-Depends: debhelper (>= 5)
Standards-Version: 3.7.2

Package: [% package_name %] 
Architecture: all
Depends: 
Description: [% description %]
 [% description %]

<<debian_rules
#!/usr/bin/make -f
# -*- makefile -*-

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

# This has to be exported to make some magic below work.
export DH_OPTIONS

SVN_ROOT ?= ../svnroot
DEST = debian
DEST_MAIN = debian/[% package_name %]

build:
	echo nop

binary: install
	echo nop

clean:
	dh_testdir
	dh_testroot
	dh_clean
	rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#

	# Add here commands to clean up after the build process.
	-$(MAKE) clean

	dh_clean

install:
	dh_testdir
	dh_testroot
	dh_clean -k -i
	dh_installdirs
	dh_installcron

	# main
	install -d $(DEST_MAIN)/opt/[% package_name %]/
	rsync -a --delete --exclude="packages" --exclude=".svn" $(SVN_ROOT)/ $(DEST_MAIN)/opt/[% package_name %]/
	#install -T $(SVN_ROOT)/mk-packages-dir $(DEST_MAIN)/usr/local/bin/mk-packages-dir

	dh_perl
	#dh_makeshlibs
	dh_installdeb
	#dh_shlibdeps
	dh_gencontrol -- -v`cat debian/version`
	dh_md5sums
	dh_builddeb

.PHONY: build clean install
