source: server/trunk/web/lib/Sophie/Controller/Analysis.pm @ 388

Last change on this file since 388 was 315, checked in by nanardon, 13 years ago
  • oops
  • Property svn:keywords set to lib/Sophie/Base/Result/UsersDeps.pm
File size: 6.4 KB
Line 
1package Sophie::Controller::Analysis;
2use Moose;
3use namespace::autoclean;
4
5BEGIN {extends 'Catalyst::Controller'; }
6
7=head1 NAME
8
9Sophie::Controller::Analysis - Catalyst Controller
10
11=head1 DESCRIPTION
12
13Catalyst Controller.
14
15=head1 METHODS
16
17=cut
18
19
20=head2 index
21
22=cut
23
24sub index :Path :Args(0) {
25    my ( $self, $c ) = @_;
26
27    if (my $upload = $c->req->upload('file')) {
28        if ($upload->size < 5 * 1024 * 1024) { # 5Mo
29            $c->forward('/user/folder/load_rpm', [ $upload->slurp ]);
30        }
31    }
32    $c->forward('analyse_folder');
33}
34
35sub analyse_folder : Local {
36    my ($self, $c) = @_;
37
38    $c->session->{analyse_dist} = {
39        distribution => $c->req->param('distribution') || undef,
40        release => $c->req->param('release') || undef,
41        arch => $c->req->param('arch') || undef,
42    };
43
44}
45
46sub required_by :Local {
47    my ($self, $c, $id) = @_;
48    $id ||= $c->req->param('id');
49
50    my @deplist;
51    foreach my $dep ($c->model('Base::UsersDeps')->search(
52        {
53            pid => [ $id ],
54            deptype => 'R',
55        },
56        {
57            select => [ 'rpmsenseflag("flags")',
58                qw(depname flags evr deptype) ],
59            as => [ qw'sense depname flags evr deptype' ],
60        }
61        )->all) {
62        $dep->get_column('depname') =~ /^rpmlib\(/ and next;
63        push(@deplist, [
64                $dep->get_column('depname'),
65                $dep->get_column('sense'),
66                $dep->get_column('evr') ]);
67    }
68
69    my @folderid = map { $_->{id} } @{ $c->forward('/user/folder/list') };
70   
71    $c->stash->{xmlrpc} = $c->forward(
72        '/analysis/solver/find_requirements',
73        [ $c->session->{analyse_dist}, \@deplist, \@folderid ]
74    );
75}
76
77sub find_requirements : XMLRPC {
78    my ($self, $c, $distspec, $id, $pool) = @_;
79
80    $pool ||= $id;
81    my @deplist;
82    foreach my $dep ($c->model('Base::UsersDeps')->search(
83        {
84            pid => [ $id ],
85            deptype => 'R',
86        },
87        {
88            select => [ 'rpmsenseflag("flags")',
89                qw(depname flags evr deptype) ],
90            as => [ qw'sense depname flags evr deptype' ],
91        }
92        )->all) {
93        $dep->get_column('depname') =~ /^rpmlib\(/ and next;
94        push(@deplist, [
95                $dep->get_column('depname'),
96                $dep->get_column('sense'),
97                $dep->get_column('evr') ]);
98    }
99
100    $c->forward('/analysis/solver/find_requirements',
101        [ $distspec, \@deplist, $pool ]);
102}
103
104sub find_obsoletes : XMLRPC {
105    my ($self, $c, $distspec, $id, $pool) = @_;
106    $pool ||= $id;
107    my @deplist;
108    foreach my $dep ($c->model('Base::UsersDeps')->search(
109        {
110            pid => [ $id ],
111            deptype => 'O',
112        },
113        {
114            select => [ 'rpmsenseflag("flags")',
115                qw(depname flags evr deptype) ],
116            as => [ qw'sense depname flags evr deptype' ],
117        }
118        )->all) {
119        $dep->get_column('depname') =~ /^rpmlib\(/ and next;
120        push(@deplist, [
121                $dep->get_column('depname'),
122                $dep->get_column('sense'),
123                $dep->get_column('evr') ]);
124    }
125    $c->forward('/analysis/solver/find_obsoletes',
126        [ $distspec, \@deplist, $pool ]);
127}
128
129sub find_conflicts : XMLRPC {
130    my ($self, $c, $distspec, $id, $pool) = @_;
131    $pool ||= $id;
132    my @provides;
133    foreach my $dep ($c->model('Base::UsersDeps')->search(
134        {
135            pid => [ $id ],
136            deptype => 'C',
137        },
138        {
139            select => [ 'rpmsenseflag("flags")',
140                qw(depname flags evr deptype) ],
141            as => [ qw'sense depname flags evr deptype' ],
142        }
143        )->all) {
144        $dep->get_column('depname') =~ /^rpmlib\(/ and next;
145        push(@provides, [
146                $dep->get_column('depname'),
147                $dep->get_column('sense'),
148                $dep->get_column('evr') ]);
149    }
150    my @conflicts;
151    foreach my $dep ($c->model('Base::UsersDeps')->search(
152        {
153            pid => [ $id ],
154            deptype => 'C',
155        },
156        {
157            select => [ 'rpmsenseflag("flags")',
158                qw(depname flags evr deptype) ],
159            as => [ qw'sense depname flags evr deptype' ],
160        }
161        )->all) {
162        $dep->get_column('depname') =~ /^rpmlib\(/ and next;
163        push(@conflicts, [
164                $dep->get_column('depname'),
165                $dep->get_column('sense'),
166                $dep->get_column('evr') ]);
167    }
168
169    $c->forward('/analysis/solver/find_conflicts',
170        [ $distspec, \@conflicts, \@provides, $pool ]);
171}
172
173sub find_updates : XMLRPC {
174    my ($self, $c, $distspec, $id, $pool) = @_;
175    my $pkg = $c->model('Base::UsersRpms')->find(
176        { id => $id }
177    );
178    $distspec->{src} = $pkg->issrc ? 1 : 0;
179
180    $c->forward('/analysis/solver/find_updates',
181        [ $distspec, [ $pkg->name, '<', $pkg->evr ], $pool ]
182    );
183}
184
185sub is_obsoleted : XMLRPC {
186    my ($self, $c, $distspec, $id, $pool) = @_;
187   
188    my $pkg = $c->model('Base::UsersRpms')->find(
189        { id => $id }
190    );
191
192    $c->forward('/analysis/solver/is_obsoleted',
193        [ $distspec, [ [ $pkg->name, '=', $pkg->evr ] ], $pool ]
194    );
195}
196
197sub is_updated : XMLRPC {
198    my ($self, $c, $distspec, $id, $pool) = @_;
199    my $pkg = $c->model('Base::UsersRpms')->find(
200        { id => $id }
201    );
202    $distspec->{src} = $pkg->issrc ? 1 : 0;
203
204    $c->forward('/analysis/solver/is_updated',
205        [ $distspec, [ $pkg->name, '>=', $pkg->evr ], $pool ]
206    );
207}
208
209sub files_conflicts : XMLRPC {
210    my ($self, $c, $distspec, $id, $pool) = @_;
211    my @files = 
212        map { { $_->get_columns } } 
213        grep { $_->dirname }
214        $c->model('Base::UsersFiles')->search(
215            { pid => $id }
216    );
217
218    $c->forward('/analysis/solver/files_conflicts',
219        [ $distspec, \@files, $pool ]
220    );
221}
222
223sub parentdir : XMLRPC {
224    my ($self, $c, $distspec, $id, $pool) = @_;
225    $pool ||= $id;
226
227    my @dir = grep { $_ } $c->model('Base::UsersFiles')->search(
228            {
229                pid => [ $id ],
230            },
231            {
232                select   => [ qw(dirname) ],
233                group_by => [ qw(dirname) ],
234                order_by => [ qw(dirname) ],
235            }
236    )->get_column('dirname')->all;
237
238    $c->forward('/analysis/solver/parentdir', [ $distspec, \@dir, $pool ]);
239}
240
241=head1 AUTHOR
242
243Olivier Thauvin
244
245=head1 LICENSE
246
247This library is free software. You can redistribute it and/or modify
248it under the same terms as Perl itself.
249
250=cut
251
252__PACKAGE__->meta->make_immutable;
253
2541;
Note: See TracBrowser for help on using the repository browser.