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