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

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