File opensuse.patch of Package whohas
diff -Naur whohas-0.29.orig/program/whohas whohas-0.29/program/whohas
--- whohas-0.29.orig/program/whohas 2012-11-15 21:10:27.986182597 +0200
+++ whohas-0.29/program/whohas 2012-11-15 21:08:03.244036474 +0200
@@ -1221,6 +1221,7 @@
my $major = $opensuse_major;
my $minor = $opensuse_minor;
my $opensusebase = "http://software.opensuse.org";
+ my @allnames;
my @names;
my @repos;
my @groups;
@@ -1229,39 +1230,46 @@
my @sizes;
my @dates;
my $distroname = "openSUSE";
-
- my @lines = split /\n/, &fetchdoc($opensusebase."/search?q=".$_[0]."&baseproject=".$distroname."%3A".$release_string."&lang=en&exclude_debug=true");
- my $continuity = 2;
+ my @lines = split /\n/, &fetchdoc($opensusebase."/search?q=".$_[0]."&search_devel=false&search_unsupported=false&baseproject=ALL");
for (my $i = 0; $i < @lines; $i++) {
- if ($lines[$i] =~ /div class="search_o_title"/) {
- push @names, (split /<\/?h3>/, $lines[($i+2)])[1];
- for (my $a = $i+1; $a < $i + 20; $a++) {
- if ($lines[$a] =~ /<h4><a class="blue_over" href=/) {
- my @temps = split /\"\>|\<\/a\>/, $lines[$a];
- $temps[1] =~ s/\/openSUSE_$major\.$minor$//;
- $temps[1] =~ s/^openSUSE\:$major\.$minor\///;
- $temps[1] =~ s/\/$major\.$minor$//;
- $temps[1] =~ s/^home/\~/;
- push @repos, $temps[1];
- last;
+ # If the page contains "pkg-description" then there was only one search result and we got redirected to
+ # http://software.opensuse.org/package/$pkgname?search_term=$pkgname
+ if ($lines[$i] =~ /div id="pkg-description"/) {
+ @allnames = $_[0];
+ last;
+ }
+ # If there are multiple results then the page contains "search-result-txt" followed by the package name
+ if ($lines[$i] =~ /div class="search-result-txt"/) {
+ push @allnames, (split /href="\/package\/|"/, $lines[($i+1)])[1];
+ }
+ }
+ for (my $i = 0; $i < @allnames; $i++) {
+ # For every package the information is in
+ # http://software.opensuse.org/package/$pkgname
+ my @lines = split /\n/, &fetchdoc($opensusebase."/package/".$allnames[$i]."");
+ for (my $i = 0; $i < @lines; $i++) {
+ # Only show openSUSE official packages (otherwise there will be a lot of results)
+ if (($lines[$i] =~ /openSUSE.*official release/) || ($lines[$i] =~ /openSUSE.*official update/)) {
+ # Some times the url does not point to the respective package's project page but to the respective openSUSE version project page
+ # Difficult to fix because pkgname can be part of another package (e.g. kmail is part of kdepim4)
+ push @urls, (split /href="|"/, $lines[($i)])[1];
+ for (my $a = $i; $a < $i + 75; $a++) {
+ if ($lines[$a] =~ /ul class="pkg-typ-options"/) {
+ push @versions, (split /<\/?li>/, $lines[($a+1)])[1];
+ last;
+ }
}
- }
- for (my $a = $i + 10; $a < $i + 50; $a++) {
- if ($lines[$a] =~ /a style="margin-right: 2em" href/) {
- my @parts = split /\"\>|\<\/a\>/, $lines[$a];
- my @segments = split /\-/, $parts[1];
- push @versions, $segments[(@segments-2)];
- last;
+ for (my $a = $i; $a < $i + 75; $a++) {
+ if ($lines[$a] =~ /a class="pkg-options-one-click"/) {
+ push @repos, (split /href="\/ymp\/|\//, $lines[($a)])[1];
+ push @names, (split /query=|">/, $lines[($a)])[1];
+ last;
+ }
}
+ push @sizes, '';
+ push @dates, '';
+ push @groups, '';
}
- push @urls, '';
- push @sizes, '';
- push @dates, '';
- push @groups, '';
- }
- if ($lines[$i] =~ /type:'post', url:'\/search\/search.*'\}\); return false;">$continuity<\/a>/) {
- push @lines, split /\n/, &fetchdoc($opensusebase."?q=".$_[0]."&baseproject=openSUSE:".$release_string.'&p='.$continuity);
- $continuity++;
}
}
for (my $i = 0; $i < @repos; $i++) {