#!/usr/bin/perl
#
# (C) Martin J. Bligh 2003
# Released under the GPL, version 2
#
# modified 8/24/04 by Rick Lindsley to handle kernel versions with four
# parts (i.e., 2.6.8.1)
#

use Getopt::Long;

my $mirror = "ftp://ftp.kernel.org/pub/linux/kernel";
my $kernel;
my $relative;
my $onlypatch;

GetOptions("mirror|m=s" =>		\$mirror,
       "debug|d"	=>		\$debug,
       "relative|r"	=>		\$relative,
       "onlypatch|p"=>		\$onlypatch,
       "onlyexpandpatch|e"=>	\$onlyexppatch);

($kernel, @patches) = @ARGV;

if ($kernel eq "") {
    print "Usage: $0 [-m <mirror>] [-r] [-p|-P] <kernel-alias>\n";
    exit 1;
}

if ($relative) {
    $mirror = "";
}

$akpm = "$mirror/people/akpm/patches";
$mbligh = "$mirror/people/mbligh";

if ($kernel =~ /^(2.(\d).((\d.)?)(\d+(-(test|pre|rc)\d+)?))(-(mm|mjb|bk)\d+)$/) {
    $kernelpset = $kernel;
    ($kernel, $minor, $maintextra, $extra, $extraop, $pset, $psettype) = 
	    ($1, $2, $5, $6, $7, $8, $9);

	    # From "2.6.0-rc1-mm2" we get:
		    # $kernelpset		2.6.0-rc1-mm1
		    # $kernel		2.6.0-rc1
		    # $minor		6
		    # $maintextra		0-rc1
		    # $extra		-rc1
		    # $extraop		rc
		    # $pset			-mm2
		    # $psettype		mm

    if ($debug) {
	    print "kernelpset $kernelpset\n";
	    print "kernel $kernel\n";
	    print "minor $minor\n";
	    print "maintextra $maintextra\n";
	    print "extra $extra\n";
	    print "extraop $extraop\n";
	    print "pset $pset\n";
	    print "psettype $psettype\n";
    }
    if ($psettype eq "mm") {
	    $patch = "$akpm/2.$minor/$kernel/$kernelpset/$kernelpset.bz2";
    } elsif ($psettype eq "mjb") {
	    $patch = "$mbligh/$kernel/patch-$kernelpset.bz2";
    } elsif ($psettype eq "bk") {
	    $patch = "$mirror/v2.$minor/snapshots/patch-$kernelpset.bz2";
    }
    unshift @patches, $patch;
}

$patches = join(' ', @patches);
if ($onlypatch) {
    print "$patches\n";
} elsif ($onlyexppatch) {
    print "$kernel $patches\n";
} else {
    $kernel =~ /^2.(\d).((\d.)?)(\d+(-(test|pre|rc)\d+)?)$/ || 
	    die "Invalid kernel alias: $kernel";
    ($minor, $maintextra, $extra, $extraop) = ($1, $4, $5, $6);
    if ($extraop eq "rc") {
	    $kernelurl = "$mirror/v2.$minor/testing/linux-$kernel.tar.bz2";
    } elsif ($extraop eq "test") {
	    $kernelurl = "$mirror/v2.$minor/pre-releases/linux-$kernel.tar.bz2";
    } else {
	    $kernelurl = "$mirror/v2.$minor/linux-$kernel.tar.bz2";
    }
    print "$kernelurl $patches\n";
}
