home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / lib / rpm / perl.prov < prev    next >
Text File  |  2006-11-29  |  5KB  |  191 lines

  1. #!/usr/bin/perl
  2.  
  3. # RPM (and it's source code) is covered under two separate licenses.
  4.  
  5. # The entire code base may be distributed under the terms of the GNU
  6. # General Public License (GPL), which appears immediately below.
  7. # Alternatively, all of the source code in the lib subdirectory of the
  8. # RPM source code distribution as well as any code derived from that
  9. # code may instead be distributed under the GNU Library General Public
  10. # License (LGPL), at the choice of the distributor. The complete text
  11. # of the LGPL appears at the bottom of this file.
  12.  
  13. # This alternative is allowed to enable applications to be linked
  14. # against the RPM library (commonly called librpm) without forcing
  15. # such applications to be distributed under the GPL.
  16.  
  17. # Any questions regarding the licensing of RPM should be addressed to
  18. # Erik Troan <ewt@redhat.com>.
  19.  
  20. # a simple script to print the proper name for perl libraries.
  21.  
  22. # To save development time I do not parse the perl grammmar but
  23. # instead just lex it looking for what I want.  I take special care to
  24. # ignore comments and pod's.
  25.  
  26. # it would be much better if perl could tell us the proper name of a
  27. # given script.
  28.  
  29. # The filenames to scan are either passed on the command line or if
  30. # that is empty they are passed via stdin.
  31.  
  32. # If there are lines in the file which match the pattern
  33. #      (m/^\s*\$VERSION\s*=\s+/)
  34. # then these are taken to be the version numbers of the modules.
  35. # Special care is taken with a few known idioms for specifying version
  36. # numbers of files under rcs/cvs control.
  37.  
  38. # If there are strings in the file which match the pattern
  39. #     m/^\s*\$RPM_Provides\s*=\s*["'](.*)['"]/i
  40. # then these are treated as additional names which are provided by the
  41. # file and are printed as well.
  42.  
  43. # I plan to rewrite this in C so that perl is not required by RPM at
  44. # build time.
  45.  
  46. # by Ken Estes Mail.com kestes@staff.mail.com
  47.  
  48. if ("@ARGV") {
  49.   foreach (@ARGV) {
  50.     process_file($_);
  51.   }
  52. } else {
  53.  
  54.   # notice we are passed a list of filenames NOT as common in unix the
  55.   # contents of the file.
  56.  
  57.   foreach (<>) {
  58.     process_file($_);
  59.   }
  60. }
  61.  
  62.  
  63. foreach $module (sort keys %require) {
  64.   if (length($require{$module}) == 0) {
  65.     print "perl($module)\n";
  66.   } else {
  67.  
  68.     # I am not using rpm3.0 so I do not want spaces arround my
  69.     # operators. Also I will need to change the processing of the
  70.     # $RPM_* variable when I upgrade.
  71.  
  72.     print "perl($module) = $require{$module}\n";
  73.   }
  74. }
  75.  
  76. exit 0;
  77.  
  78.  
  79.  
  80. sub process_file {
  81.  
  82.   my ($file) = @_;
  83.   chomp $file;
  84.   
  85.   open(FILE, "<$file") || return;
  86.  
  87.   my ($package, $version, $incomment, $inover) = ();
  88.  
  89.   while (<FILE>) {
  90.     
  91.     # skip the documentation
  92.  
  93.     # we should not need to have item in this if statement (it
  94.     # properly belongs in the over/back section) but people do not
  95.     # read the perldoc.
  96.  
  97.     if (m/^=(head[1-4]|pod|item)/) {
  98.       $incomment = 1;
  99.     }
  100.  
  101.     if (m/^=(cut)/) {
  102.       $incomment = 0;
  103.       $inover = 0;
  104.     }
  105.     
  106.     if (m/^=(over)/) {
  107.       $inover = 1;
  108.     }
  109.  
  110.     if (m/^=(back)/) {
  111.       $inover = 0;
  112.     }
  113.  
  114.     if ($incomment || $inover) {
  115.        next;
  116.     }
  117.     
  118.     # skip the data section
  119.     if (m/^__(DATA|END)__$/) {
  120.       last;
  121.     }
  122.  
  123.     # not everyone puts the package name of the file as the first
  124.     # package name so we report all namespaces as if they were
  125.     # provided packages (really ugly).
  126.  
  127.     if (m/^\s*package\s+([_:a-zA-Z0-9]+)\s*;/) {
  128.       $package=$1;
  129.       undef $version;
  130.       $require{$package}=undef;
  131.     }
  132.  
  133.     # after we found the package name take the first assignment to
  134.     # $VERSION as the version number. Exporter requires that the
  135.     # variable be called VERSION so we are safe.
  136.  
  137.     # here are examples of VERSION lines from the perl distribution
  138.  
  139.     #FindBin.pm:$VERSION = $VERSION = sprintf("%d.%02d", q$Revision: 1.9 $ =~ /(\d+)\.(\d+)/);
  140.     #ExtUtils/Install.pm:$VERSION = substr q$Revision: 1.9 $, 10;
  141.     #CGI/Apache.pm:$VERSION = (qw$Revision: 1.9 $)[1];
  142.     #DynaLoader.pm:$VERSION = $VERSION = "1.03";     # avoid typo warning
  143.     # 
  144.     # or with the new "our" pragma you could (read will) see:
  145.     #
  146.     #    our $VERSION = '1.00'
  147.     if (($package) && (m/^\s*(our\s+)?\$VERSION\s*=\s+/)) {
  148.  
  149.       # first see if the version string contains the string
  150.       # '$Revision' this often causes bizzare strings and is the most
  151.       # common method of non static numbering.
  152.  
  153.       if (m/(\$Revision: (\d+[.0-9]+))/) {
  154.     $version= $2; 
  155.       } elsif (m/[\'\"]?(\d+[.0-9]+)[\'\"]?/) {
  156.     
  157.     # look for a static number hard coded in the script
  158.     
  159.     $version= $1; 
  160.       }
  161.       $require{$package}=$version;
  162.     }
  163.   
  164.     # Allow someone to have a variable that defines virtual packages
  165.     # The variable is called $RPM_Provides.  It must be scoped with 
  166.     # "our", but not "local" or "my" (just would not make sense). 
  167.     # 
  168.     # For instance:
  169.     #  
  170.     #     $RPM_Provides = "blah bleah"
  171.     # 
  172.     # Will generate provides for "blah" and "bleah".
  173.     #
  174.     # Each keyword can appear multiple times.  Don't
  175.     #  bother with datastructures to store these strings,
  176.     #  if we need to print it print it now.
  177.     
  178.     if ( m/^\s*(our\s+)?\$RPM_Provides\s*=\s*["'](.*)['"]/i) {
  179.       foreach $_ (split(/\s+/, $2)) {
  180.     print "$_\n";
  181.       }
  182.     }
  183.  
  184.   }
  185.  
  186.   close(FILE) ||
  187.     die("$0: Could not close file: '$file' : $!\n");
  188.  
  189.   return ;
  190. }
  191.