2008-12-20 16:36:35 -06:00
#!/usr/bin/perl
# Script Name: pull-debian-source
# Author: Nathan Handler <nhandler@ubuntu.com>
# Usage: pull-debian-source <source package> [release]
2010-12-23 23:12:24 +02:00
# Copyright (C) 2008-2009 Nathan Handler <nhandler@ubuntu.com>,
# 2010 Stefano Rivera <stefanor@ubuntu.com>
2008-12-20 16:36:35 -06:00
# License: GNU General Public License
# 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.
#
# On Debian GNU/Linux systems, the complete text of the GNU General
2009-03-04 22:36:57 +00:00
# Public License can be found in the /usr/share/common-licenses/GPL-3 file.
2008-12-20 16:36:35 -06:00
use warnings;
use strict;
use LWP::Simple;
use File::Basename;
2009-04-20 22:35:04 +00:00
use Getopt::Long;
2009-12-22 22:27:04 +00:00
use AptPkg::Version;
2008-12-20 16:36:35 -06:00
2010-12-23 23:12:24 +02:00
my($name) = basename($0);
2010-12-24 11:08:55 +02:00
my($help, $mirror, $no_conf);
2010-12-23 23:12:24 +02:00
GetOptions('h|help' => \$help,
'm|mirror=s' => \$mirror,
'no-conf' => \$no_conf,
);
2010-12-22 16:53:58 +02:00
&usage(0) if($help);
2010-12-25 18:05:12 +02:00
my($package) = $ARGV[0] || &usage(2);
2010-12-23 23:12:24 +02:00
if (! $no_conf) {
my($shell_cmd);
$shell_cmd .= "[ -f /etc/devscripts.conf ] && . /etc/devscripts.conf\n";
$shell_cmd .= "[ -f ~/.devscripts ] && . ~/.devscripts\n";
2010-12-24 03:04:42 +02:00
foreach my $var qw(PULL_DEBIAN_SOURCE_DEBIAN_MIRROR
UBUNTUTOOLS_DEBIAN_MIRROR
2010-12-23 23:12:24 +02:00
PULL_DEBIAN_SOURCE_MIRROR_FALLBACK
UBUNTUTOOLS_MIRROR_FALLBACK) {
$shell_cmd .= "echo $var=\$$var\n";
}
my $shell_out = `/bin/bash -c '$shell_cmd'`;
my %config_values;
foreach my $line (split /\n/, $shell_out) {
2010-12-24 00:19:27 +02:00
my($k, $v) = split /=/, $line, 2;
2010-12-23 23:12:24 +02:00
$config_values{$k} = $v;
}
2010-12-24 03:04:42 +02:00
$mirror = $config_values{'PULL_DEBIAN_SOURCE_DEBIAN_MIRROR'}
|| $config_values{'UBUNTUTOOLS_DEBIAN_MIRROR'}
2010-12-23 23:12:24 +02:00
if (! $mirror);
}
my($default_mirror) = 'http://ftp.debian.org/debian';
my(@mirrors);
2010-12-24 11:08:55 +02:00
push @mirrors, $mirror if $mirror && $mirror ne $default_mirror;
push @mirrors, $default_mirror;
2010-12-23 23:12:24 +02:00
2010-04-20 17:56:51 +02:00
my($release)=$ARGV[1] || 'unstable';
2009-03-28 14:45:11 +00:00
$release=&convertCodeName($release);
2008-12-20 16:36:35 -06:00
&checkRelease($release);
2010-12-23 23:12:24 +02:00
my($madison) = &getMadison(&getURL($package,$release));
foreach my $mirror (@mirrors) {
my($dsc)=&getDSC($madison, $mirror);
print "$dsc\n";
system("dget -xu $dsc");
exit(0) if ($? == 0);
}
exit(1);
2009-03-28 14:45:11 +00:00
sub convertCodeName {
my($release)=shift || die("No Release Passed To convertCodeName!\n");
chomp $release;
if($release=~m/^lenny$/i) {
return "stable";
}
elsif($release=~m/^squeeze$/i) {
return "testing";
}
elsif($release=~m/^sid$/i) {
return "unstable";
}
elsif($release=~m/^etch$/i) {
return "oldstable";
}
return $release;
}
2008-12-20 16:36:35 -06:00
sub checkRelease {
my($release)=shift || die("No Release Passed To checkRelease!\n");
chomp $release;
my %releases=(
'stable' => 1,
'testing' => 1,
'unstable' => 1,
2009-03-28 14:45:11 +00:00
'experimental' => 1,
'oldstable' => 1
2008-12-20 16:36:35 -06:00
);
&invalidRelease(\%releases) unless $releases{$release}
}
sub getURL{
my($package)=shift || die("No Package Passed To getURL: $!\n");
my($release)=shift || die("No Release Passed to getURL: $!\n");
chomp $package;
chomp $release;
$package=lc($package);
$package=~s/\+/%2b/g;
$release=lc($release);
2010-11-21 14:48:22 +01:00
my($baseURL)='http://qa.debian.org/madison.php?text=on&a=source';
2008-12-20 16:36:35 -06:00
my($url)=$baseURL . '&package=' . $package . '&s=' . $release;
return $url;
}
sub getMadison {
my($url)=shift || die("No URL Passed to getMadison: $!\n");
chomp $url;
my($madison)=get($url);
2010-11-21 14:48:22 +01:00
die("The source package $package isn't available in Debian testing.\nRun $name $package unstable if the package has not yet migrated from Debian unstable to Debian testing.\n") if ($release=~m/testing/ && $madison=~m/^\s*$/);
2008-12-20 16:36:35 -06:00
return $madison;
}
sub getDSC {
my($madison)=shift || die("No madison Passed to getDSC: $!\n");
if($madison=~m/^[WE]:/i) {
die("$madison");
}
2010-12-23 23:12:24 +02:00
my($baseURL)=shift || die ("No baseURL Passed to getDSC: $!\n");
2008-12-20 16:36:35 -06:00
my(@madison)=split(/\n/,$madison);
2009-12-22 22:27:04 +00:00
my %urls;
my $url;
2008-12-20 16:36:35 -06:00
foreach my $line (@madison) {
2010-12-23 23:12:24 +02:00
$url = $baseURL . '/pool/';
2008-12-20 16:36:35 -06:00
my($package,$version,$release,$archs)=split(/\|/,$line,4);
$package=~s/\s*//g;
$version=~s/\s*//g;
$release=~s/\s*//g;
$archs=~s/\s*//g;
2008-12-22 10:30:53 -06:00
$version=~s/^.*?\://;
2008-12-20 16:36:35 -06:00
if($archs=~m/source/) {
print "Package: $package\nVersion: $version\nRelease: $release\nArchitectures: $archs\n";
2009-01-02 11:36:39 -06:00
my($firstLetter);
if($package=~m/^lib/) {
$firstLetter="lib" . substr($package,3,1);
}
else {
$firstLetter=substr($package,0,1);
}
2009-05-23 20:40:21 +00:00
if($release=~m/contrib/) {
$url .= 'contrib/';
}
elsif($release=~m/non\-free/) {
$url .= 'non-free/';
}
else {
$url .= 'main/';
}
$url .= $firstLetter . '/' . $package . '/' . $package . '_' . $version . '.dsc';
2009-12-22 22:27:04 +00:00
$urls{$version} = $url;
2008-12-20 16:36:35 -06:00
}
2009-12-22 22:27:04 +00:00
2008-12-20 16:36:35 -06:00
}
2009-12-22 22:27:04 +00:00
2010-12-03 00:10:41 +01:00
my @vers = reverse sort AptPkg::Version::CmpVersion keys %urls;
2009-12-22 22:27:04 +00:00
return $urls{$vers[0]} or die("Unable To Find Source Package On Madison\n");
2008-12-20 16:36:35 -06:00
}
sub usage {
2010-12-22 16:53:58 +02:00
my($exit)=shift;
2010-12-23 23:12:24 +02:00
print <<"EOF";
USAGE: $name [options] <source package> [target release]
Options:
-h, --help Show this help message and exit
2010-12-24 03:04:42 +02:00
-m DEBIAN_MIRROR, --mirror=DEBIAN_MIRROR
2010-12-23 23:12:24 +02:00
Preferred Debian mirror
2010-12-24 00:19:27 +02:00
(default: http://ftp.debian.org/debian)
2010-12-23 23:12:24 +02:00
--no-conf Don't read config files or environment variables
EOF
2010-12-22 16:53:58 +02:00
exit($exit);
2008-12-20 16:36:35 -06:00
}
sub invalidRelease {
my($releases)=shift || die("Invalid Release!");
my(%releases)=%$releases;
my($validReleases);
while ( my ($key, $value) = each(%releases) ) {
if($value) {
$validReleases .= $key . ", ";
}
}
$validReleases=~s/,\s*$//;
die("Invalid Release!\nValid Releases: $validReleases\n");
}