line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# Copyright © 1998 Richard Braakman |
2
|
|
|
|
|
|
|
# Copyright © 1999 Darren Benham |
3
|
|
|
|
|
|
|
# Copyright © 2000 Sean 'Shaleh' Perry |
4
|
|
|
|
|
|
|
# Copyright © 2004 Frank Lichtenheld |
5
|
|
|
|
|
|
|
# Copyright © 2006 Russ Allbery |
6
|
|
|
|
|
|
|
# Copyright © 2007-2009 Raphaël Hertzog |
7
|
|
|
|
|
|
|
# Copyright © 2008-2009,2012-2014 Guillem Jover |
8
|
|
|
|
|
|
|
# |
9
|
|
|
|
|
|
|
# This program is free software; you may redistribute it and/or modify |
10
|
|
|
|
|
|
|
# it under the terms of the GNU General Public License as published by |
11
|
|
|
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or |
12
|
|
|
|
|
|
|
# (at your option) any later version. |
13
|
|
|
|
|
|
|
# |
14
|
|
|
|
|
|
|
# This is distributed in the hope that it will be useful, |
15
|
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
16
|
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17
|
|
|
|
|
|
|
# GNU General Public License for more details. |
18
|
|
|
|
|
|
|
# |
19
|
|
|
|
|
|
|
# You should have received a copy of the GNU General Public License |
20
|
|
|
|
|
|
|
# along with this program. If not, see . |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
package Dpkg::Deps; |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=encoding utf8 |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head1 NAME |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
Dpkg::Deps - parse and manipulate dependencies of Debian packages |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 DESCRIPTION |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
The Dpkg::Deps module provides classes implementing various types of |
33
|
|
|
|
|
|
|
dependencies. |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
The most important function is deps_parse(), it turns a dependency line in |
36
|
|
|
|
|
|
|
a set of Dpkg::Deps::{Simple,AND,OR,Union} objects depending on the case. |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
=head1 FUNCTIONS |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
All the deps_* functions are exported by default. |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=over 4 |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=cut |
45
|
|
|
|
|
|
|
|
46
|
1
|
|
|
1
|
|
944
|
use strict; |
|
1
|
|
|
|
|
18
|
|
|
1
|
|
|
|
|
30
|
|
47
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
54
|
|
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
our $VERSION = '1.07'; |
50
|
|
|
|
|
|
|
our @EXPORT = qw( |
51
|
|
|
|
|
|
|
deps_concat |
52
|
|
|
|
|
|
|
deps_parse |
53
|
|
|
|
|
|
|
deps_eval_implication |
54
|
|
|
|
|
|
|
deps_iterate |
55
|
|
|
|
|
|
|
deps_compare |
56
|
|
|
|
|
|
|
); |
57
|
|
|
|
|
|
|
|
58
|
1
|
|
|
1
|
|
5
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
62
|
|
59
|
1
|
|
|
1
|
|
6
|
use Exporter qw(import); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
30
|
|
60
|
|
|
|
|
|
|
|
61
|
1
|
|
|
1
|
|
5
|
use Dpkg::Version; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
79
|
|
62
|
1
|
|
|
1
|
|
6
|
use Dpkg::Arch qw(get_host_arch get_build_arch debarch_to_debtuple); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
81
|
|
63
|
1
|
|
|
1
|
|
582
|
use Dpkg::BuildProfiles qw(get_build_profiles); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
53
|
|
64
|
1
|
|
|
1
|
|
8
|
use Dpkg::ErrorHandling; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
74
|
|
65
|
1
|
|
|
1
|
|
6
|
use Dpkg::Gettext; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
50
|
|
66
|
1
|
|
|
1
|
|
660
|
use Dpkg::Deps::Simple; |
|
1
|
|
|
|
|
5
|
|
|
1
|
|
|
|
|
31
|
|
67
|
1
|
|
|
1
|
|
632
|
use Dpkg::Deps::Union; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
31
|
|
68
|
1
|
|
|
1
|
|
590
|
use Dpkg::Deps::AND; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
32
|
|
69
|
1
|
|
|
1
|
|
572
|
use Dpkg::Deps::OR; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
32
|
|
70
|
1
|
|
|
1
|
|
653
|
use Dpkg::Deps::KnownFacts; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
1453
|
|
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=item deps_eval_implication($rel_p, $v_p, $rel_q, $v_q) |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
($rel_p, $v_p) and ($rel_q, $v_q) express two dependencies as (relation, |
75
|
|
|
|
|
|
|
version). The relation variable can have the following values that are |
76
|
|
|
|
|
|
|
exported by Dpkg::Version: REL_EQ, REL_LT, REL_LE, REL_GT, REL_GT. |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
This functions returns 1 if the "p" dependency implies the "q" |
79
|
|
|
|
|
|
|
dependency. It returns 0 if the "p" dependency implies that "q" is |
80
|
|
|
|
|
|
|
not satisfied. It returns undef when there's no implication. |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
The $v_p and $v_q parameter should be Dpkg::Version objects. |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=cut |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
sub deps_eval_implication { |
87
|
25
|
|
|
25
|
1
|
61
|
my ($rel_p, $v_p, $rel_q, $v_q) = @_; |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
# If versions are not valid, we can't decide of any implication |
90
|
25
|
50
|
33
|
|
|
91
|
return unless defined($v_p) and $v_p->is_valid(); |
91
|
25
|
50
|
33
|
|
|
89
|
return unless defined($v_q) and $v_q->is_valid(); |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
# q wants an exact version, so p must provide that exact version. p |
94
|
|
|
|
|
|
|
# disproves q if q's version is outside the range enforced by p. |
95
|
25
|
100
|
|
|
|
62
|
if ($rel_q eq REL_EQ) { |
96
|
3
|
100
|
|
|
|
18
|
if ($rel_p eq REL_LT) { |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
97
|
2
|
100
|
|
|
|
9
|
return ($v_p <= $v_q) ? 0 : undef; |
98
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_LE) { |
99
|
0
|
0
|
|
|
|
0
|
return ($v_p < $v_q) ? 0 : undef; |
100
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_GT) { |
101
|
1
|
50
|
|
|
|
3
|
return ($v_p >= $v_q) ? 0 : undef; |
102
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_GE) { |
103
|
0
|
0
|
|
|
|
0
|
return ($v_p > $v_q) ? 0 : undef; |
104
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_EQ) { |
105
|
0
|
|
|
|
|
0
|
return ($v_p == $v_q); |
106
|
|
|
|
|
|
|
} |
107
|
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
# A greater than clause may disprove a less than clause. An equal |
110
|
|
|
|
|
|
|
# cause might as well. Otherwise, if |
111
|
|
|
|
|
|
|
# p's clause is <<, <=, or =, the version must be <= q's to imply q. |
112
|
22
|
100
|
|
|
|
45
|
if ($rel_q eq REL_LE) { |
113
|
3
|
50
|
|
|
|
13
|
if ($rel_p eq REL_GT) { |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
114
|
0
|
0
|
|
|
|
0
|
return ($v_p >= $v_q) ? 0 : undef; |
115
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_GE) { |
116
|
1
|
50
|
|
|
|
4
|
return ($v_p > $v_q) ? 0 : undef; |
117
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_EQ) { |
118
|
0
|
0
|
|
|
|
0
|
return ($v_p <= $v_q) ? 1 : 0; |
119
|
|
|
|
|
|
|
} else { # <<, <= |
120
|
2
|
100
|
|
|
|
5
|
return ($v_p <= $v_q) ? 1 : undef; |
121
|
|
|
|
|
|
|
} |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
# Similar, but << is stronger than <= so p's version must be << q's |
125
|
|
|
|
|
|
|
# version if the p relation is <= or =. |
126
|
19
|
100
|
|
|
|
38
|
if ($rel_q eq REL_LT) { |
127
|
4
|
100
|
100
|
|
|
35
|
if ($rel_p eq REL_GT or $rel_p eq REL_GE) { |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
128
|
2
|
50
|
|
|
|
6
|
return ($v_p >= $v_p) ? 0 : undef; |
129
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_LT) { |
130
|
0
|
0
|
|
|
|
0
|
return ($v_p <= $v_q) ? 1 : undef; |
131
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_EQ) { |
132
|
2
|
100
|
|
|
|
9
|
return ($v_p < $v_q) ? 1 : 0; |
133
|
|
|
|
|
|
|
} else { # <<, <= |
134
|
0
|
0
|
|
|
|
0
|
return ($v_p < $v_q) ? 1 : undef; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
} |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
# Same logic as above, only inverted. |
139
|
15
|
100
|
|
|
|
28
|
if ($rel_q eq REL_GE) { |
140
|
10
|
50
|
|
|
|
32
|
if ($rel_p eq REL_LT) { |
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
141
|
0
|
0
|
|
|
|
0
|
return ($v_p <= $v_q) ? 0 : undef; |
142
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_LE) { |
143
|
2
|
50
|
|
|
|
5
|
return ($v_p < $v_q) ? 0 : undef; |
144
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_EQ) { |
145
|
0
|
0
|
|
|
|
0
|
return ($v_p >= $v_q) ? 1 : 0; |
146
|
|
|
|
|
|
|
} else { # >>, >= |
147
|
8
|
100
|
|
|
|
23
|
return ($v_p >= $v_q) ? 1 : undef; |
148
|
|
|
|
|
|
|
} |
149
|
|
|
|
|
|
|
} |
150
|
5
|
50
|
|
|
|
26
|
if ($rel_q eq REL_GT) { |
151
|
5
|
100
|
66
|
|
|
35
|
if ($rel_p eq REL_LT or $rel_p eq REL_LE) { |
|
|
50
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
152
|
1
|
50
|
|
|
|
4
|
return ($v_p <= $v_q) ? 0 : undef; |
153
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_GT) { |
154
|
0
|
0
|
|
|
|
0
|
return ($v_p >= $v_q) ? 1 : undef; |
155
|
|
|
|
|
|
|
} elsif ($rel_p eq REL_EQ) { |
156
|
1
|
50
|
|
|
|
3
|
return ($v_p > $v_q) ? 1 : 0; |
157
|
|
|
|
|
|
|
} else { |
158
|
3
|
50
|
|
|
|
12
|
return ($v_p > $v_q) ? 1 : undef; |
159
|
|
|
|
|
|
|
} |
160
|
|
|
|
|
|
|
} |
161
|
|
|
|
|
|
|
|
162
|
0
|
|
|
|
|
0
|
return; |
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=item $dep = deps_concat(@dep_list) |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
This function concatenates multiple dependency lines into a single line, |
168
|
|
|
|
|
|
|
joining them with ", " if appropriate, and always returning a valid string. |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
=cut |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
sub deps_concat { |
173
|
5
|
|
|
5
|
1
|
626
|
my (@dep_list) = @_; |
174
|
|
|
|
|
|
|
|
175
|
5
|
|
|
|
|
14
|
return join ', ', grep { defined } @dep_list; |
|
7
|
|
|
|
|
30
|
|
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=item $dep = deps_parse($line, %options) |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
This function parses the dependency line and returns an object, either a |
181
|
|
|
|
|
|
|
Dpkg::Deps::AND or a Dpkg::Deps::Union. Various options can alter the |
182
|
|
|
|
|
|
|
behaviour of that function. |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
=over 4 |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=item use_arch (defaults to 1) |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
Take into account the architecture restriction part of the dependencies. |
189
|
|
|
|
|
|
|
Set to 0 to completely ignore that information. |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
=item host_arch (defaults to the current architecture) |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
Define the host architecture. By default it uses |
194
|
|
|
|
|
|
|
Dpkg::Arch::get_host_arch() to identify the proper architecture. |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
=item build_arch (defaults to the current architecture) |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
Define the build architecture. By default it uses |
199
|
|
|
|
|
|
|
Dpkg::Arch::get_build_arch() to identify the proper architecture. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=item reduce_arch (defaults to 0) |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
If set to 1, ignore dependencies that do not concern the current host |
204
|
|
|
|
|
|
|
architecture. This implicitly strips off the architecture restriction |
205
|
|
|
|
|
|
|
list so that the resulting dependencies are directly applicable to the |
206
|
|
|
|
|
|
|
current architecture. |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
=item use_profiles (defaults to 1) |
209
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
Take into account the profile restriction part of the dependencies. Set |
211
|
|
|
|
|
|
|
to 0 to completely ignore that information. |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
=item build_profiles (defaults to no profile) |
214
|
|
|
|
|
|
|
|
215
|
|
|
|
|
|
|
Define the active build profiles. By default no profile is defined. |
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
=item reduce_profiles (defaults to 0) |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
If set to 1, ignore dependencies that do not concern the current build |
220
|
|
|
|
|
|
|
profile. This implicitly strips off the profile restriction formula so |
221
|
|
|
|
|
|
|
that the resulting dependencies are directly applicable to the current |
222
|
|
|
|
|
|
|
profiles. |
223
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
=item reduce_restrictions (defaults to 0) |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
If set to 1, ignore dependencies that do not concern the current set of |
227
|
|
|
|
|
|
|
restrictions. This implicitly strips off any architecture restriction list |
228
|
|
|
|
|
|
|
or restriction formula so that the resulting dependencies are directly |
229
|
|
|
|
|
|
|
applicable to the current restriction. |
230
|
|
|
|
|
|
|
This currently implies C and C, and overrides |
231
|
|
|
|
|
|
|
them if set. |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
=item union (defaults to 0) |
234
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
If set to 1, returns a Dpkg::Deps::Union instead of a Dpkg::Deps::AND. Use |
236
|
|
|
|
|
|
|
this when parsing non-dependency fields like Conflicts. |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
=item virtual (defaults to 0) |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
If set to 1, allow only virtual package version relations, that is none, |
241
|
|
|
|
|
|
|
or “=”. |
242
|
|
|
|
|
|
|
This should be set whenever working with Provides fields. |
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
=item build_dep (defaults to 0) |
245
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
If set to 1, allow build-dep only arch qualifiers, that is “:native”. |
247
|
|
|
|
|
|
|
This should be set whenever working with build-deps. |
248
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
=item tests_dep (defaults to 0) |
250
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
If set to 1, allow tests-specific package names in dependencies, that is |
252
|
|
|
|
|
|
|
"@" and "@builddeps@" (since dpkg 1.18.7). This should be set whenever |
253
|
|
|
|
|
|
|
working with dependency fields from F. |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
=back |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=cut |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
sub deps_parse { |
260
|
67
|
|
|
67
|
1
|
5526
|
my ($dep_line, %options) = @_; |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
# Validate arguments. |
263
|
|
|
|
|
|
|
croak "invalid host_arch $options{host_arch}" |
264
|
67
|
100
|
100
|
|
|
235
|
if defined $options{host_arch} and not defined debarch_to_debtuple($options{host_arch}); |
265
|
|
|
|
|
|
|
croak "invalid build_arch $options{build_arch}" |
266
|
63
|
100
|
66
|
|
|
165
|
if defined $options{build_arch} and not defined debarch_to_debtuple($options{build_arch}); |
267
|
|
|
|
|
|
|
|
268
|
59
|
|
50
|
|
|
252
|
$options{use_arch} //= 1; |
269
|
59
|
|
100
|
|
|
214
|
$options{reduce_arch} //= 0; |
270
|
59
|
|
50
|
|
|
189
|
$options{use_profiles} //= 1; |
271
|
59
|
|
100
|
|
|
198
|
$options{reduce_profiles} //= 0; |
272
|
59
|
|
100
|
|
|
184
|
$options{reduce_restrictions} //= 0; |
273
|
59
|
|
100
|
|
|
214
|
$options{union} //= 0; |
274
|
59
|
|
50
|
|
|
180
|
$options{virtual} //= 0; |
275
|
59
|
|
100
|
|
|
174
|
$options{build_dep} //= 0; |
276
|
59
|
|
100
|
|
|
198
|
$options{tests_dep} //= 0; |
277
|
|
|
|
|
|
|
|
278
|
59
|
100
|
|
|
|
114
|
if ($options{reduce_restrictions}) { |
279
|
1
|
|
|
|
|
2
|
$options{reduce_arch} = 1; |
280
|
1
|
|
|
|
|
2
|
$options{reduce_profiles} = 1; |
281
|
|
|
|
|
|
|
} |
282
|
59
|
100
|
|
|
|
97
|
if ($options{reduce_arch}) { |
283
|
4
|
|
66
|
|
|
17
|
$options{host_arch} //= get_host_arch(); |
284
|
4
|
|
33
|
|
|
31
|
$options{build_arch} //= get_build_arch(); |
285
|
|
|
|
|
|
|
} |
286
|
59
|
100
|
|
|
|
97
|
if ($options{reduce_profiles}) { |
287
|
5
|
|
50
|
|
|
12
|
$options{build_profiles} //= [ get_build_profiles() ]; |
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
# Options for Dpkg::Deps::Simple. |
291
|
|
|
|
|
|
|
my %deps_options = ( |
292
|
|
|
|
|
|
|
host_arch => $options{host_arch}, |
293
|
|
|
|
|
|
|
build_arch => $options{build_arch}, |
294
|
|
|
|
|
|
|
build_dep => $options{build_dep}, |
295
|
|
|
|
|
|
|
tests_dep => $options{tests_dep}, |
296
|
59
|
|
|
|
|
202
|
); |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
# Strip trailing/leading spaces |
299
|
59
|
|
|
|
|
254
|
$dep_line =~ s/^\s+//; |
300
|
59
|
|
|
|
|
298
|
$dep_line =~ s/\s+$//; |
301
|
|
|
|
|
|
|
|
302
|
59
|
|
|
|
|
86
|
my @dep_list; |
303
|
59
|
|
|
|
|
350
|
foreach my $dep_and (split(/\s*,\s*/m, $dep_line)) { |
304
|
219
|
|
|
|
|
361
|
my @or_list = (); |
305
|
219
|
|
|
|
|
581
|
foreach my $dep_or (split(/\s*\|\s*/m, $dep_and)) { |
306
|
254
|
|
|
|
|
930
|
my $dep_simple = Dpkg::Deps::Simple->new($dep_or, %deps_options); |
307
|
254
|
100
|
|
|
|
665
|
if (not defined $dep_simple->{package}) { |
308
|
4
|
|
|
|
|
30
|
warning(g_("can't parse dependency %s"), $dep_or); |
309
|
4
|
|
|
|
|
42
|
return; |
310
|
|
|
|
|
|
|
} |
311
|
250
|
0
|
33
|
|
|
490
|
if ($options{virtual} && defined $dep_simple->{relation} && |
|
|
|
33
|
|
|
|
|
312
|
|
|
|
|
|
|
$dep_simple->{relation} ne '=') { |
313
|
0
|
|
|
|
|
0
|
warning(g_('virtual dependency contains invalid relation: %s'), |
314
|
|
|
|
|
|
|
$dep_simple->output); |
315
|
0
|
|
|
|
|
0
|
return; |
316
|
|
|
|
|
|
|
} |
317
|
250
|
50
|
|
|
|
424
|
$dep_simple->{arches} = undef if not $options{use_arch}; |
318
|
250
|
100
|
|
|
|
438
|
if ($options{reduce_arch}) { |
319
|
15
|
|
|
|
|
46
|
$dep_simple->reduce_arch($options{host_arch}); |
320
|
15
|
100
|
|
|
|
32
|
next if not $dep_simple->arch_is_concerned($options{host_arch}); |
321
|
|
|
|
|
|
|
} |
322
|
244
|
50
|
|
|
|
397
|
$dep_simple->{restrictions} = undef if not $options{use_profiles}; |
323
|
244
|
100
|
|
|
|
402
|
if ($options{reduce_profiles}) { |
324
|
62
|
|
|
|
|
180
|
$dep_simple->reduce_profiles($options{build_profiles}); |
325
|
62
|
100
|
|
|
|
127
|
next if not $dep_simple->profile_is_concerned($options{build_profiles}); |
326
|
|
|
|
|
|
|
} |
327
|
215
|
|
|
|
|
475
|
push @or_list, $dep_simple; |
328
|
|
|
|
|
|
|
} |
329
|
215
|
100
|
|
|
|
440
|
next if not @or_list; |
330
|
181
|
100
|
|
|
|
310
|
if (scalar @or_list == 1) { |
331
|
159
|
|
|
|
|
288
|
push @dep_list, $or_list[0]; |
332
|
|
|
|
|
|
|
} else { |
333
|
22
|
|
|
|
|
77
|
my $dep_or = Dpkg::Deps::OR->new(); |
334
|
22
|
|
|
|
|
76
|
$dep_or->add($_) foreach (@or_list); |
335
|
22
|
|
|
|
|
42
|
push @dep_list, $dep_or; |
336
|
|
|
|
|
|
|
} |
337
|
|
|
|
|
|
|
} |
338
|
55
|
|
|
|
|
100
|
my $dep_and; |
339
|
55
|
100
|
|
|
|
96
|
if ($options{union}) { |
340
|
3
|
|
|
|
|
55
|
$dep_and = Dpkg::Deps::Union->new(); |
341
|
|
|
|
|
|
|
} else { |
342
|
52
|
|
|
|
|
180
|
$dep_and = Dpkg::Deps::AND->new(); |
343
|
|
|
|
|
|
|
} |
344
|
55
|
|
|
|
|
100
|
foreach my $dep (@dep_list) { |
345
|
179
|
50
|
66
|
|
|
699
|
if ($options{union} and not $dep->isa('Dpkg::Deps::Simple')) { |
346
|
0
|
|
|
|
|
0
|
warning(g_('an union dependency can only contain simple dependencies')); |
347
|
0
|
|
|
|
|
0
|
return; |
348
|
|
|
|
|
|
|
} |
349
|
179
|
|
|
|
|
347
|
$dep_and->add($dep); |
350
|
|
|
|
|
|
|
} |
351
|
55
|
|
|
|
|
337
|
return $dep_and; |
352
|
|
|
|
|
|
|
} |
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
=item $bool = deps_iterate($deps, $callback_func) |
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
This function visits all elements of the dependency object, calling the |
357
|
|
|
|
|
|
|
callback function for each element. |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
The callback function is expected to return true when everything is fine, |
360
|
|
|
|
|
|
|
or false if something went wrong, in which case the iteration will stop. |
361
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
Return the same value as the callback function. |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
=cut |
365
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
sub deps_iterate { |
367
|
65
|
|
|
65
|
1
|
127
|
my ($deps, $callback_func) = @_; |
368
|
|
|
|
|
|
|
|
369
|
65
|
|
|
|
|
79
|
my $visitor_func; |
370
|
|
|
|
|
|
|
$visitor_func = sub { |
371
|
74
|
|
|
74
|
|
121
|
foreach my $dep (@_) { |
372
|
85
|
50
|
|
|
|
188
|
return unless defined $dep; |
373
|
|
|
|
|
|
|
|
374
|
85
|
100
|
|
|
|
220
|
if ($dep->isa('Dpkg::Deps::Simple')) { |
375
|
76
|
50
|
|
|
|
111
|
return unless $callback_func->($dep); |
376
|
|
|
|
|
|
|
} else { |
377
|
9
|
50
|
|
|
|
25
|
return unless $visitor_func->($dep->get_deps()); |
378
|
|
|
|
|
|
|
} |
379
|
|
|
|
|
|
|
} |
380
|
74
|
|
|
|
|
136
|
return 1; |
381
|
65
|
|
|
|
|
234
|
}; |
382
|
|
|
|
|
|
|
|
383
|
65
|
|
|
|
|
132
|
return $visitor_func->($deps); |
384
|
|
|
|
|
|
|
} |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
=item deps_compare($a, $b) |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
Implements a comparison operator between two dependency objects. |
389
|
|
|
|
|
|
|
This function is mainly used to implement the sort() method. |
390
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
=back |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
=cut |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
my %relation_ordering = ( |
396
|
|
|
|
|
|
|
undef => 0, |
397
|
|
|
|
|
|
|
REL_GE() => 1, |
398
|
|
|
|
|
|
|
REL_GT() => 2, |
399
|
|
|
|
|
|
|
REL_EQ() => 3, |
400
|
|
|
|
|
|
|
REL_LT() => 4, |
401
|
|
|
|
|
|
|
REL_LE() => 5, |
402
|
|
|
|
|
|
|
); |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
sub deps_compare { |
405
|
32
|
|
|
32
|
1
|
47
|
my ($aref, $bref) = @_; |
406
|
|
|
|
|
|
|
|
407
|
32
|
|
|
|
|
41
|
my (@as, @bs); |
408
|
32
|
|
|
34
|
|
135
|
deps_iterate($aref, sub { push @as, @_ }); |
|
34
|
|
|
|
|
90
|
|
409
|
32
|
|
|
37
|
|
161
|
deps_iterate($bref, sub { push @bs, @_ }); |
|
37
|
|
|
|
|
96
|
|
410
|
|
|
|
|
|
|
|
411
|
32
|
|
|
|
|
42
|
while (1) { |
412
|
35
|
|
|
|
|
58
|
my ($a, $b) = (shift @as, shift @bs); |
413
|
35
|
100
|
|
|
|
124
|
my $aundef = not defined $a or $a->is_empty(); |
414
|
35
|
50
|
|
|
|
87
|
my $bundef = not defined $b or $b->is_empty(); |
415
|
|
|
|
|
|
|
|
416
|
35
|
50
|
66
|
|
|
67
|
return 0 if $aundef and $bundef; |
417
|
35
|
100
|
|
|
|
59
|
return -1 if $aundef; |
418
|
33
|
50
|
|
|
|
49
|
return 1 if $bundef; |
419
|
|
|
|
|
|
|
|
420
|
33
|
|
100
|
|
|
68
|
my $ar = $a->{relation} // 'undef'; |
421
|
33
|
|
100
|
|
|
62
|
my $br = $b->{relation} // 'undef'; |
422
|
33
|
|
100
|
|
|
106
|
my $av = $a->{version} // ''; |
423
|
33
|
|
100
|
|
|
80
|
my $bv = $b->{version} // ''; |
424
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
my $res = (($a->{package} cmp $b->{package}) || |
426
|
33
|
|
66
|
|
|
97
|
($relation_ordering{$ar} <=> $relation_ordering{$br}) || |
427
|
|
|
|
|
|
|
($av cmp $bv)); |
428
|
33
|
100
|
|
|
|
128
|
return $res if $res != 0; |
429
|
|
|
|
|
|
|
} |
430
|
|
|
|
|
|
|
} |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
=head1 CLASSES - Dpkg::Deps::* |
433
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
There are several kind of dependencies. A Dpkg::Deps::Simple dependency |
435
|
|
|
|
|
|
|
represents a single dependency statement (it relates to one package only). |
436
|
|
|
|
|
|
|
Dpkg::Deps::Multiple dependencies are built on top of this class |
437
|
|
|
|
|
|
|
and combine several dependencies in different manners. Dpkg::Deps::AND |
438
|
|
|
|
|
|
|
represents the logical "AND" between dependencies while Dpkg::Deps::OR |
439
|
|
|
|
|
|
|
represents the logical "OR". Dpkg::Deps::Multiple objects can contain |
440
|
|
|
|
|
|
|
Dpkg::Deps::Simple object as well as other Dpkg::Deps::Multiple objects. |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
In practice, the code is only meant to handle the realistic cases which, |
443
|
|
|
|
|
|
|
given Debian's dependencies structure, imply those restrictions: AND can |
444
|
|
|
|
|
|
|
contain Simple or OR objects, OR can only contain Simple objects. |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
Dpkg::Deps::KnownFacts is a special class that is used while evaluating |
447
|
|
|
|
|
|
|
dependencies and while trying to simplify them. It represents a set of |
448
|
|
|
|
|
|
|
installed packages along with the virtual packages that they might |
449
|
|
|
|
|
|
|
provide. |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
=head1 CHANGES |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
=head2 Version 1.07 (dpkg 1.20.0) |
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
New option: Add virtual option to Dpkg::Deps::deps_parse(). |
456
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
=head2 Version 1.06 (dpkg 1.18.7; module version bumped on dpkg 1.18.24) |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
New option: Add tests_dep option to Dpkg::Deps::deps_parse(). |
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
=head2 Version 1.05 (dpkg 1.17.14) |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
New function: Dpkg::Deps::deps_iterate(). |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
=head2 Version 1.04 (dpkg 1.17.10) |
466
|
|
|
|
|
|
|
|
467
|
|
|
|
|
|
|
New options: Add use_profiles, build_profiles, reduce_profiles and |
468
|
|
|
|
|
|
|
reduce_restrictions to Dpkg::Deps::deps_parse(). |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=head2 Version 1.03 (dpkg 1.17.0) |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
New option: Add build_arch option to Dpkg::Deps::deps_parse(). |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
=head2 Version 1.02 (dpkg 1.17.0) |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
New function: Dpkg::Deps::deps_concat() |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
=head2 Version 1.01 (dpkg 1.16.1) |
479
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
=head2 Version 1.00 (dpkg 1.15.6) |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
Mark the module as public. |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
=cut |
487
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
1; |