aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Youri/Submit/Action/RSS.pm
blob: 11fb5b52843f3dced2272d9cdd8a79098cf133cb (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# $Id: RSS.pm 1689 2007-06-28 22:44:24Z guillomovitch $
package Youri::Submit::Action::RSS;

=head1 NAME

Youri::Submit::Action::RSS - RSS notification

=head1 DESCRIPTION

This action ensures RSS notification of new package revisions. It assumes given package set is canonical, with source package first.

=cut

use warnings;
use strict;
use XML::RSS;
use Encode qw/from_to/;
use Carp;
use base qw/Youri::Submit::Step/;

sub _init {
    my $self   = shift;
    my %options = (
        file        => '',
        title       => '',
        link        => '',
        description => '',
        charset    => 'iso-8859-1',
        max_items   => 10,
        @_
    );

    croak "undefined rss file" unless $options{file};
    croak "invalid charset $options{charset}"
        unless Encode::resolve_alias($options{charset});

    $self->{_file}        = $options{file};
    $self->{_title}       = $options{title};
    $self->{_link}        = $options{link};
    $self->{_description} = $options{description};
    $self->{_charset}    = $options{charset};
    $self->{_max_items}   = $options{max_items};
}

sub process_packages {
    my ($self, $packages, $repository, $target, $context) = @_;
    croak "Not a class method" unless ref $self;

    my $package = $packages->[0];

    my $subject = $package->as_formated_string('%{name}-%{version}-%{release}');
    my $content = $package->as_formated_string(<<EOF);
Name        : %-27{NAME}  Relocations: %|PREFIXES?{[%{PREFIXES} ]}:{(not relocatable)}|
Version     : %-27{VERSION}       Vendor: %{VENDOR}
Release     : %-27{RELEASE}   Build Date: %{BUILDTIME:date}
Install Date: %|INSTALLTIME?{%-27{INSTALLTIME:date}}:{(not installed)         }|      Build Host: %{BUILDHOST}
Group       : %-27{GROUP}   Source RPM: %{SOURCERPM}
Size        : %-27{SIZE}%|LICENSE?{      License: %{LICENSE}}|
Signature   : %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|
%|PACKAGER?{Packager    : %{PACKAGER}\n}|%|URL?{URL         : %{URL}\n}|Summary     : %{SUMMARY}
Description :\n%{DESCRIPTION}
EOF

    $content =~ s/$/<br\/>/mg;

    # ensure proper codeset conversion
    # for informations coming from package
    my $charset = $repository->get_package_charset();
    from_to($content, $charset, $self->{_charset});
    from_to($subject, $charset, $self->{_charset});

    my $rss = XML::RSS->new(
        encoding      => $self->{_charset},
        encode_output => 1
    );

    my $file = $self->{_file};
    if (-e $file) {
        eval {
            $rss->parsefile($file);
        };
        if ($@) {
            croak "Unable to parse RSS file $file: $@";
        }
        splice(@{$rss->{items}}, $self->{_max_items})
            if @{$rss->{items}} >= $self->{_max_items};
    } else {
        $rss->channel(
            title       => $self->{_title},
            link        => $self->{_link},
            description => $self->{_description},
            language    => 'en'
        );
    }

    $rss->add_item(
        title       => $subject,
        description => $content,
        mode        => 'insert'
    );

    if ($self->{_test}) {
        print $rss->as_string();
    } else {
        $rss->save($file);
    }
}

=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;