summaryrefslogtreecommitdiff
path: root/Build/Mdkrepo.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Build/Mdkrepo.pm')
-rw-r--r--Build/Mdkrepo.pm121
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;
+