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

Last change on this file since 422 was 347, checked in by nanardon, 13 years ago
  • fix argument parsing
File size: 7.3 KB
Line 
1package Sophie::Controller::Analysis::Solver;
2use Moose;
3use namespace::autoclean;
4
5BEGIN {extends 'Catalyst::Controller'; }
6
7=head1 NAME
8
9Sophie::Controller::Analysis::Solver - 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    $c->response->body('Matched Sophie::Controller::Analysis::Solver in Analysis::Solver.');
28}
29
30sub solve_dependencies : Private {
31    my ($self, $c, $searchspec, $over, $deplist, $pool) = @_;
32
33    $searchspec->{nopager} = 1;
34    $searchspec->{rows} = 10;
35    my %need_pkgid;
36    my %need_pool;
37    my %bydep;
38    my @unresolved;
39    foreach my $dep (@{ $deplist || []}) {
40        my ($depname, $sense, $evr) = ref $dep
41            ? @$dep
42            : split(/\s+/, $dep);
43        $sense ||= '';
44        $evr ||= '';
45
46        $depname =~ /^rpmlib\(/ and next;
47        my $depdisplay = $depname . ($sense ? " $sense $evr" : '');
48        $bydep{$depdisplay} and next; # same already searched
49        $bydep{$depdisplay} = {};
50        my $found = 0;
51        if ($depname =~ /^\//) {
52            my $res = $c->forward('/search/rpm/byfile', [ $searchspec, $depname, ]);
53            if (@{$res}) {
54                $found = 1;
55                foreach (@{$res}) {
56                    $need_pkgid{$_} = 1;
57                    $bydep{$depdisplay}{pkg}{$_} = 1;
58                }
59            } 
60            if ($pool) {
61                $res = $c->forward('/user/folder/byfile', [ $pool, $depname, ]);
62                if (@{$res}) {
63                    $found = 1;
64                    foreach (@{$res}) {
65                        $need_pool{$_} = 1;
66                        $bydep{$depdisplay}{pool}{$_} = 1;
67
68                    }
69                }
70            }
71        } else {
72            my $res = $c->forward('/search/rpm/bydep', [ $searchspec, $over,
73                    $depname,
74                    $sense,
75                    $evr ]);
76            if (@{$res}) {
77                $found = 1;
78                foreach (@{$res}) {
79                    $need_pkgid{$_} = 1;
80                    $bydep{$depdisplay}{pkg}{$_} = 1;
81                }
82            } 
83            if ($pool) {
84                $res = $c->forward('/user/folder/bydep', [ $pool, $over,
85                        $depname,
86                        $sense,
87                        $evr ]
88                );
89                if (@{$res}) {
90                    $found = 1;
91                    foreach (@{$res}) {
92                        $need_pool{$_} = 1;
93                        $bydep{$depdisplay}{pool}{$_} = 1;
94                    }
95                }
96            }
97        }
98        if (!$found) {
99            push(@unresolved,
100                $depname . (
101                    $sense
102                    ? sprintf(' %s %s', $sense, $evr)
103                    : ''
104                )
105            );
106        }
107    }
108
109    foreach my $d (keys %bydep) {
110        foreach my $t (keys %{ $bydep{$d} || {} }) {
111            $bydep{$d}{$t} = [ keys %{ $bydep{$d}{$t} } ];
112        }
113    }
114
115
116    return $c->stash->{xmlrpc} = {
117        unresolved => \@unresolved,
118        pkg => [ keys %need_pkgid ],
119        pool => [ keys %need_pool ],
120        bydep => \%bydep,
121    };
122}
123
124sub solve_name : Private {
125    my ($self, $c, $searchspec, $deplist, $pool) = @_;
126    my %need_pkgid;
127    my %need_pool;
128    my %bydep;
129    my @unresolved;
130    foreach my $dep (@{$deplist || []}) {
131        my ($depname, $sense, $evr) = ref $dep
132            ? @$dep
133            : split(/\s+/, $dep);
134        $sense ||= '';
135        $evr ||= '';
136        my $depdisplay = $depname . ($sense ? " $sense $evr" : '');
137        my $found = 0;
138
139        my $res = $c->forward('/search/rpm/byname', [ $searchspec, $depname,
140                $sense, $evr ]);
141        foreach (@{ $res }) {
142            $found = 1;
143            $need_pkgid{$_} = 1;
144            $bydep{$depdisplay}{pkg}{$_} = 1;
145        }
146
147        if (!$found) {
148            push(@unresolved, $depdisplay);
149        }
150    }
151    foreach my $d (keys %bydep) {
152        foreach my $t (keys %{ $bydep{$d} || {} }) {
153            $bydep{$d}{$t} = [ keys %{ $bydep{$d}{$t} } ];
154        }
155    }
156    $c->stash->{xmlrpc} = {
157        unresolved => \@unresolved,
158        pkg => [ keys %need_pkgid ],
159        pool => [ keys %need_pool ],
160        bydep => \%bydep,
161    }
162}
163
164sub find_requirements : Private {
165    my ($self, $c, $searchspec, $deplist, $pool) = @_;
166    $c->forward('solve_dependencies', [ $searchspec, 'P', $deplist, $pool ]);
167}
168
169sub find_conflicts : Private {
170    my ($self, $c, $searchspec, $conflicts, $provides, $pool) = @_;
171    my $resp = $c->forward('solve_dependencies', [ $searchspec, 'P', $conflicts, $pool ]);
172    my $resc = $c->forward('solve_dependencies', [ $searchspec, 'C', $provides,  $pool ]);
173    $c->stash->{xmlrpc} = {
174        pkg => [ @{ $resp->{pkg} }, @{ $resc->{pkg} } ],
175        pool => [ @{ $resp->{pool} }, @{ $resc->{pool} } ],
176    }
177}
178
179sub is_obsoleted : Private {
180    my ($self, $c, $searchspec, $deplist, $pool) = @_;
181    $c->forward('solve_dependencies', [ $searchspec, 'O', $deplist, $pool ]);
182}
183
184sub is_updated : Private {
185    my ($self, $c, $searchspec, $deplist, $pool) = @_;
186    $c->forward('solve_name', [ $searchspec, [ $deplist ] ], $pool);
187}
188
189sub find_obsoletes : Private {
190    my ($self, $c, $searchspec, $deplist, $pool) = @_;
191    $c->forward('solve_name', [ $searchspec,  $deplist ], $pool);
192}
193
194sub files_conflicts : Private {
195    my ($self, $c, $searchspec, $files, $pool) = @_;
196
197    my %fc;
198    my %pkgid;
199    foreach my $file (@{ $files || []}) {
200        my $res = $c->forward('/search/file/byname',
201            [ $searchspec,  $file->{dirname} . $file->{basename} ]);
202        foreach (@{ $res }) {
203            if (($_->{md5} || '') eq ($file->{md5} || '')) {
204                next;
205            }
206            push(@{ $fc{$file->{dirname} . $file->{basename}}}, $_->{pkgid});
207            $pkgid{$_->{pkgid}} = 1;
208        }
209    }
210    $c->stash->{xmlrpc} = {
211        pkg => [ keys %pkgid ],
212        byfile => \%fc,
213    }
214}
215
216sub parentdir : Private {
217    my ($self, $c, $searchspec, $folder, $pool) = @_;
218
219    my %need_pool;
220    my %need_pkgid;
221    my %bydir;
222    my @notfound;
223    foreach my $dir (grep { $_ } @{ $folder }) {
224        $dir =~ s:/$::;
225        my $found = 0;
226        my $res = $c->forward('/search/rpm/byfile', [ $searchspec, $dir, ]);
227        if (@{$res}) {
228            $found = 1;
229            foreach (@{$res}) {
230                $need_pkgid{$_} = 1;
231                $bydir{$dir}{pkg}{$_} = 1;
232            }
233        } 
234        if ($pool) {
235            $res = $c->forward('/user/folder/byfile', [ $pool, $dir, ]);
236            if (@{$res}) {
237                $found = 1;
238                foreach (@{$res}) {
239                    $need_pool{$_} = 1;
240                    $bydir{$dir}{pool}{$_} = 1;
241
242                }
243            }
244        }
245        push(@notfound, $dir) unless($found);
246    }
247    foreach my $d (keys %bydir) {
248        foreach my $t (keys %{ $bydir{$d} || {} }) {
249            $bydir{$d}{$t} = [ keys %{ $bydir{$d}{$t} } ];
250        }
251    }
252    return $c->stash->{xmlrpc} = {
253        notfound => \@notfound,
254        pkg => [ keys %need_pkgid ],
255        pool => [ keys %need_pool ],
256        bydir => \%bydir,
257    };
258}
259
260=head1 AUTHOR
261
262Olivier Thauvin
263
264=head1 LICENSE
265
266This library is free software. You can redistribute it and/or modify
267it under the same terms as Perl itself.
268
269=cut
270
271__PACKAGE__->meta->make_immutable;
272
2731;
274
Note: See TracBrowser for help on using the repository browser.