#!/usr/bin/perl -w BEGIN { unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); } use Build; use Build::Susetags; use strict; sub print_pkg($) { my $pkg = shift; return if $pkg->{'arch'} eq 'src' || $pkg->{'arch'} eq 'nosrc'; my $id = sprintf("%s.%s-%d/%d/%d: ", $pkg->{'name'}, $pkg->{'arch'}, $pkg->{'buildtime'}, 0, 0); print sprintf('F:%s%ssuse/%s/%s',$id,$pkg->{'baseurl'}, $pkg->{'arch'}, $pkg->{'location'}), "\n"; print "P:$id".$pkg->{'provides'}."\n"; print "R:$id".$pkg->{'requires'}."\n"; my $tag = sprintf("%s-%s-%s %s", $pkg->{'name'}, $pkg->{'version'}, $pkg->{'release'}, # $pkg->{'rpm:buildhost'}, $pkg->{'buildtime'}); print "I:$id$tag\n"; } sub callback { my ($pkg, $url) = @_; $pkg->{'provides'} = [] unless exists $pkg->{'provides'}; # add self provides (rpm3 misses that) my $n = $pkg->{'name'}; if(substr($pkg->{'arch'}, -3) ne 'src' && !scalar grep(/^\Q$n\E( =.*)?$/,@{$pkg->{'provides'}})) { push @{$pkg->{'provides'}}, sprintf("%s = %s-%s", $pkg->{'name'}, $pkg->{'version'}, $pkg->{'release'}); } $pkg->{'provides'} = join(' ', @{$pkg->{'provides'}}); $pkg->{'requires'} = join(' ', @{$pkg->{'requires'}}) if $pkg->{'requires'}; $pkg->{'baseurl'} = $url; my @data = split(' ', $pkg->{'location'}); # multi cd support hack my $num = $data[0]; if($pkg->{'baseurl'} =~ /1\/$/ && $num ne 0) { $pkg->{'baseurl'} =~ s/1\/$/$num\//; } $pkg->{'location'} = $data[1]; print_pkg($pkg); return 0; } for my $url (@ARGV) { my $dir; if ($url =~ /^zypp:\/\/([^\/]*)\/?/) { use Build::Zypp; my $repo = Build::Zypp::parsecfg($1); die "can't parse $1\n" unless $repo; die "only yast2 repos supported\n" unless $repo->{'type'} eq 'yast2'; my $name = $repo->{'name'}; $dir = "/var/cache/zypp/raw/$name/"; } else { $dir = $url; } # a really fucked up system # if (-e $url."/yast/order") { # if(open(F, '<', $url."/yast/order")) { # my $found_products; # while() { # chomp; # my ($a, $b) = split(/ /); # $a =~ s/^\///; # if(-e $url.$a) # { # push @ARGV, $url.$a; # $found_products = 1; # print STDERR "$url -> $url$a\n"; # } # } # close(F); # next if $found_products; # } # } # XXX: location is actually defined in content file my $packages = $dir.'/suse/setup/descr/packages'; $url .= '/' unless $url =~ /\/$/; my @order = (); my $pkgs = Build::Susetags::parse($packages, { 'Loc' => 'location', 'Prv' => 'provides', 'Req' => 'requires', 'Tim' => 'buildtime' }, { cb => \&callback, data => $url }); }