home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 March / PCWELT_3_2006.ISO / base / 05_common.mo / usr / lib / rpm / perldeps.pl < prev    next >
Encoding:
Perl Script  |  2003-10-29  |  4.6 KB  |  212 lines

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use 5.006001;
  4.  
  5. use Getopt::Long;
  6. my ($show_provides, $show_requires, $verbose, @ignores);
  7.  
  8. my $result = GetOptions("provides" => \$show_provides,
  9.             "requires" => \$show_requires,
  10.             "verbose" => \$verbose,
  11.             "ignore=s" => \@ignores);
  12. my %ignores = map { $_ => 1 } @ignores;
  13.  
  14. if (not $result) {
  15.   exit 1;
  16. }
  17.  
  18. my $deps = new DependencyParser;
  19. for my $file (grep /^[^-]/, @ARGV) {
  20.   $deps->process_file($file);
  21. }
  22.  
  23. if ($show_requires) {
  24.   for my $req ($deps->requires) {
  25.     my $verbage = "";
  26.     if (not exists $ignores{$req->to_string}) {
  27.       printf "%s%s\n", $req->to_string, $verbage;
  28.     }
  29.   }
  30. }
  31.  
  32. if ($show_provides) {
  33.   for my $prov ($deps->provides) {
  34.     my $verbage = "";
  35.     if (not exists $ignores{$prov->to_string}) {
  36.       printf "%s%s\n", $prov->to_string, $verbage;
  37.     }
  38.   }
  39. }
  40.  
  41. package Dependency;
  42. sub new {
  43.   my $class = shift;
  44.   my $type = shift;
  45.   my $value = shift;
  46.  
  47.   return bless { type => $type, value => $value }, $class;
  48. }
  49.  
  50. sub value {
  51.   my $self = shift;
  52.  
  53.   if (@_) {
  54.     $self->{value} = shift;
  55.   }
  56.  
  57.   return $self->{value};
  58. }
  59.  
  60. sub filename {
  61.   my $self = shift;
  62.  
  63.   if (@_) {
  64.     $self->{filename} = shift;
  65.   }
  66.  
  67.   return $self->{filename};
  68. }
  69.  
  70. sub type {
  71.   my $self = shift;
  72.  
  73.   if (@_) {
  74.     $self->{type} = shift;
  75.   }
  76.  
  77.   return $self->{type};
  78. }
  79.  
  80. sub line_number {
  81.   my $self = shift;
  82.  
  83.   if (@_) {
  84.     $self->{line_number} = shift;
  85.   }
  86.  
  87.   return $self->{line_number};
  88. }
  89.  
  90. sub to_string {
  91.   my $self = shift;
  92.  
  93.   if ($self->type eq 'perl version') {
  94.     # we need to convert a perl release version to an rpm package
  95.     # version
  96.  
  97.     my $epoch = 0;
  98.     my $version = $self->value;
  99.     $version =~ s/_/./g;
  100.     $version =~ s/0+$//;
  101.  
  102.     if ($version =~ /^5.00[1-5]/) {
  103.       $epoch = 0;
  104.     }
  105.     elsif ($version =~ /^5.006/ or $version =~ /^5.6/) {
  106.       $version =~ s/00//g;
  107.       $epoch = 1;
  108.     }
  109.     elsif ($version =~ /^5.00[7-9]/ or $version =~ /^5.[7-9]/) {
  110.       $version =~ s/00//g;
  111.       $epoch = 2;
  112.     }
  113.     $version =~ s/\.$//;
  114.  
  115.     return sprintf "perl >= %d:%s", $epoch, $version;
  116.   }
  117.   else {
  118.     return sprintf "perl(%s)", $self->value;
  119.   }
  120. }
  121.  
  122. package DependencyParser;
  123. sub new {
  124.   my $class = shift;
  125.   return bless {}, $class;
  126. }
  127.  
  128. sub requires {
  129.   return @{shift->{requires} || []};
  130. }
  131.  
  132. sub provides {
  133.   return @{shift->{provides} || []};
  134. }
  135.  
  136. sub add_provide {
  137.   my $self = shift;
  138.   my %params = @_;
  139.   die "DependencyParser->add_provide requires -filename, -provide, and -type"
  140.     if not exists $params{-filename} or not exists $params{-provide} or not exists $params{-type};
  141.  
  142.   my $dep = new Dependency "provide", $params{-provide};
  143.   $dep->filename($params{-filename});
  144.   $dep->type($params{-type});
  145.   $dep->line_number($params{-line}) if $params{-line};
  146.  
  147.   push @{$self->{provides}}, $dep;
  148. }
  149.  
  150. sub add_require {
  151.   my $self = shift;
  152.   my %params = @_;
  153.   die "DependencyParser->add_require requires -filename, -require, and -type"
  154.     if not exists $params{-filename} or not exists $params{-require} or not exists $params{-type};
  155.  
  156.   my $dep = new Dependency "require", $params{-require};
  157.   $dep->filename($params{-filename});
  158.   $dep->type($params{-type});
  159.   $dep->line_number($params{-line}) if $params{-line};
  160.  
  161.   push @{$self->{requires}}, $dep;
  162. }
  163.  
  164. sub process_file {
  165.   my $self = shift;
  166.   my $filename = shift;
  167.  
  168.   if (not open FH, "<$filename") {
  169.     warn "Can't open $filename: $!";
  170.     return;
  171.   }
  172.  
  173.   while (<FH>) {
  174.     next if m(^=(head1|head2|pod|item)) .. m(^=cut);
  175.     next if m(^=over) .. m(^=back);
  176.     last if m/^__(DATA|END)__$/;
  177.  
  178.     if (m/^\s*package\s+([\w\:]+)\s*;/) {
  179.       $self->add_provide(-filename => $filename, -provide => $1, -type => "package", -line => $.);
  180.     }
  181.     if (m/^\s*use\s+base\s+(.*)/) {
  182.       # recognize the three main forms: literal string, qw//, and
  183.       # qw().  this is incomplete but largely sufficient.
  184.  
  185.       my @module_list;
  186.       my $base_params = $1;
  187.  
  188.       if ($base_params =~ m[qw\((.*)\)]) {
  189.     @module_list = split /\s+/, $1;
  190.       }
  191.       elsif ($base_params =~ m[qw/(.*)/]) {
  192.     @module_list = split /\s+/, $1;
  193.       }
  194.       elsif ($base_params =~ m/(['"])(.*)\1/) { # close '] to unconfuse emacs cperl-mode
  195.     @module_list = ($2);
  196.       }
  197.  
  198.       $self->add_require(-filename => $filename, -require => $_, -type => "base", -line => $.)
  199.          for @module_list;
  200.     }
  201.     elsif (m/^\s*(use|require)\s+(v?[0-9\._]+)/) {
  202.       $self->add_require(-filename => $filename, -require => $2, -type => "perl version", -line => $.);
  203.     }
  204.     elsif (m/^\s*use\s+([\w\:]+)/) {
  205.       $self->add_require(-filename => $filename, -require => $1, -type => "use", -line => $.);
  206.     }
  207.     elsif (m/^require\s+([\w\:]+).*;/) {
  208.       $self->add_require(-filename => $filename, -require => $1, -type => "require", -line => $.);
  209.     }
  210.   }
  211. }
  212.