diff options
author | Zhang Qiang <qiang.z.zhang@intel.com> | 2014-04-03 15:53:09 +0800 |
---|---|---|
committer | Zhang Qiang <qiang.z.zhang@intel.com> | 2014-04-03 15:53:09 +0800 |
commit | b979ae3b9b879ce19582770e2ba89eb3e66f964a (patch) | |
tree | 758e7684bbaa43d8899ccbc49b133ff0112d3a88 /createarchdeps | |
download | build-b979ae3b9b879ce19582770e2ba89eb3e66f964a.tar.gz build-b979ae3b9b879ce19582770e2ba89eb3e66f964a.tar.bz2 build-b979ae3b9b879ce19582770e2ba89eb3e66f964a.zip |
Imported Upstream version 2013.11.12upstream/2013.11.12
Diffstat (limited to 'createarchdeps')
-rwxr-xr-x | createarchdeps | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/createarchdeps b/createarchdeps new file mode 100755 index 0000000..a97f762 --- /dev/null +++ b/createarchdeps @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w + +# Archlinux support, based on the GSoC work of Nikolay Rysev <mad.f3ka@gmail.com> + +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 =~ /^(ht|f)tp:\/\/([^\/]*)\/?/; + my $reponame = getreponame($url); + my $repoid = Digest::MD5::md5_hex("arch\@$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'}; +} |