Upgrade-Doku: Hinweis auf benötigtes Perl-Modul IPC::Run
[kivitendo-erp.git] / scripts / find-use.pl
old mode 100644 (file)
new mode 100755 (executable)
index dbd30aa..b2a3c0d
@@ -1,10 +1,19 @@
 #!/usr/bin/perl -l
 #!/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 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);
 
 
 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 = (
 # 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' => {
    '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,
   },
   '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::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)$/;
 
 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/#;
 
   $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 /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+(.*?)$/;
 
 
     my ($useline) = m/^use\s+(.*?)$/;
 
-    next if  $useline =~ /^[\d.]+;/; # skip version requirements
+    next if  $useline =~ /^[\d._]+;/; # skip version requirements
     next if !$useline;
 
     $uselines{$useline} ||= [];
     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);
   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} }) {
 
   # 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} }) {
 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;
       }
     }
   }
 }
 
         $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 {
   } 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;
 }
 
   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');
 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
 =head1 EXAMPLE
 
  # perl scipts/find-use.pl
- !missing : Perl::Tags
  !missing : Template::Constants
  !missing : DBI
 
  !missing : Template::Constants
  !missing : DBI
 
@@ -178,13 +249,15 @@ This module is included in C<modules/*>. Don't worry about it.
 =item required
 
 This module is documented in C<SL:InstallationCheck> to be necessary, or is a
 =item required
 
 This module is documented in C<SL:InstallationCheck> 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.
 
 
 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
 =head1 AUTHOR
 
 http://www.ledgersmb.org/ - The LedgerSMB team
@@ -195,5 +268,3 @@ Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
 Distributed under the terms of the GNU General Public License v2.
 
 =cut
 Distributed under the terms of the GNU General Public License v2.
 
 =cut
-
-