diff options
Diffstat (limited to 'Build/Mdkrepo.pm')
-rw-r--r-- | Build/Mdkrepo.pm | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Build/Mdkrepo.pm b/Build/Mdkrepo.pm new file mode 100644 index 0000000..a478a8a --- /dev/null +++ b/Build/Mdkrepo.pm @@ -0,0 +1,121 @@ +################################################################ +# +# Copyright (c) 2015 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 +# +################################################################ + +package Build::Mdkrepo; + +use strict; +#use Data::Dumper; + +sub addpkg { + my ($res, $data, $options) = @_; + if ($options->{'addselfprovides'} && defined($data->{'name'}) && defined($data->{'version'})) { + if (($data->{'arch'} || '') ne 'src' && ($data->{'arch'} || '') ne 'nosrc') { + my $evr = $data->{'version'}; + $evr = "$data->{'epoch'}:$evr" if $data->{'epoch'}; + $evr = "$evr-$data->{'release'}" if defined $data->{'release'}; + my $s = "$data->{'name'} = $evr"; + push @{$data->{'provides'}}, $s unless grep {$_ eq $s} @{$data->{'provides'} || []}; + } + } + if (ref($res) eq 'CODE') { + $res->($data); + } else { + push @$res, $data; + } + +} + +sub parsedeps { + my ($d) = @_; + my @d = split('@', $d); + for (@d) { + s/\[\*\]//s; + s/\[(.*)\]$/ $1/s; + s/ == / = /; + } + return \@d; +} + +sub parse { + my ($in, $res, %options) = @_; + $res ||= []; + my $fd; + if (ref($in)) { + $fd = $in; + } else { + if ($in =~ /\.[gc]z$/) { + # we need to probe, as mageia uses xz for compression + open($fd, '<', $in) || die("$in: $!\n"); + my $probe; + sysread($fd, $probe, 5); + close($fd); + if ($probe && $probe eq "\xFD7zXZ") { + open($fd, '-|', "xzdec", "-dc", $in) || die("$in: $!\n"); + } else { + open($fd, '-|', "gzip", "-dc", $in) || die("$in: $!\n"); + } + } else { + open($fd, '<', $in) || die("$in: $!\n"); + } + } + my $s = {}; + while (<$fd>) { + chomp; + if (/^\@summary\@/) { + $s->{'summary'} = substr($_, 9); + } elsif (/^\@provides\@/) { + $s->{'provides'} = parsedeps(substr($_, 10)); + } elsif (/^\@requires\@/) { + $s->{'requires'} = parsedeps(substr($_, 10)); + } elsif (/^\@suggests\@/) { + $s->{'suggests'} = parsedeps(substr($_, 10)); + } elsif (/^\@recommends\@/) { + $s->{'recommends'} = parsedeps(substr($_, 12)); + } elsif (/^\@obsoletes\@/) { + $s->{'obsoletes'} = parsedeps(substr($_, 11)); + } elsif (/^\@conflicts\@/) { + $s->{'conflicts'} = parsedeps(substr($_, 11)); + } elsif (/^\@info\@/) { + $s ||= {}; + my @s = split('@', substr($_, 6)); + $s->{'location'} = "$s[0].rpm"; + my $arch; + if ($s[0] =~ /\.([^\.]+)$/) { + $arch = $1; + $s[0] =~ s/\.[^\.]+$//; + } + $s->{'epoch'} = $s[1] if $s[1]; + $s[0] =~ s/-\Q$s[4]\E[^-]*$//s if defined($s[4]) && $s[4] ne ''; # strip disttag + $s[0] .= ":$s[5]" if defined($s[5]) && $s[5] ne ''; # add distepoch + $s->{'arch'} = $arch || 'noarch'; + if ($s[0] =~ /^(.*)-([^-]+)-([^-]+)$/s) { + ($s->{'name'}, $s->{'version'}, $s->{'release'}) = ($1, $2, $3); + # fake source entry for now... + $s->{'source'} = $s->{'name'} if $s->{'arch'} ne 'src' && $s->{'arch'} ne 'nosrc'; + addpkg($res, $s, \%options); + } + $s = {}; + } + } + return $res; +} + +1; + |