#!/usr/local/bin/perl -w

use strict;
use Getopt::Std;
use File::Basename;
use Bootstrap;

sub tint_nvr ($);

my %opt;
my %packages = ();
my $tint_ver = '$Id: tint.pl,v 1.6 2001/08/29 21:16:07 sbi Exp $';

getopts("vchp:r:", \%opt);

if ($opt{h}) {
    print <<EOF;
Usage: tint.pl [-c] [-v] [-h] [-r repository] [-p packages]

  -c: Do not use cached versions of packages
  -v: Verbose output
  -h: Print this usage message
  -p: Write specfile for individual tint packages
  -r: Specify the repository to use

Without the `-p' argument, tint.pl makes spec files for all installed
tint packages.

$tint_ver
$bootstrap_pm_ver
EOF
    exit 0;
}
if ($opt{p}) {
    @packages{@ARGV} = (1) x @ARGV;
    $packages{$opt{p}} = 1;
}
if ($opt{v}) {
    # Guarantee interactive-style output
    select(STDERR); $| = 1;
    select(STDOUT); $| = 1;
}

set_repository($opt{r} || guess_repository);
open_ftp unless ($opt{c});

open (TINT_DB, "< $tint_database")
    or die "Cannot open $tint_database for reading: $!";

print "Reading $tint_database..." if $opt{v};

my ($line, $pkg);
my %tintdb;

# The tint database is stored as a flat-text database with 8 fields
# delimited by spaces: 
#
# package name, file type, filename, owner (numeric), group (numeric)
# and permission.

while ($line = <TINT_DB>) {
    next unless ($line =~ m/^(\S+) (\S+) (\S+)/);
    my ($pkg, $type, $file) = ($1, $2, $3);

    chomp $file;
    
    if (!$opt{p} || $packages{(tint_nvr($pkg))[0]}) {
	push @{ $tintdb{$pkg} }, $file;
    }
}

close TINT_DB;

print "done.\n" if $opt{v};

foreach $pkg (keys %tintdb) {
    my ($name, $ver, $rel) = (tint_nvr $pkg);
    my $fn;

    if (!$opt{c} && 
        ($fn = copy_cached_if_available("tint-$name", $ver, $rel))) {
        print "Using cached file $fn.\n";
    } else {
        print "Creating specfile for $pkg.\n" if $opt{v};
        print_spec { NAME => "tint-$name", 
	    	     VERSION => $ver, 
		     RELEASE => $rel,
	             PROVIDES => [ "$name = $ver", 
			           @{ get_provides @{ $tintdb{$pkg} } } ], 
		     REQUIRES => get_requires @{ $tintdb{$pkg} } };
    }
}

close_ftp unless ($opt{c});

# tint_nvr extracts the name, version, and release from the tint
# database, and returns them in a vector.

sub tint_nvr ($) {
    my ($name, $ver, $rel) = split /_/, $_[0], 3;

    $ver =~ s/-/_/g; # tint allows hyphens, rpm does not
    $rel =~ s/-/_/g;
    return ($name, $ver, $rel);
}
