source: server/trunk/web/lib/Sophie/Controller/Rpms.pm @ 85

Last change on this file since 85 was 85, checked in by nanardon, 14 years ago
  • try to have rpm info in english
File size: 8.4 KB
Line 
1package Sophie::Controller::Rpms;
2use Moose;
3use namespace::autoclean;
4use Encode::Guess;
5use Encode;
6use POSIX;
7
8BEGIN {extends 'Catalyst::Controller'; }
9
10=head1 NAME
11
12Sophie::Controller::Rpms - Catalyst Controller
13
14=head1 DESCRIPTION
15
16Catalyst Controller.
17
18=head1 METHODS
19
20=cut
21
22
23=head2 index
24
25=cut
26
27sub index :Path :Args(0) {
28    my ( $self, $c ) = @_;
29
30    $c->response->body('Matched Sophie::Controller::Rpms in Rpms.');
31}
32
33sub queryformat : XMLRPCLocal {
34    my ( $self, $c, $pkgid, $qf ) = @_;
35    $c->stash->{xmlrpc} = $c->model('base')->resultset('Rpms')->search(
36        { pkgid => $pkgid },
37        { 
38            select => [ qq{rpmqueryformat("header", ?)} ],
39            as => [ 'qf' ],
40            bind => [ $qf ],
41        }
42    )->next->get_column('qf');
43}
44
45sub tag : XMLRPCLocal {
46    my ( $self, $c, $pkgid, $tag ) = @_;
47    $c->stash->{xmlrpc} = [ map { $_->get_column('tag') } $c->model('Base')->resultset('Rpms')->search(
48        { pkgid => $pkgid },
49        { 
50            select => [ qq{rpmquery("header", rpmtag(?))} ],
51            as => [ 'tag' ],
52            bind => [ $tag ], 
53        }
54    )->all ]
55}
56
57
58sub info : XMLRPCLocal {
59    my ($self, $c, $pkgid) = @_;
60
61    my %info = ( pkgid => $pkgid );
62    foreach (qw(name version release epoch url group size packager
63                url sourcerpm license buildhost
64                arch distribution)) {
65        if (my $r = $c->model('base')->resultset('Rpms')->search(
66            { pkgid => $pkgid },
67            { 
68                select => [ qq{rpmquery("header", ?)} ],
69                as => [ 'qf' ],
70                bind => [ $_ ],
71            }
72            )->next) { 
73            $info{$_} = $r->get_column('qf');
74        }
75    }
76    my $rpm = $c->model('base')->resultset('Rpms')->search(
77            { pkgid => $pkgid },
78        )->next;
79    $info{description} = $rpm->description;
80    $info{summary} = $rpm->summary;
81
82    return $c->stash->{xmlrpc} = \%info;
83}
84
85
86sub deps : XMLRPCLocal {
87    my ($self, $c, $pkgid, $deptype) = @_;
88
89    @{ $c->stash->{xmlrpc}{deps}{$deptype} } = 
90        map { 
91            { 
92                name => $_->get_column('depname'),
93                flags => $_->get_column('flags'),
94                evr => $_->get_column('evr'),
95                sense => $_->get_column('sense'),
96            }
97        } 
98        $c->model('Base')->resultset('Deps')->search(
99            { 
100                pkgid => $pkgid,
101                deptype => $deptype,
102            },
103            { 
104                order_by => [ 'count' ],
105                select => [ 'rpmsenseflag("flags")', qw(depname flags evr) ],
106                as => [ qw'sense depname flags evr' ],
107
108            },
109        )->all;
110}
111
112=head2 rpms.location (PKGID)
113
114Return all distribution where the package having C<PKGID> can be found.
115
116=cut
117
118sub location : XMLRPCLocal {
119    my ($self, $c, $pkgid) = @_;
120
121    $c->stash->{xmlrpc} = [
122        map {
123        {
124            distribution => $_->get_column('name'),
125            release => $_->get_column('version'),
126            arch => $_->get_column('arch'), 
127            media => $_->get_column('label'),
128            media_group => $_->get_column('group_label'),
129        }
130        }
131        $c->forward('/distrib/distrib_rs', [ {} ])
132         ->search_related('MediasPaths')
133                 ->search_related('Paths')
134        ->search_related('Rpmfiles',
135            { pkgid => $pkgid },
136            {
137                select => [ qw(name version arch label group_label) ],
138            }
139        )->all ]
140
141
142}
143
144sub rpms_ :PathPrefix :Chained :CaptureArgs(1) {
145    my ( $self, $c, $pkgid ) = @_;
146    $c->stash->{pkgid} = $pkgid if($pkgid);
147    {
148        my $match = $c->stash->{pkgid};
149    }
150    #$c->model('Base')->resultset('Rpms')->search(pkgid => $pkgid)->next;
151    $c->stash->{rpms}{info} =
152        $c->forward('info', [ $c->stash->{pkgid} ]);
153    $c->stash->{rpms}{location} =
154        $c->forward('location', [ $c->stash->{pkgid} ]);
155}
156
157sub rpms : Private {
158    my ( $self, $c, $pkgid, $subpart, @args) = @_;
159    $c->stash->{rpmurl} = $c->req->path;
160    # Because $c->forward don't take into account Chained sub
161    $c->forward('rpms_', [ $pkgid ]);
162    for ($subpart || '') {
163        /^deps$/      and $c->go('alldeps',   [ $pkgid, @args ]);
164        /^files$/     and $c->go('files',     [ $pkgid, @args ]);
165        /^changelog$/ and $c->go('changelog', [ $pkgid, @args ]);
166    }
167
168    return $c->stash->{xmlrpc} = $c->stash->{rpms};
169}
170
171sub rpms__ : Chained('/rpms/rpms_') :PathPart('') :Args(0) :XMLRPCLocal {
172    my ( $self, $c ) = @_;
173
174    $c->go('rpms', [ $c->stash->{pkgid} ]);
175}
176
177
178sub alldeps :Chained('rpms_') :PathPart('deps') :Args(0) :XMLRPCLocal {
179    my ( $self, $c, $pkgid ) = @_;
180    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
181    $pkgid ||= $c->stash->{pkgid};
182
183    my %deps;
184    foreach (
185        $c->model('Base')->resultset('Deps')->search(
186            { 
187                pkgid => $pkgid,
188            },
189            { 
190                order_by => [ 'count' ],
191                select => [ 'rpmsenseflag("flags")',
192                    qw(depname flags evr deptype) ],
193                as => [ qw'sense depname flags evr deptype' ],
194
195            },
196        )->all) {
197        push( @{ $deps{$_->get_column('deptype')} },
198            {
199                name => $_->get_column('depname'),
200                flags => $_->get_column('flags'),
201                evr => $_->get_column('evr'),
202                sense => $_->get_column('sense'),
203            }
204        );
205    }
206    $c->stash->{xmlrpc} = \%deps;
207}
208
209sub files :Chained('rpms_') :PathPart('files') :Args(0) :XMLRPCLocal {
210    my ( $self, $c, $pkgid, $number ) = @_;
211    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
212    $pkgid ||= $c->stash->{pkgid};
213
214    if ($number) { # This come from a forward
215        $c->go('files_contents', [ $number ]);
216    }
217
218    my @col = qw(dirname basename md5 size count);
219    $c->stash->{xmlrpc} = [ map {
220        {
221            filename => $_->get_column('dirname') . $_->get_column('basename'),
222            dirname => $_->get_column('dirname'),
223            basename => $_->get_column('basename'),
224            md5 => $_->get_column('md5'),
225            perm => $_->get_column('perm'),
226            size => $_->get_column('size'),
227            user => $_->get_column('user'),
228            group => $_->get_column('group'),
229            has_content => $_->get_column('has_content'),
230            count => $_->get_column('count'),
231        }
232    } $c->model('Base')->resultset('Files')->search(
233            { 
234                pkgid => $pkgid,
235            },
236            { 
237                'select' => [ 'contents is NOT NULL as has_content', 'rpmfilesmode(mode) as perm', @col, '"group"',
238                    '"user"' ],
239                as => [ qw(has_content perm), @col, 'group', 'user' ],
240                order_by => [ 'dirname', 'basename' ],
241
242            },
243        )->all ];
244}
245
246sub files_contents :Chained('rpms_') :PathPart('files') :Args(1) {
247    my ( $self, $c, $number ) = @_;
248    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+/[^/]+:)[0];
249    my $pkgid = $c->stash->{pkgid};
250
251    $c->stash->{xmlrpc} = $c->model('Base')->resultset('Files')->search(
252        {
253            pkgid => $pkgid,
254            count => $number,
255        },
256        {
257            select => ['contents'],
258        }
259    )->get_column('contents')->first;
260}
261
262sub changelog :Chained('rpms_') :PathPart('changelog') :Args(0) {
263    my ( $self, $c, $pkgid ) = @_;
264    $pkgid ||= $c->stash->{pkgid};
265    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
266
267    my @ch;
268    foreach ($c->model('Base')->resultset('RpmsChangelog')->search({},
269            { 
270                bind => [ $pkgid ],
271                order_by => [ 'time::int desc' ],
272            },
273        )->all) {
274        my $chentry;
275        my $enc = guess_encoding($_->get_column('text'), qw/latin1/);
276        $chentry->{text} = $enc && ref $enc
277            ? encode('utf8', $_->get_column('text'))
278            : $_->get_column('text');
279        $enc = guess_encoding($_->get_column('name'), qw/latin1/);
280        $chentry->{name} = $enc && ref $enc
281            ? encode('utf8', $_->get_column('name'))
282            : $_->get_column('name');
283        $chentry->{time} = $_->get_column('time');
284        $chentry->{date} = POSIX::strftime('%a %b %e %Y', gmtime($_->get_column('time')));
285        push(@ch, $chentry);
286    }
287
288    $c->stash->{xmlrpc} = \@ch;
289}
290
291=head1 AUTHOR
292
293Olivier Thauvin
294
295=head1 LICENSE
296
297This library is free software. You can redistribute it and/or modify
298it under the same terms as Perl itself.
299
300=cut
301
302__PACKAGE__->meta->make_immutable;
303
3041;
Note: See TracBrowser for help on using the repository browser.