#!/usr/bin/perl -w ################################################################ # # Copyright (c) 1995-2016 SUSE Linux Products GmbH # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or 3 as # published by the Free Software Foundation. # # 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 (see the file COPYING); if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # ################################################################ 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); } }