auto commit
[opensuse:package-lists.git] / processdeps.pl
1 #! /usr/bin/perl
2
3 use Data::Dumper;
4 use XML::Simple;
5 use URI::Escape;
6
7 my $followup = 0;
8 my $cproblem = '';
9 my %problems;
10 my %subpackages;
11
12 my $project = $ARGV[0] || "openSUSE:Factory";
13
14 #system("osc api /build/openSUSE:Factory/standard/x86_64/_builddepinfo > /tmp/builddep");
15 my $xml = XMLin("/tmp/builddep", ForceArray => ['package', 'pkgdep', 'subpkg']);
16
17 for my $package (values %{$xml->{package}}) {
18   for my $sp (@{$package->{subpkg}}) {
19     $subpackages{$sp} = $package->{source};
20   }
21 }
22
23 while ( <STDIN> ) {
24   chomp;
25
26   if ( m/^can't install (.*)\-[^-]*\-[^-]*\.(i586|x86_64|noarch):/) {
27     $cproblem = $1;
28     $cproblem =~ s/kmp-([^-]*)/kmp-default/;
29     $cproblem = $subpackages{$cproblem} if (defined $subpackages{$cproblem});
30     $followup = 0;
31     next;
32   }
33
34   $followup = 1 if ($_ =~ m/none of the providers can be installed/);
35   
36   # not interesting for me
37   next if ( m/  \(we have /);
38   next if ($followup);
39
40   # very thin ice here
41   s,\(\)\(64bit\),,;
42
43   s,(needed by [^ ]*)\-[^-]*\-[^-]*\.(i586|x86_64|noarch)$,$1,;
44
45   $problems{$cproblem}->{$_} = 1;
46
47 }
48
49 my $api="/build/$project/_result?repository=standard";
50 for my $problem (sort keys %problems) {
51  $api = $api . "&package=" . uri_escape($problem);
52 }
53 open(RESULT, "osc api $api|");
54 @result = <RESULT>;
55 my $results = XMLin(join('', @result));
56 close(RESULT);
57 my %fails;
58
59 for my $result (@{$results->{result}}) {
60 for my $package (@{$result->{status}}) {
61   if ($package->{code} eq 'failed' || $package->{code} eq 'unresolvable' ) {
62      $fails{$package->{package}} = 1;
63   }
64 }
65 }
66
67 for my $problem (sort keys %problems) {
68   next if (defined $fails{$problem});
69   print "can't install $problem:\n";
70   my @lines = keys %{$problems{$problem}};
71   my $count = 0;
72   for my $line (sort @lines) {
73     print "$line\n";
74     $count = $count + 1;
75     if ($count > 3 && @lines > 6) {
76       print "... " . (int(@lines) - $count) . " more problems\n";
77       last;
78     }
79   }
80 }
81