X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=scripts%2Ffind-use.pl;h=b2a3c0dafeb2447ab1617cac9bb5bcc6b7146111;hb=bfa674c9d4edc551afa6e27aac6f684a7b8cb656;hp=dbd30aa6079919ec09cd5ec610408a466b60bb0a;hpb=89c9ff022d3f13e27ba6bda085df15707fcfb0eb;p=kivitendo-erp.git diff --git a/scripts/find-use.pl b/scripts/find-use.pl old mode 100644 new mode 100755 index dbd30aa60..b2a3c0daf --- a/scripts/find-use.pl +++ b/scripts/find-use.pl @@ -1,10 +1,19 @@ #!/usr/bin/perl -l + +BEGIN { + use FindBin; + + unshift(@INC, $FindBin::Bin . '/../modules/override'); # Use our own versions of various modules (e.g. YAML). + push (@INC, $FindBin::Bin . '/..'); # '.' will be removed from @INC soon. +} + use strict; #use warnings; # corelist and find throw tons of warnings use File::Find; use Module::CoreList; use SL::InstallationCheck; use Term::ANSIColor; +use Getopt::Long; my (%uselines, %modules, %supplied, %requires); @@ -12,10 +21,17 @@ my (%uselines, %modules, %supplied, %requires); # easily obtained, I'll just hard code the bigger ones we use here. the same # hash will be filled later with information gathered from the source files. %requires = ( + 'DateTime' => { + 'DateTime::Duration' => 1, + 'DateTime::Infinite' => 1, + }, 'Rose::DB::Object' => { 'Rose::DB::Object::ConventionManager' => 1, 'Rose::DB::Object::Manager' => 1, 'Rose::DB::Object::Metadata' => 1, + 'Rose::DB::Object::Helpers' => 1, + 'Rose::DB::Object::Util' => 1, + 'Rose::DB::Object::Constants' => 1, }, 'Rose::Object' => { 'Rose::Object::MakeMethods::Generic' => 1, @@ -26,13 +42,43 @@ my (%uselines, %modules, %supplied, %requires); 'Template::Iterator' => 1, 'Template::Plugin' => 1, 'Template::Plugin::Filter' => 1, + 'Template::Plugin::HTML' => 1, + 'Template::Stash' => 1, + }, + 'Devel::REPL' => { + 'namespace::clean' => 1, + }, + 'Email::MIME' => { + 'Email::MIME::Creator' => 1, }, + 'Test::Harness' => { + 'TAP::Parser' => 1, + 'TAP::Parser::Aggregator' => 1, + }, + 'Archive::Zip' => { + 'Archive::Zip::Member' => 1, + }, + 'HTML::Parser' => { + 'HTML::Entities' => 1, + }, + 'URI' => { + 'URI::Escape' => 1, + }, + 'File::MimeInfo' => { + 'File::MimeInfo::Magic' => 1, + }, +); + +GetOptions( + 'files-with-match|l' => \ my $l, ); +chmod($FindBin::Bin . '/..'); + find(sub { return unless /(\.p[lm]|console)$/; - # remember modules shipped with Lx-Office + # remember modules shipped with kivitendo $supplied{modulize($File::Find::name)}++ if $File::Find::dir =~ m#modules/#; @@ -43,10 +89,11 @@ find(sub { next if /SL::/; next if /Support::Files/; # our own test support module next if /use (warnings|strict|vars|lib|constant|utf8)/; + next if /^use (with|the)/; my ($useline) = m/^use\s+(.*?)$/; - next if $useline =~ /^[\d.]+;/; # skip version requirements + next if $useline =~ /^[\d._]+;/; # skip version requirements next if !$useline; $uselines{$useline} ||= []; @@ -75,10 +122,14 @@ for my $useline (keys %uselines) { next if $useline =~ /^most and offer that in a small/; # YAML my $version = Module::CoreList->first_release($module); - $modules{$module} = $supplied{$module} ? 'included' - : $version ? sprintf '%2.6f', $version - : is_documented($module) ? 'required' - : '!missing'; + $modules{$module} = { status => $supplied{$module} ? 'included' + : $version ? sprintf '%2.6f', $version + : is_required($module) ? 'required' + : is_optional($module) ? 'optional' + : is_developer($module) ? 'developer' + : '!missing', + files => $uselines{$useline}, + }; # build requirement tree for my $file (@{ $uselines{$useline} }) { @@ -89,25 +140,36 @@ for my $useline (keys %uselines) { } } -# build transitive closure for documented dependancies +# have all documented modules mentioned here +$modules{$_->{name}} ||= { status => 'required' } for @SL::InstallationCheck::required_modules; +$modules{$_->{name}} ||= { status => 'optional' } for @SL::InstallationCheck::optional_modules; +$modules{$_->{name}} ||= { status => 'developer' } for @SL::InstallationCheck::developer_modules; + +# build transitive closure for documented dependencies my $changed = 1; while ($changed) { $changed = 0; for my $src_module (keys %requires) { for my $dst_module (keys %{ $requires{$src_module} }) { - if ( $modules{$src_module} =~ /^required/ - && $modules{$dst_module} eq '!missing') { - $modules{$dst_module} = "required"; # . ", via $src_module"; + if ( $modules{$src_module} + && $modules{$dst_module} + && $modules{$src_module}->{status} =~ /^(required|devel|optional)/ + && $modules{$dst_module}->{status} eq '!missing') { + $modules{$dst_module}->{status} = "required"; # . ", via $src_module"; $changed = 1; } } } } -print sprintf "%8s : %s", color_text($modules{$_}), $_ - for sort { - $modules{$a} cmp $modules{$b} - || $a cmp $b +do { + print sprintf "%8s : %s", color_text($modules{$_}->{status}), $_; + if ($l) { + print " $_" for @{ $modules{$_}->{files} || [] }; + } +} for sort { + $modules{$a}->{status} cmp $modules{$b}->{status} + || $a cmp $b } keys %modules; sub modulize { @@ -120,11 +182,21 @@ sub modulize { } } -sub is_documented { +sub is_required { my ($module) = @_; grep { $_->{name} eq $module } @SL::InstallationCheck::required_modules; } +sub is_optional { + my ($module) = @_; + grep { $_->{name} eq $module } @SL::InstallationCheck::optional_modules; +} + +sub is_developer { + my ($module) = @_; + grep { $_->{name} eq $module } @SL::InstallationCheck::developer_modules; +} + sub color_text { my ($text) = @_; return color(get_color($text)) . $text . color('reset'); @@ -151,7 +223,6 @@ find-use =head1 EXAMPLE # perl scipts/find-use.pl - !missing : Perl::Tags !missing : Template::Constants !missing : DBI @@ -178,13 +249,15 @@ This module is included in C. Don't worry about it. =item required This module is documented in C to be necessary, or is a -dependancy of one of these. Everything alright. +dependency of one of these. Everything alright. -= item !missing +=item !missing These modules are neither core, nor included, nor required. This is ok for developer tools, but should never occur for modules the actual program uses. +=back + =head1 AUTHOR http://www.ledgersmb.org/ - The LedgerSMB team @@ -195,5 +268,3 @@ Sven Schöling Es.schoeling@linet-services.deE Distributed under the terms of the GNU General Public License v2. =cut - -