aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Youri/Check/Input/Updates/Source/Sourceforge.pm
blob: 7623b3bfd5c82799709789a6ca9cd4f2e9622279 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# $Id: Sourceforge.pm 1179 2006-08-05 08:30:57Z warly $
package Youri::Check::Input::Updates::Source::Sourceforge;

=head1 NAME

Youri::Check::Input::Updates::Source::Sourceforge - Sourceforge updates source

=head1 DESCRIPTION

This source plugin for L<Youri::Check::Input::Updates> collects updates
available from Sourceforge.

=cut

use warnings;
use strict;
use Carp;
use LWP::UserAgent;
use HTML::TokeParser;
use Youri::Check::Input::Updates;
use base 'Youri::Check::Input::Updates::Source';

=head2 new(%args)

Creates and returns a new Youri::Check::Input::Updates::Source::Sourceforge
object.  

No specific parameters.

=cut

sub _init {
    my $self    = shift;
    my %options = (
        @_
    );

    $self->{_agent} = LWP::UserAgent->new();
}

sub get_version {
    my ($self, $package) = @_;
    croak "Not a class method" unless ref $self;

    my $name;
    if (ref $package && $package->isa('Youri::Package')) {
        # don't bother checking for packages without sf.net URL
        my $url = $package->get_url();
        if (
            $url =~ /http:\/\/(.*)\.sourceforge\.net/ ||
            $url =~ /http:\/\/.*sourceforge\.net\/projects\/([^\/]+)/
        ) {
            $name = $package->get_canonical_name();
        } else {
            return;
        }
    } else {
        $name = $package;
    }

    # translate in grabber namespace
    $name = $self->get_name($name);

    # return if aliased to null 
    return unless $name;

    my $response = $self->{_agent}->get($self->_url($name));
    if($response->is_success()) {
        my $max = 0;
        my $parser = HTML::TokeParser->new(\$response->content());
        while (my $token = $parser->get_tag('a')) {
            my $text = $parser->get_trimmed_text("/$token->[0]");
            next unless $text;
            next unless $text =~ /^
                \Q$name\E
                [._-]?($Youri::Check::Input::Updates::VERSION_REGEXP)
                [._-]?(w(?:in)?(?:32)?|mips|sparc|bin|ppc|i\d86|src|sources?)?
                \.(?:tar\.(?:gz|bz2)|tgz|zip)
                $/iox;
            my $version = $1;
            my $arch    = $2;
            next if $arch && $arch !~ /(src|sources?)/;
            $max = $version if Youri::Check::Input::Updates::is_newer($version, $max);
        }
        return $max if $max;
    }
    return;
}

sub _url {
    my ($self, $name) = @_;
    return "http://prdownloads.sourceforge.net/$name/";
}

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2002-2006, YOURI project

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut

1;