#!/usr/bin/perl -w ################################################################ # # 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 Build; use Build::Susetags; use Getopt::Long; use strict; Getopt::Long::Configure("no_ignore_case"); 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 "F:$id$pkg->{'baseurl'}suse/$pkg->{'arch'}/$pkg->{'location'}\n"; print "P:$id$pkg->{'provides'}\n"; print "R:$id$pkg->{'requires'}\n"; print "C:$id$pkg->{'conflicts'}\n" if $pkg->{'conflicts'}; print "O:$id$pkg->{'obsoletes'}\n" if $pkg->{'obsoletes'}; 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' && !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->{'conflicts'} = join(' ', @{$pkg->{'conflicts'}}) if $pkg->{'conflicts'}; $pkg->{'obsoletes'} = join(' ', @{$pkg->{'obsoletes'}}) if $pkg->{'obsoletes'}; $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; } ### main my $opt_zypp; my $cachedir = "/var/cache/build"; GetOptions ("zypp=s" => \$opt_zypp, "cachedir=s" => \$cachedir) or exit(1); for my $url (@ARGV) { my $dir = $opt_zypp ? $opt_zypp : $url; $dir .= '/' unless $dir =~ /\/$/; $url .= '/' unless $url =~ /\/$/; # XXX: use descrdir from content file my $packages = $dir.'suse/setup/descr/packages'; my @order = (); my $pkgs = Build::Susetags::parse($packages, { 'Loc' => 'location', 'Prv' => 'provides', 'Req' => 'requires', 'Con' => 'conflicts', 'Obs' => 'obsoletes', 'Tim' => 'buildtime' }, { cb => \&callback, data => $url }); }