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

Last change on this file since 94 was 94, checked in by nanardon, 14 years ago
  • improve search results view
File size: 8.5 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    $info{src} = $rpm->issrc ? 1 : 0;
82    $info{evr} = $rpm->evr;
83
84    return $c->stash->{xmlrpc} = \%info;
85}
86
87
88sub deps : XMLRPCLocal {
89    my ($self, $c, $pkgid, $deptype) = @_;
90
91    @{ $c->stash->{xmlrpc}{deps}{$deptype} } = 
92        map { 
93            { 
94                name => $_->get_column('depname'),
95                flags => $_->get_column('flags'),
96                evr => $_->get_column('evr'),
97                sense => $_->get_column('sense'),
98            }
99        } 
100        $c->model('Base')->resultset('Deps')->search(
101            { 
102                pkgid => $pkgid,
103                deptype => $deptype,
104            },
105            { 
106                order_by => [ 'count' ],
107                select => [ 'rpmsenseflag("flags")', qw(depname flags evr) ],
108                as => [ qw'sense depname flags evr' ],
109
110            },
111        )->all;
112}
113
114=head2 rpms.location (PKGID)
115
116Return all distribution where the package having C<PKGID> can be found.
117
118=cut
119
120sub location : XMLRPCLocal {
121    my ($self, $c, $pkgid) = @_;
122
123    $c->stash->{xmlrpc} = [
124        map {
125        {
126            distribution => $_->get_column('name'),
127            release => $_->get_column('version'),
128            arch => $_->get_column('arch'), 
129            media => $_->get_column('label'),
130            media_group => $_->get_column('group_label'),
131        }
132        }
133        $c->forward('/distrib/distrib_rs', [ {} ])
134         ->search_related('MediasPaths')
135                 ->search_related('Paths')
136        ->search_related('Rpmfiles',
137            { pkgid => $pkgid },
138            {
139                select => [ qw(name version arch label group_label) ],
140            }
141        )->all ]
142
143
144}
145
146sub rpms_ :PathPrefix :Chained :CaptureArgs(1) {
147    my ( $self, $c, $pkgid ) = @_;
148    $c->stash->{pkgid} = $pkgid if($pkgid);
149    {
150        my $match = $c->stash->{pkgid};
151    }
152    #$c->model('Base')->resultset('Rpms')->search(pkgid => $pkgid)->next;
153    $c->stash->{rpms}{info} =
154        $c->forward('info', [ $c->stash->{pkgid} ]);
155    $c->stash->{rpms}{location} =
156        $c->forward('location', [ $c->stash->{pkgid} ]);
157}
158
159sub rpms : Private {
160    my ( $self, $c, $pkgid, $subpart, @args) = @_;
161    $c->stash->{rpmurl} = $c->req->path;
162    # Because $c->forward don't take into account Chained sub
163    $c->forward('rpms_', [ $pkgid ]);
164    for ($subpart || '') {
165        /^deps$/      and $c->go('alldeps',   [ $pkgid, @args ]);
166        /^files$/     and $c->go('files',     [ $pkgid, @args ]);
167        /^changelog$/ and $c->go('changelog', [ $pkgid, @args ]);
168    }
169
170    return $c->stash->{xmlrpc} = $c->stash->{rpms};
171}
172
173sub rpms__ : Chained('/rpms/rpms_') :PathPart('') :Args(0) :XMLRPCLocal {
174    my ( $self, $c ) = @_;
175
176    $c->go('rpms', [ $c->stash->{pkgid} ]);
177}
178
179
180sub alldeps :Chained('rpms_') :PathPart('deps') :Args(0) :XMLRPCLocal {
181    my ( $self, $c, $pkgid ) = @_;
182    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
183    $pkgid ||= $c->stash->{pkgid};
184
185    my %deps;
186    foreach (
187        $c->model('Base')->resultset('Deps')->search(
188            { 
189                pkgid => $pkgid,
190            },
191            { 
192                order_by => [ 'count' ],
193                select => [ 'rpmsenseflag("flags")',
194                    qw(depname flags evr deptype) ],
195                as => [ qw'sense depname flags evr deptype' ],
196
197            },
198        )->all) {
199        push( @{ $deps{$_->get_column('deptype')} },
200            {
201                name => $_->get_column('depname'),
202                flags => $_->get_column('flags'),
203                evr => $_->get_column('evr'),
204                sense => $_->get_column('sense'),
205            }
206        );
207    }
208    $c->stash->{xmlrpc} = \%deps;
209}
210
211sub files :Chained('rpms_') :PathPart('files') :Args(0) :XMLRPCLocal {
212    my ( $self, $c, $pkgid, $number ) = @_;
213    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
214    $pkgid ||= $c->stash->{pkgid};
215
216    if ($number) { # This come from a forward
217        $c->go('files_contents', [ $number ]);
218    }
219
220    my @col = qw(dirname basename md5 size count);
221    $c->stash->{xmlrpc} = [ map {
222        {
223            filename => $_->get_column('dirname') . $_->get_column('basename'),
224            dirname => $_->get_column('dirname'),
225            basename => $_->get_column('basename'),
226            md5 => $_->get_column('md5'),
227            perm => $_->get_column('perm'),
228            size => $_->get_column('size'),
229            user => $_->get_column('user'),
230            group => $_->get_column('group'),
231            has_content => $_->get_column('has_content'),
232            count => $_->get_column('count'),
233        }
234    } $c->model('Base')->resultset('Files')->search(
235            { 
236                pkgid => $pkgid,
237            },
238            { 
239                'select' => [ 'contents is NOT NULL as has_content', 'rpmfilesmode(mode) as perm', @col, '"group"',
240                    '"user"' ],
241                as => [ qw(has_content perm), @col, 'group', 'user' ],
242                order_by => [ 'dirname', 'basename' ],
243
244            },
245        )->all ];
246}
247
248sub files_contents :Chained('rpms_') :PathPart('files') :Args(1) {
249    my ( $self, $c, $number ) = @_;
250    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+/[^/]+:)[0];
251    my $pkgid = $c->stash->{pkgid};
252
253    $c->stash->{xmlrpc} = $c->model('Base')->resultset('Files')->search(
254        {
255            pkgid => $pkgid,
256            count => $number,
257        },
258        {
259            select => ['contents'],
260        }
261    )->get_column('contents')->first;
262}
263
264sub changelog :Chained('rpms_') :PathPart('changelog') :Args(0) {
265    my ( $self, $c, $pkgid ) = @_;
266    $pkgid ||= $c->stash->{pkgid};
267    $c->stash->{rpmurl} = ($c->req->path =~ m:(.*)/[^/]+:)[0];
268
269    my @ch;
270    foreach ($c->model('Base')->resultset('RpmsChangelog')->search({},
271            { 
272                bind => [ $pkgid ],
273                order_by => [ 'time::int desc' ],
274            },
275        )->all) {
276        my $chentry;
277        my $enc = guess_encoding($_->get_column('text'), qw/latin1/);
278        $chentry->{text} = $enc && ref $enc
279            ? encode('utf8', $_->get_column('text'))
280            : $_->get_column('text');
281        $enc = guess_encoding($_->get_column('name'), qw/latin1/);
282        $chentry->{name} = $enc && ref $enc
283            ? encode('utf8', $_->get_column('name'))
284            : $_->get_column('name');
285        $chentry->{time} = $_->get_column('time');
286        $chentry->{date} = POSIX::strftime('%a %b %e %Y', gmtime($_->get_column('time')));
287        push(@ch, $chentry);
288    }
289
290    $c->stash->{xmlrpc} = \@ch;
291}
292
293=head1 AUTHOR
294
295Olivier Thauvin
296
297=head1 LICENSE
298
299This library is free software. You can redistribute it and/or modify
300it under the same terms as Perl itself.
301
302=cut
303
304__PACKAGE__->meta->make_immutable;
305
3061;
Note: See TracBrowser for help on using the repository browser.