#!/usr/bin/perl
# make-octave-forge-debpkg: Generate a Debian package from the sources of
#     an Octave-Forge package from scratch
# This file is part of the octave-pkg-dev Debian package

# Copyright (c) 2012  Rafael Laboissiere <rafael@laboissiere.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.

=pod

=head1 NAME

make-octave-forge-debpkg -- Generate a Debian package from the sources of an Octave-Forge package

=head1 SYNOPSIS

=over

=item B<make-octave-forge-debpkg>

=back

=head1 DESCRIPTION

B<make-octave-forge-debpkg> is a helper script for generating a first
version of a Debian package for an Octave-Forge package. The command should
be launched from the top directory of the unpacked sources of an
Octave-Forge packages.  A file called DESCRIPTION must be present, from
which information about the package is gathered.  The following files
are generated with sensible contents, although they need further editing:

=over

=item debian/changelog

=item debian/compat

=item debian/control

=item debian/copyright

=item debian/rules

=item debian/source/format

=item debian/watch

=back

=head1 ENVIRONMENT VARIABLES

The environment variables B<DEBFULLNAME> and B<DEBEMAIL> are used for
generating the identity of the developer, which will appear in
debian/changelog and debian/copyright. If they do not exist, B<FULLNAME>
and B<EMAIL> are used instead.

=head1 DISCLAIMER

B<make-octave-forge-debpkg> is distributed in the hope that it will be useful,
but B<without any warranty>; without even the implied warranty of
B<merchantability> or B<fitness for a particular purpose>.

=head1 COPYRIGHT

Copyright 2012 Rafael Laboissiere

This script is free software; you can redistribute it and/or
modify it under the terms of the GNU GPL, v3 or later.

=head1 AUTHOR

Rafael Laboissiere E<lt>rafael@laboissiere.netE<gt>

=cut

### Get program name
(my $prog = $0) =~ s|.*/||;

### Function for yelling on errrors
sub croak ($) {
    my $message = shift;
    die "$prog:E: $message\n"
}

### The pkgdata hash will store the data in the DESCRIPTION file
my %pkgdata;

### Check whether a given field exists in the DESCRIPTION file and exit the
### program with an error message, in the case the field does not exist
sub check ($) {
    my $field = shift;
    exists $pkgdata{$field} or croak "$field not found in DESCRIPTION";
}

### File DESCRIPTION is not present.  Yell loudly.
-f "DESCRIPTION" or croak "File DESCRIPTION not found";

### Read the fields present in the DESCRIPTION file
open (FID, "< DESCRIPTION");
/([^:]+): (.*)/ and $pkgdata{$1} = $2 while (<FID>);
close FID;

### Check for some mandatory fields
check ("Name");
my $name = lc $pkgdata{Name};
check ("Version");
my $version = $pkgdata{Version};
check ("Title");
my $title = $pkgdata{Title};

### Decide on the package's Architecture based on the presence of the src/
### directory, which typically contains C++ files to be compiled.
my $architecture = -d "src" ? "any" : "all";

### Create the debian/ directory, if it does not exist.
-d "debian" or mkdir "debian";

### Create the debian/compat file.
my $compat = 10;
open (FID, "> debian/compat");
print FID $compat;
close FID;

### Create the debian/watch file.
open (FID, "> debian/watch");
print FID "version=3
http://sf.net/octave/$name-(.+)\\.tar\\.gz
";
close FID;

### Create the debian/changelog file.
my $date = qx {date --rfc-2822};
chomp $date;
my $developer = exists $ENV{DEBFULLNAME} ? $ENV{DEBFULLNAME}
                : exists $ENV{FULLNAME} ? $ENV{FULLNAME}
                : "Joe Developer";
my $email = exists $ENV{DEBEMAIL} ? $ENV{DEBEMAIL}
                : exists $ENV{EMAIL} ? $ENV{EMAIL}
                : "joe\@developer.org";
my $author = "$developer <$email>";

open (FID, "> debian/changelog");
print FID "octave-$name ($version-1) unstable; urgency=low

  * Initial release (closes: #XXXXXX)

 -- $author  $date
";
close FID;

### Create the debian/rules file.
open (FID, "> debian/rules");
print FID "#!/usr/bin/make -f
# -*- makefile -*-

include /usr/share/cdbs/1/class/octave-pkg.mk
";
close FID;
system ("chmod +x debian/rules");

### Create the debian/control file.
my $uploaders = "Sébastien Villemot <sebastien\@debian.org>,
          Rafael Laboissiere <rafael\@debian.org>,
          Mike Miller <mtmiller\@debian.org>";
if ($uploaders == "") {
    $uploaders = "Uploaders: $uploaders
";
}

my $shlibs = "";
if ($architecture eq "any") {
    $shlibs = ", \${shlibs:Depends}";
}

open (FID, "> debian/control");
print FID "Source: octave-$name
Section: math
Priority: optional
Maintainer: Debian Octave Group <pkg-octave-devel\@lists.alioth.debian.org>
${uploaders}Build-Depends: debhelper (>= $compat), cdbs, octave-pkg-dev (>= 1.4.4)
Standards-Version: 3.9.8
Homepage: http://octave.sourceforge.net/$name/
Vcs-Git: https://anonscm.debian.org/git/pkg-octave/octave-$name.git
Vcs-Browser: https://anonscm.debian.org/gitweb/?p=pkg-octave/octave-$name.git

Package: octave-$name
Architecture: $architecture
Depends: \${misc:Depends}, \${octave:Depends}$shlibs
Description: $title
 \${octave:Upstream-Description}
 .
 This Octave add-on package is part of the Octave-Forge project.
";
close FID;

### Create the debian/source/format file.
-d "debian/source" or mkdir "debian/source";
open (FID, "> debian/source/format");
print FID "3.0 (quilt)\n";
close FID;

### Create the debian/copyright file.
system ("licensecheck -r --copyright -c '\\.m|\\.cc|\\.c|\\.h|\\.f' . "
         . "| /usr/lib/cdbs/licensecheck2dep5 > debian/copyright");

my $year = qx {date +%Y};
chomp $year;

### Create the Debian specific part to the debian/control file.
open (FID, ">> debian/copyright");
print FID "Files: debian/*
Copyright: $year $author
License: GPL-3+

License: GPL-3+
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License along
 with this program.  If not, see <http://www.gnu.org/licenses/>.
 .
 On Debian systems, the complete text of the GNU General Public
 License, version 3, can be found in the file
 `/usr/share/common-licenses/GPL-3'.
";
close FID;
