#!/usr/bin/perl -w # Archlinux support, based on the GSoC work of Nikolay Rysev ################################################################ # # Copyright (c) 1995-2014 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 Archive::Tar; use Build::Arch; use Digest::MD5; use File::Path; use Getopt::Long; Getopt::Long::Configure("no_ignore_case"); my $cachedir = "/var/cache/build"; sub getrepodb { my ($url, $reponame, $dir) = @_; File::Path::mkpath($dir); system($INC[0]."/download", $dir, "$url$reponame.db"); } sub getreponame { my ($url) = @_; return $1 if "/$url/" =~ /.*\/([^\/]+)\/os\//; return undef; } sub printpkginfo { my ($d, $repourl) = @_; my $id = $d->{'name'} . "." . $d->{'arch'} . "-" . $d->{'buildtime'} . "/0/0"; my $pkgurl = $repourl . $d->{'filename'}; my $selfprovides = $d->{'name'}; $selfprovides .= "=$d->{'version'}" if defined $d->{'version'}; push @{$d->{'provides'}}, $selfprovides unless @{$d->{'provides'} || []} && $d->{'provides'}->[-1] eq $selfprovides; print "F:$id: $pkgurl\n"; print "P:$id: " . join(' ', @{$d->{'provides'}}) . "\n" if $d->{'provides'}; print "R:$id: " . join(' ', @{$d->{'requires'}}) . "\n" if $d->{'requires'}; print "I:$id: $d->{name}-$d->{'version'} $d->{'buildtime'}\n"; } GetOptions("cachedir=s" => \$cachedir) or exit(1); for my $url (@ARGV) { die("Not an Archlinux repo") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/; my $reponame = getreponame($url); my $repoid = Digest::MD5::md5_hex($url); my $dir = "$cachedir/$repoid"; $url .= '/' unless $url =~ /\/$/; getrepodb($url, $reponame, $dir); my $repodb = Archive::Tar->iter("$dir/$reponame.db", 1); my $e; my $lastfn = ''; my $d; while ($e = $repodb->()) { next unless $e->type() == Archive::Tar::Constant::FILE; my $fn = $e->name(); next unless $fn =~ s/\/(?:depends|desc|files)$//s; if ($lastfn ne $fn) { printpkginfo($d, $url) if $d->{'name'}; $d = {}; $lastfn = $fn; } Build::Arch::parserepodata($d, $e->get_content()); } printpkginfo($d, $url) if $d->{'name'}; }