forked from openSUSE/obs-build
-
Notifications
You must be signed in to change notification settings - Fork 0
/
createarchdeps
executable file
·72 lines (60 loc) · 2.02 KB
/
createarchdeps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/perl -w
# Archlinux support, based on the GSoC work of Nikolay Rysev <[email protected]>
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'};
}