1 |
commit: b768a4ce805c6439d64dd05d4c4fe1fc422b6b2e |
2 |
Author: Kent Fredric <kentfredric <AT> gmail <DOT> com> |
3 |
AuthorDate: Sun Oct 30 20:19:03 2011 +0000 |
4 |
Commit: Kent Fredric <kentfredric <AT> gmail <DOT> com> |
5 |
CommitDate: Mon Oct 31 02:45:47 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/perl-overlay.git;a=commit;h=b768a4ce |
7 |
|
8 |
Reasonably assumptive-but-works chooser of exported dep |
9 |
|
10 |
--- |
11 |
scripts/show_deptree.pl | 348 ++++++++++++++++++++++++++++++++++------------- |
12 |
1 files changed, 250 insertions(+), 98 deletions(-) |
13 |
|
14 |
diff --git a/scripts/show_deptree.pl b/scripts/show_deptree.pl |
15 |
index 14f221b..8b78896 100755 |
16 |
--- a/scripts/show_deptree.pl |
17 |
+++ b/scripts/show_deptree.pl |
18 |
@@ -36,7 +36,7 @@ if ( $flags->{help} or $singleflags->{h} ) { print help(); exit 0; } |
19 |
# usage: |
20 |
# |
21 |
# gen_ebuild.pl DOY/Moose-2.0301-TRIAL |
22 |
-# |
23 |
+# |
24 |
my ($release) = shift(@ARGV); |
25 |
|
26 |
*STDOUT->binmode(':utf8'); |
27 |
@@ -46,8 +46,8 @@ my %phases; |
28 |
my %modules; |
29 |
my %providers; |
30 |
|
31 |
-my $dep_phases = get_dep_phases( $release ); |
32 |
-%phases = %{ $dep_phases->{phases} }; |
33 |
+my $dep_phases = get_dep_phases($release); |
34 |
+%phases = %{ $dep_phases->{phases} }; |
35 |
%modules = %{ $dep_phases->{modules} }; |
36 |
|
37 |
use Data::Dump qw( pp ); |
38 |
@@ -56,28 +56,29 @@ use Try::Tiny; |
39 |
use version (); |
40 |
|
41 |
sub provider_map { |
42 |
- my ( $module , $version ) = @_; |
43 |
- my @providers = metacpan->find_dist_simple( $module ); |
44 |
+ my ( $module, $version ) = @_; |
45 |
+ my @providers = metacpan->find_dist_simple($module); |
46 |
my %moduleprov; |
47 |
- |
48 |
|
49 |
- my %specialvs; |
50 |
+ my %specialvs; |
51 |
|
52 |
- my $wanted_version = version->parse( $version ); |
53 |
+ my $wanted_version = version->parse($version); |
54 |
|
55 |
- for my $provider ( @providers ) { |
56 |
+ for my $provider (@providers) { |
57 |
|
58 |
- next if $provider->{status} eq 'backpan'; |
59 |
+ #next if $provider->{status} eq 'backpan'; |
60 |
next if $provider->{maturity} eq 'developer'; |
61 |
-# pp $provider; |
62 |
|
63 |
- my $dist = $provider->{distribution}; |
64 |
+ # pp $provider; |
65 |
+ |
66 |
+ my $dist = $provider->{distribution}; |
67 |
my $distv = $provider->{version} // 'undef'; |
68 |
my $gv = 'undef'; |
69 |
- if ( $distv ne 'undef' ){ |
70 |
+ if ( $distv ne 'undef' ) { |
71 |
try { |
72 |
- $gv = gentooize_version( $distv , { lax => 1 } ); |
73 |
- } catch { |
74 |
+ $gv = gentooize_version( $distv, { lax => 1 } ); |
75 |
+ } |
76 |
+ catch { |
77 |
$gv = '???'; |
78 |
}; |
79 |
} |
80 |
@@ -87,46 +88,41 @@ sub provider_map { |
81 |
$moduleprov{$dist} //= []; |
82 |
|
83 |
my @provided_matching_mods; |
84 |
- for my $mod ( @{ $provider->{'_source.module' } } ) { |
85 |
+ for my $mod ( @{ $provider->{'_source.module'} } ) { |
86 |
next unless $mod->{name} eq $module; |
87 |
my $modv = $mod->{version} // 'undef'; |
88 |
|
89 |
my $got_version = version->parse( $mod->{version} ); |
90 |
|
91 |
- my $dv = $distv; |
92 |
- #if( $distv ne $modv ) { |
93 |
- $dv = sprintf "%s ( %s ) => \"%s\"" , $distv , $gv, $modv; |
94 |
- #} |
95 |
- # specials |
96 |
- |
97 |
- $specialvs{newest} //= {}; |
98 |
- $specialvs{oldest} //= {}; |
99 |
- $specialvs{closest} //= {}; |
100 |
+ my $dv = $distv; |
101 |
+ $dv = sprintf "%s ( %s ) => \"%s\"", $distv, $gv, $modv; |
102 |
+ |
103 |
+ # specials |
104 |
+ |
105 |
+ $specialvs{newest} //= {}; |
106 |
+ $specialvs{oldest} //= {}; |
107 |
+ $specialvs{closest} //= {}; |
108 |
$specialvs{closestx} //= {}; |
109 |
- $specialvs{latest} = [ $dist , $dv ] if not exists $specialvs{latest}; |
110 |
+ $specialvs{latest} = [ $dist, $dv ] if not exists $specialvs{latest}; |
111 |
$specialvs{newest}->{$dist} = $dv if not exists $specialvs{newest}->{$dist}; |
112 |
- $specialvs{oldest}->{$dist} = $dv; |
113 |
+ $specialvs{oldest}->{$dist} = $dv; |
114 |
|
115 |
- # *STDERR->printf("\e[99m%s > %s , %s\n", $got_version, $wanted_version, $got_version > $wanted_version ); |
116 |
+ if ( not defined $version or $got_version >= $wanted_version ) { |
117 |
|
118 |
- if ( not defined $version or $got_version >= $wanted_version ){ |
119 |
-# *STDERR->printf("\e[99m%s > %s , %s x2\n", $got_version, $version , 1 ); |
120 |
if ( not defined $specialvs{closestx}->{$dist} ) { |
121 |
-# *STDERR->printf("\e[99m%s > %s => set \n", $got_version, $version ); |
122 |
$specialvs{closestx}->{$dist} = $got_version; |
123 |
- $specialvs{closest}->{$dist} = $dv; |
124 |
- } else { |
125 |
- if( $specialvs{closestx}->{$dist} >= $got_version ) { |
126 |
-# *STDERR->printf("\e[99m%s > %s => << \n", $got_version, $version ); |
127 |
- |
128 |
+ $specialvs{closest}->{$dist} = $dv; |
129 |
+ } |
130 |
+ else { |
131 |
+ if ( $specialvs{closestx}->{$dist} >= $got_version ) { |
132 |
$specialvs{closestx}->{$dist} = $got_version; |
133 |
- $specialvs{closest}->{$dist} = $dv; |
134 |
- |
135 |
+ $specialvs{closest}->{$dist} = $dv; |
136 |
} |
137 |
} |
138 |
} |
139 |
- # |
140 |
- |
141 |
+ |
142 |
+ # |
143 |
+ |
144 |
push @provided_matching_mods, $dv |
145 |
if $mod->{name} eq $module; |
146 |
} |
147 |
@@ -135,108 +131,264 @@ sub provider_map { |
148 |
return \%moduleprov, \%specialvs; |
149 |
} |
150 |
|
151 |
+sub handle_declaration { |
152 |
+ my ( $release, $module, $declaration, $output ) = @_; |
153 |
|
154 |
-for my $module ( keys %modules ) { |
155 |
- for my $declaration ( @{ $modules{$module} } ) { |
156 |
+ my $depstring = $module; |
157 |
+ if ( $declaration->[1] ne '0.0.0' ) { |
158 |
+ $depstring .= " " . $declaration->[0] . " ( " . $declaration->[1] . " ) "; |
159 |
+ } |
160 |
|
161 |
- my $depstring = $module; |
162 |
- if ( $declaration->[1] ne '0.0.0' ) { |
163 |
- $depstring .= " " . $declaration->[0] . " ( " . $declaration->[1] . " ) " ; |
164 |
- } |
165 |
+ my $want_string = "$release -> " . $declaration->[2] . " " . $declaration->[3] . " " . $depstring; |
166 |
|
167 |
- my $want_string = "$release -> " . $declaration->[2] . " " . $declaration->[3] . " " . $depstring; |
168 |
+ my ( $moduleprov, $specialvs ) = provider_map( $module, $declaration->[0] ); |
169 |
|
170 |
- |
171 |
- my ( $moduleprov, $specialvs ) = provider_map( $module , $declaration->[0]); |
172 |
+ my $to_pkg = sub { |
173 |
+ my $pkg = shift; |
174 |
+ my $xpkg = gentooize_pkg($pkg); |
175 |
+ if ( $declaration->[1] eq '0.0.0' ) { |
176 |
+ return $xpkg; |
177 |
+ } |
178 |
+ return '\\>=' . $xpkg . '-' . $declaration->[1]; |
179 |
+ }; |
180 |
|
181 |
- my $pc = scalar keys %$moduleprov; |
182 |
+ my $pc = scalar keys %$moduleprov; |
183 |
|
184 |
- my $multi = ( $pc > 1 ); |
185 |
- my $any = ( $pc > 0 ); |
186 |
+ my $multi = ( $pc > 1 ); |
187 |
+ my $any = ( $pc > 0 ); |
188 |
|
189 |
- *STDOUT->printf("\e[1;93m%s\e[0m\n", $want_string ); |
190 |
+ $output->printf( "\e[1;93m%s\e[0m\n", $want_string ); |
191 |
|
192 |
- |
193 |
+ if ( not $any ) { |
194 |
+ return $output->printf( "%sWARNING: NO PROVIDER FOUND FOR \"%s\"%s\n", "\e[1;91m", $module, "\e[0m" ); |
195 |
+ } |
196 |
+ if ($multi) { |
197 |
+ $output->printf( "%sWARNING: MULTIPLE PROVIDERS FOUND FOR \"%s\"%s\n", "\e[1;91m", $module, "\e[0m" ); |
198 |
+ } |
199 |
|
200 |
- if ( not $any ) { |
201 |
- *STDOUT->printf("%sWARNING: NO PROVIDER FOUND FOR \"%s\"%s\n", "\e[1;91m", $module, "\e[0m" ); |
202 |
- next; |
203 |
- } |
204 |
- if( $multi ){ |
205 |
- *STDOUT->printf("%sWARNING: MULTIPLE PROVIDERS FOUND FOR \"%s\"%s\n", "\e[1;91m", $module, "\e[0m" ); |
206 |
+ my $indent = " \e[1;92m*"; |
207 |
+ $indent = " \e[1;91m*" if $multi; |
208 |
+ |
209 |
+ $output->printf( |
210 |
+ "%s\e[1;95m latest: %s => %s ( %s )\n", |
211 |
+ $indent, |
212 |
+ @{ $specialvs->{latest} }, |
213 |
+ $to_pkg->( $specialvs->{latest}->[0] ) |
214 |
+ ); |
215 |
+ |
216 |
+ for my $prov ( keys %{$moduleprov} ) { |
217 |
+ my $prefix = $depstring . ' in ' . $prov; |
218 |
+ my $lines = xwrap( join q[, ], @{ $moduleprov->{$prov} } ); |
219 |
+ my (@slines) = split /$/m, $lines; |
220 |
+ $_ =~ s/[\r\n]*//m for @slines; |
221 |
+ $output->printf( " %s%s -> %s%s (%s)\n", "\e[1;92m", $depstring, "\e[0m\e[92m", $prov, gentooize_pkg($prov) ); |
222 |
+ $output->printf( "%s newest: %s\e[0m\n", $indent, $specialvs->{newest}->{$prov} ); |
223 |
+ $output->printf( "%s oldest: %s\e[0m\n", $indent, $specialvs->{oldest}->{$prov} ); |
224 |
+ my $v = $specialvs->{closest}->{$prov}; |
225 |
+ if ( not defined $v ) { $v = 'undef' } |
226 |
+ $output->printf( "%s closest: %s\e[0m\n", $indent, $v ); |
227 |
+ |
228 |
+ for (@slines) { |
229 |
+ |
230 |
+ $output->printf( "%s %s%s -> %s%s\n", $indent, "\e[1;94m", $prov, "\e[0m\e[94m", $_ ); |
231 |
} |
232 |
+ } |
233 |
+ if ($multi) { |
234 |
+ $output->print(" \e[1;91m-\n\n"); |
235 |
+ } |
236 |
+ else { |
237 |
+ $output->print(" \e[1;92m-\n\n"); |
238 |
+ } |
239 |
|
240 |
+} |
241 |
|
242 |
- my $indent = " \e[1;92m*"; |
243 |
- $indent = " \e[1;91m*" if $multi; |
244 |
- |
245 |
- *STDOUT->printf("%s latest: %s => %s\n", $indent, @{ $specialvs->{latest} } ); |
246 |
- |
247 |
- for my $prov ( keys %{$moduleprov} ) { |
248 |
- my $prefix = $depstring . ' in ' . $prov; |
249 |
- my $lines = xwrap( join q[, ], @{$moduleprov->{ $prov } } ); |
250 |
- my ( @slines ) = split /$/m , $lines; |
251 |
- $_ =~ s/[\r\n]*//m for @slines; |
252 |
- *STDOUT->printf(" %s%s -> %s%s\n", "\e[1;92m", $depstring, "\e[0m\e[92m" ,$prov); |
253 |
- *STDOUT->printf("%s newest: %s\e[0m\n", $indent, $specialvs->{newest}->{$prov}); |
254 |
- *STDOUT->printf("%s oldest: %s\e[0m\n", $indent, $specialvs->{oldest}->{$prov}); |
255 |
- my $v = $specialvs->{closest}->{$prov}; |
256 |
- if( not defined $v ){ $v = 'undef' } |
257 |
- *STDOUT->printf("%s closest: %s\e[0m\n", $indent, $v ); |
258 |
- for ( @slines ) { |
259 |
+sub virtual($) { |
260 |
+ my $i = shift; |
261 |
+ return 'virtual/perl-' . $i; |
262 |
+} |
263 |
|
264 |
- *STDOUT->printf("%s %s%s -> %s%s\n", $indent, "\e[1;94m", $prov , "\e[0m\e[94m", $_ ); |
265 |
- } |
266 |
- } |
267 |
- if ( $multi ){ |
268 |
- *STDOUT->print(" \e[1;91m-\n\n"); |
269 |
- } else { |
270 |
- *STDOUT->print(" \e[1;92m-\n\n"); |
271 |
- } |
272 |
+sub gentooize_pkg { |
273 |
+ my $pkg = shift; |
274 |
+ my %vmap = ( |
275 |
+ 'perl' => 'dev-lang/perl', |
276 |
+ 'perl_debug' => 'dev-lang/perl_debug', # doesn't actually exist |
277 |
+ ( |
278 |
+ map { $_, virtual $_ } |
279 |
+ qw( |
280 |
+ Archive-Tar |
281 |
+ Attribute-Handlers |
282 |
+ AutoLoader |
283 |
+ CGI |
284 |
+ Class-ISA |
285 |
+ Compress-Raw-Bzip2 |
286 |
+ Compress-Raw-Zlib |
287 |
+ CPAN-Meta |
288 |
+ CPAN-Meta-YAML |
289 |
+ Data-Dumper |
290 |
+ DB_File |
291 |
+ Digest-MD5 |
292 |
+ Digest-SHA |
293 |
+ Encode |
294 |
+ ExtUtils-CBuilder |
295 |
+ ExtUtils-Command |
296 |
+ ExtUtils-Install |
297 |
+ ExtUtils-MakeMaker |
298 |
+ ExtUtils-Manifest |
299 |
+ ExtUtils-ParseXS |
300 |
+ File-Path |
301 |
+ File-Temp |
302 |
+ Filter |
303 |
+ Getopt-Long |
304 |
+ i18n-langtags |
305 |
+ IO |
306 |
+ IO-Compress |
307 |
+ IO-Zlib |
308 |
+ IPC-Cmd |
309 |
+ JSON-PP |
310 |
+ libnet |
311 |
+ Locale-MakeText-Simple |
312 |
+ Math-BigInt |
313 |
+ Math-BigInt-FastCalc |
314 |
+ Memoize |
315 |
+ MIME-Base64 |
316 |
+ Module-Build |
317 |
+ Module-CoreList |
318 |
+ Module-Load |
319 |
+ Module-Load-Conditional |
320 |
+ Module-Loaded |
321 |
+ Module-Metadata |
322 |
+ Module-Pluggable |
323 |
+ Package-Constants |
324 |
+ Params-Check |
325 |
+ parent |
326 |
+ Parse-CPAN-Meta |
327 |
+ Perl-OSType |
328 |
+ Pod-Escapes |
329 |
+ podlators |
330 |
+ Pod-Simple |
331 |
+ Safe |
332 |
+ Scalar-List-Utils |
333 |
+ Storable |
334 |
+ Switch |
335 |
+ Sys-Syslog |
336 |
+ Term-ANSIColor |
337 |
+ Test |
338 |
+ Test-Harness |
339 |
+ Test-Simple |
340 |
+ Text-Balanced |
341 |
+ Text-Tabs+Wrap |
342 |
+ Thread-Queue |
343 |
+ threads |
344 |
+ Thread-Semaphore |
345 |
+ threads-shared |
346 |
+ Time-HiRes |
347 |
+ Time-Local |
348 |
+ Time-Piece |
349 |
+ version |
350 |
+ Version-Requirements |
351 |
+ XSLoader |
352 |
+ ) |
353 |
+ ), |
354 |
+ 'Digest' => virtual 'digest-base', |
355 |
+ 'PathTools' => virtual 'File-Spec', |
356 |
+ 'Locale-MakeText' => virtual 'locale-maketext', |
357 |
+ 'Net-Ping' => virtual 'net-ping', |
358 |
+ 'Pod-Parser' => virtual 'PodParser', |
359 |
+ ## Overlay |
360 |
+ ( |
361 |
+ map { $_, virtual $_ } |
362 |
+ qw( |
363 |
+ Archive-Extract |
364 |
+ B-Debug |
365 |
+ B-Lint |
366 |
+ constant |
367 |
+ CPAN |
368 |
+ CPANPLUS |
369 |
+ CPANPLUS-Dist-Build |
370 |
+ Devel-DProf |
371 |
+ Devel-PPPort |
372 |
+ Devel-SelfStubber |
373 |
+ Dumpvalue |
374 |
+ ExtUtils-Constant |
375 |
+ ExtUtils-MakeMaker |
376 |
+ File-Fetch |
377 |
+ Filter-Simple |
378 |
+ HTTP-Tiny |
379 |
+ i18n-langtags |
380 |
+ if |
381 |
+ IPC-SysV |
382 |
+ Log-Message |
383 |
+ Log-Message-Simple |
384 |
+ Math-Complex |
385 |
+ Module-CoreList |
386 |
+ NEXT |
387 |
+ Object-Accessor |
388 |
+ Pod-LaTeX |
389 |
+ Pod-Perldoc |
390 |
+ Pod-Plainer |
391 |
+ SelfLoader |
392 |
+ Term-UI |
393 |
+ Unicode-Collate |
394 |
+ Unicode-Normalize |
395 |
+ ) |
396 |
+ ), |
397 |
+ ); |
398 |
+ |
399 |
+ if ( exists $vmap{$pkg} ) { |
400 |
+ return $vmap{$pkg}; |
401 |
+ } |
402 |
+ return 'dev-perl/' . $pkg; |
403 |
+} |
404 |
|
405 |
-}} |
406 |
+for my $module ( keys %modules ) { |
407 |
+ for my $declaration ( @{ $modules{$module} } ) { |
408 |
+ handle_declaration( $release, $module, $declaration, *STDOUT ); |
409 |
+ } |
410 |
+} |
411 |
|
412 |
use Data::Dump qw( pp ); |
413 |
use JSON qw( to_json encode_json ); |
414 |
+ |
415 |
#say pp( \%modules,);# { pretty => 1 } ); |
416 |
exit 1; |
417 |
|
418 |
sub xwrap { |
419 |
- local $Text::Wrap::break = qr/,/; |
420 |
+ local $Text::Wrap::break = qr/,/; |
421 |
local $Text::Wrap::overflow = 'huge'; |
422 |
- local $Text::Wrap::columns = 128; |
423 |
+ local $Text::Wrap::columns = 128; |
424 |
$Text::Wrap::overflow = 'huge'; |
425 |
my $pre = " "; |
426 |
- my $lines = wrap( $pre , $pre, @_ ); |
427 |
+ my $lines = wrap( $pre, $pre, @_ ); |
428 |
return $lines; |
429 |
} |
430 |
+ |
431 |
sub clines { |
432 |
- my ( $c, $prefix , $lines ) = @_ ; |
433 |
+ my ( $c, $prefix, $lines ) = @_; |
434 |
$lines =~ s/^/$prefix>>$c/mg; |
435 |
$lines =~ s/$/\e[0m/mg; |
436 |
return $lines; |
437 |
} |
438 |
|
439 |
sub get_dep_phases { |
440 |
- my ( $release ) = shift; |
441 |
+ my ($release) = shift; |
442 |
my %phases; |
443 |
my %modules; |
444 |
my ( $result, ) = get_deps($release); |
445 |
for my $dep ( @{ $result->{dependency} } ) { |
446 |
- my $phase = $dep->{phase}; |
447 |
- my $module = $dep->{module}; |
448 |
+ my $phase = $dep->{phase}; |
449 |
+ my $module = $dep->{module}; |
450 |
my $required = ( $dep->{relationship} eq 'requires' ); |
451 |
|
452 |
next unless $required; |
453 |
- next if $phase eq 'develop'; |
454 |
+ next if $phase eq 'develop'; |
455 |
|
456 |
- $phases{$phase} //= []; |
457 |
+ $phases{$phase} //= []; |
458 |
$modules{$module} //= []; |
459 |
|
460 |
my $v = gentooize_version( $dep->{version}, { lax => 1 } ); |
461 |
|
462 |
- push @{ $phases{$phase} }, [ $dep->{module} , $dep->{version} , $v, $dep->{relationship} ]; |
463 |
- push @{ $modules{$module} }, [ $dep->{version}, $v, $dep->{phase} , $dep->{relationship} ]; |
464 |
+ push @{ $phases{$phase} }, [ $dep->{module}, $dep->{version}, $v, $dep->{relationship} ]; |
465 |
+ push @{ $modules{$module} }, [ $dep->{version}, $v, $dep->{phase}, $dep->{relationship} ]; |
466 |
} |
467 |
return { phases => \%phases, modules => \%modules }; |
468 |
} |
469 |
@@ -258,7 +410,7 @@ sub get_deps { |
470 |
|
471 |
$release =~ qr{^([^/]+)/(.*$)}; |
472 |
( $author, $distrelease ) = ( "$1", "$2" ); |
473 |
- return metacpan->find_release( $author, $distrelease ); |
474 |
+ return metacpan->find_release( $author, $distrelease ); |
475 |
} |
476 |
|
477 |
sub pkg_for_module { |