#!/usr/bin/perl -w BEGIN { unshift @INC, ($::ENV{"BUILD_DIR"} || "/usr/lib/build"); } use strict; use Digest::MD5; use File::Path; use Getopt::Long; use Build ':deb'; use Build::Deb; use Build::Debrepo; Getopt::Long::Configure("no_ignore_case"); # # supported urls # # distribution: //[components] # flat repo: /. my $cachedir = "/var/cache/build"; my $archpath; GetOptions('cachedir=s' => \$cachedir, 'archpath=s' => \$archpath) or exit(1); if (!$archpath) { $archpath = `uname -p` || 'unknown'; chomp $archpath; } my $basearch = $archpath; $basearch =~ s/:.*//; $basearch = Build::Deb::basearch($basearch); my $pkgnum = 0; for my $url (@ARGV) { die("$url: not an remote debian repo\n") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/; my $repoid = Digest::MD5::md5_hex($url); my $dir = "$cachedir/$repoid"; my @components; my $baseurl = $url; if ($url =~ /^(.*\/)\.(\/.*)?$/) { # flat repo $baseurl = $1; @components = ('.'); $url = defined($2) ? "$1$2" : $1; $url .= '/' unless $url =~ /\/$/; } else { if ($url =~ /([^\/]+)$/) { @components = split(/[,+]/, $1); $url =~ s/([^\/]+)$//; } push @components, 'main' unless @components; $url .= '/' unless $url =~ /\/$/; $baseurl = $url; $url =~ s/([^\/]+\/)$/dists\/$1/; $baseurl =~ s/([^\/]+\/)$//; } File::Path::mkpath($dir); for my $component (@components) { unlink("$dir/Packages.gz"); if ($component eq '.') { system($INC[0]."/download", $dir, "${url}Packages.gz"); die("Packages.gz missing\n") unless -s "$dir/Packages.gz"; } else { system($INC[0]."/download", $dir, "$url$component/binary-$basearch/Packages.gz"); die("Packages.gz missing for basearch $basearch, component $component\n") unless -s "$dir/Packages.gz"; } Build::Debrepo::parse("$dir/Packages.gz", sub { $pkgnum++; $_[0]->{'id'} = "$pkgnum/0/0"; Build::writedeps(\*STDOUT, $_[0], $baseurl); }, 'addselfprovides' => 1); } }